如何在 CNN 中获得高精度?

数据挖掘 神经网络 深度学习 喀拉斯 张量流 美国有线电视新闻网
2022-02-19 23:00:01

机器学习和数据科学世界。

我是 CNN 的新手,但对 ML 和神经网络有基本的了解。

我想创建我自己的适用于猫狗数据集的 CNN。我对数据进行了预处理并建立了我的网络,但是当我用数据拟合模型时,我无法获得超过 55% 的准确率,这意味着模型没有学习任何东西。

谁能解释我在这里做错了什么?

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3),padding='SAME', input_shape=X[0].shape))

model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))

model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.4))

model.add(Conv2D(filters=128, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.35))

#model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
#model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(rate=0.3))

model.add(Dense(2))
model.add(Activation('softmax'))

这是优化器部分:

opt = keras.optimizers.SGD(lr=0.0001, decay=0.0)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics['accuracy'])
print(model.summary())

model.fit(X, np.array(Y), validation_data=(test_x, np.array(test_y)), epochs=30, verbose=2)

在过去的两天里,我一直坚持这一点。任何和所有的帮助表示赞赏。

谢谢。

4个回答

在池化之前添加多个层会增加特征提取,当类别/类超过2个时使用softmax函数,尝试使用sigmoid函数,

此外,数据增强将帮助您调整超参数(倾斜、宽度偏移、剪切、旋转等)。浏览文档。

试试这段代码,如果 RMSprop 的准确性较低,试试亚当,

model = Sequential()
model.add(Conv2D(32, 3, 3, border_mode='same', input_shape=input_shape, activation='relu'))
model.add(Conv2D(32, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(128, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))    
model.compile(loss='binary_crossentropy',optimizer=RMSprop(lr=0.0001),metrics=['accuracy'])

我有一些建议可以提高你的准确性(这些对我来说几乎不是原创的):

  1. 使用ImageDataGeneratorfromkeras.preprocessing.image来扩充您的数据。
  2. 使用 k 折验证更彻底地使用您的训练数据。
  3. 试试keras.optimizers.Adam()优化器。

您可以查看这篇很棒的文章链接我想你会得到很好的直觉。尽管此链接为您提供了改进整体模型的非常笼统的想法,但对于将来构建良好的模型将有很大帮助。

是在 Udacity 课程中检查的相同数据集。根据您的代码,您可以尝试以下操作:

您的输出是 softmax 分类,因此您可能想尝试将稀疏分类交叉熵作为输出而不是二元交叉熵。

此外,与默认参数相比,您使用学习率低得多的 SGD 是否有原因?如前所述,尝试使用默认设置的亚当优化器。

最后,您还可以为卷积层尝试不同的填充。