我正在研究一种应该分析图像并识别5种可能物体的AI。我正在python中使用tf.keras,在以前的项目中效果很好,但是对于这个项目,无论我训练了多长时间,它都能给出随机结果(5个可能的输出精度为20%)。
5个可能的对象是:
-四足动物
-赫曼数字
-飞机
-卡车
- 汽车
之前,我尝试使用完全连接的神经网络,使用完全相同的数据集,并且经过10分钟的训练,它的准确率约为50%。我的目标是达到90%的准确性,这就是为什么我尝试使用CNN的原因。
我还使用mnist数据集玩了一点,并使用tf.keras制作了一个可以识别手写数字的cnn。我尝试使用相同的keras模型,但失败了。我尝试了不同的模型,但所有模型均未给出非随机预测。
这是我的keras模型:
import tensorflow as tf
layers = tf.keras.layers
model = tf.keras.models.Sequential([
layers.Conv2D(16, (3, 3), input_shape=(80, 80, 1), activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(32, (3, 3), activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Dropout(0.2),
layers.Flatten(),
layers.Dense(512, activation=tf.nn.relu),
layers.Dense(5, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
我正在用这段代码对其进行训练:
x, y = self.load_data(input("File containg train files: "), input("File containg labels files: ")) # function that takes a .mat file and return an array of shape (29160, 1, 80, 80)
x = x.reshape(total_data_number, 80, 80, 1)
x = x.astype('float32')
x /= 255.0
epoch = 15
model.fit(x, y, batch_size=50, epochs=epoch, verbose=1)
完全连接的模型是这样的:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(80, 80, 1)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(5, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
精度应该远高于20%,并且在训练模型时应该提高。
最佳答案
您的某些问题可能来自您正在使用sparse_categorical_crossentropy
的事实,而您的输出是一个one_hot_encoded向量。因此,您应该改用categorical_crossentropy
。 (基本说明here)
关于python - CNN给出随机答案,而完全连接的神经网络效果很好,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57141521/