【发布时间】: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())
正如论文所建议的,我已经使用 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