使用Tensorflow数据集时模型精度不增加



我正在尝试使用tensorflow数据集对狗和猫的图像进行分类,但是无论我运行多少个时期,我的损失和准确性似乎都没有改变。

import tensorflow_datasets as tfds
import tensorflow as tf
dataset_name = 'cats_vs_dogs'
dataset, info= tfds.load(name=dataset_name, split=tfds.Split.TRAIN, with_info=True)

def preprocess(features):
print(features['image'], features['label'])
image = tf.image.resize(features['image'], [224,224])
image = tf.divide(image, 255)
print(image)
label = features['label']
print(label)
return image, label
def solution_model():
train_dataset = dataset.map(preprocess).batch(32)
model = tf.keras.Sequential( 
[
tf.keras.layers.Conv2D(16, (3, 3), input_shape=(224, 224, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1, activation='softmax')
]
)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
history = model.fit(train_dataset, epochs=100, verbose= 2)
return model

if __name__ == '__main__':
model = solution_model()
model.save("mymodel.h5")

无论我运行多少次,我都会得到相同的结果。我只是得到相同的结果:

Epoch 1/100
727/727 - 51s - loss: 7.6423 - accuracy: 0.4988
Epoch 2/100
727/727 - 51s - loss: 7.6423 - accuracy: 0.4988
Epoch 3/100
727/727 - 51s - loss: 7.6423 - accuracy: 0.4988

这个问题与TensorFlow数据集的使用无关,而是与网络末端使用softmax层有关。

网络的输出形状是单个标量(0 表示猫,1 表示狗(。在标量上使用softmax使其始终变为1,因此您的损失和准确性被卡住了:无论输入如何,您始终预测1。

相反,您可能应该使用与您的用例更匹配的简单 sigmoid,并将 softmax 保留在输出形状不是单个标量的情况下(例如,对于独热编码目标(。

下面修改了代码(我测试了它,它学到了一些东西(:

import tensorflow_datasets as tfds
import tensorflow as tf
dataset_name = 'cats_vs_dogs'
dataset, info= tfds.load(name=dataset_name, split=tfds.Split.TRAIN, with_info=True)

def preprocess(features):
print(features['image'], features['label'])
image = tf.image.resize(features['image'], [224,224])
image = tf.divide(image, 255)
print(image)
label = features['label']
print(label)
return image, tf.cast(label, tf.float32)
def solution_model():
train_dataset = dataset.map(preprocess).batch(32)
model = tf.keras.Sequential( 
[
tf.keras.layers.Conv2D(16, (3, 3), input_shape=(224, 224, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.MaxPool2D(2, 2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024, activation='sigmoid'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1, activation='sigmoid')
]
)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
history = model.fit(train_dataset, epochs=100, verbose=1)
return model

if __name__ == '__main__':
model = solution_model()
model.save("mymodel.h5")

最新更新