【问题标题】:Getting Terrible Accuracy on CNN Model that I am Basing on a Research Paper: ~ 5%在我基于研究论文的 CNN 模型上获得可怕的准确性:~ 5%
【发布时间】:2021-10-12 05:57:46
【问题描述】:

我正在关注research paper,尝试使用 Tensorflow 和 Keras 实现他们提出的模型。

这里是数据集的概述:

  • 总共 92,000 张梵文字母和数字图像
    • 78,200 张总训练图像
    • 总共 13,800 张测试图像
  • 类数:46

这是研究论文中提出的模型:model

这是我对模型的 keras 实现:

INPUT_SHAPE = (32, 32, 1)

activation = 'relu'
model = Sequential()

model.add(Conv2D(filters=4, kernel_size=(5, 5), activation=activation, padding='valid', input_shape=INPUT_SHAPE))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))

model.add(Conv2D(filters=12, kernel_size=(5, 5), activation=activation, padding='valid'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))

model.add(Flatten())

model.add(Dense(256, activation=activation))
model.add(Dropout(0.5))
model.add(Dense(46, activation=activation))

opt = SGD(learning_rate=0.005, momentum=0.9)

model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
print(model.summary())

my model output

正如论文所建议的,我已经使用 keras 实现了数据增强,以创建我的训练和验证生成器:

from keras.preprocessing.image import ImageDataGenerator

batch_size = 200

train_datagen = ImageDataGenerator(rescale=1./255,  # normalization
                                   rotation_range=50,  # rotation
                                   width_shift_range=0.2,  # random crop
                                   height_shift_range=0.2,  # random crop
                                   shear_range=0.8,  # random manipulation
                                   zoom_range=0.2,  # zooming in 
                                   fill_mode='constant',  # to fill with constant padding 
                                   horizontal_flip=True)  # mirroring 

train_generator = train_datagen.flow_from_directory(
        '/content/Dataset/DevanagariHandwrittenCharacterDataset/Train',
        target_size=(32, 32),
        batch_size=batch_size,
        class_mode='categorical',
        color_mode='grayscale')

test_datagen = ImageDataGenerator(rescale=1./255)

validation_generator = test_datagen.flow_from_directory(
        '/content/Dataset/DevanagariHandwrittenCharacterDataset/Test',
        target_size=(32, 32),
        batch_size=batch_size,
        class_mode='categorical',
        color_mode='grayscale')

大部分超参数(例如 mini-batch 大小、内核大小、过滤器、优化器选择、epoch 数、Dropout 率和步幅)都是从提供的论文中借用的。

最后,这是我的模型拟合代码:

history = model.fit(
        x=train_generator,
        validation_data=validation_generator,
        steps_per_epoch=78200 // batch_size,  
        validation_steps=13800 // batch_size,
        epochs=50)

为什么我的训练和验证准确度指标停滞在 0.05 左右?我怀疑我的实现或我忽略的某些部分存在根本性错误。有人可以指导我正确的方向吗?

【问题讨论】:

  • 输出层应该使用 softmax 激活,而不是 ReLU。
  • 正如@Dr.Snoopy 所说。
  • @Dr.Snoopy 感谢您的评论!我本来打算使用 softmax,但后来注意到研究论文中的这一行:“全连接层通过像在传统前馈网络中那样应用非线性来对输入进行建模。使用的非线性类型是 ReLU 非线性。” (第 3 页)。不管怎样,现在,我正在用 softmax 重新训练我的网络,结果看起来已经好多了!
  • @hapakalahdohnut 您可以在除最后一个分类层之外的任何地方应用 relu,但对于分类层,您必须应用 softmax 否则您必须使用默认激活并更改您的损失函数参数 @987654328 @.

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

请检查最后一层的激活fn。使用 Softmax

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多