我正在研究一种应该分析图像并识别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/

10-12 21:15