gpt4 book ai didi

python - CNN 后跟用于签名验证的 RNN 的训练和测试准确性不会增加

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:11 25 4
gpt4 key购买 nike

我目前正在从事在线签名验证。数据集具有 (x, 7) 的可变形状,其中 x 是一个人用来签名的点数。我有以下模型:

    model = Sequential()
#CNN
model.add(Conv1D(filters=64, kernel_size=3, activation='sigmoid', input_shape=(None, 7)))
model.add(MaxPooling1D(pool_size=3))
model.add(Conv1D(filters=64, kernel_size=2, activation='sigmoid'))

#RNN
model.add(Masking(mask_value=0.0))
model.add(LSTM(8))
model.add(Dense(2, activation='softmax'))

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

print(model.fit(x_train, y_train, epochs=100, verbose=2, batch_size=50))

score, accuracy = model.evaluate(x_test,y_test, verbose=2)
print(score, accuracy)

我知道它可能不是最好的模型,但这是我第一次构建神经网络。我必须使用 CNN 和 RNN,因为这是我的荣誉项目所必需的。目前,我达到了 0.5142 作为最高训练精度和 0.54 测试精度。我试过增加 epoch 的数量、改变激活函数、添加更多层、移动层、改变学习率和改变优化器。

请分享一些关于更改我的模型或数据集的建议。任何帮助深表感谢。

最佳答案

对于 CNN-RNN,一些有前途的尝试:

  • Conv1D 层:activation='relu' , kernel_initializer='he_normal'
  • LSTM 层:activation='tanh' , 和 recurrent_dropout=.1, .2, .3
  • 优化器:Nadam , lr=2e-4 (Nadam 可能明显优于所有其他 RNN 优化器)
  • batch_size:降低它。除非你总共有 200 多个批处理,否则设置 batch_size=32 ;较低的批量大小可以更好地利用优化器的随机机制,并可以提高泛化能力
  • Dropout:紧随第二 Conv1D , 率 .1, .2 - 或者,在第一个 Conv1D 之后, 率 .25, .3 ,但如果您使用 SqueezeExcite(见下文),否则 MaxPooling效果不佳
  • SqueezeExcite :显示可增强 CNN 在各种任务中的性能;您可以在下面使用 Keras 实现
  • BatchNormalization:虽然您的模型不大,但它仍然很深,并且可能会在第二个之后受益于一个 BN 层 Conv1D
  • L2 权重衰减:第一个 Conv1D , 以防止它记住输入;尝试 1e-5, 1e-4 ,例如kernel_regularizer=l2(1e-4) # from keras.regularizers import l2
  • 预处理:确保所有数据都经过规范化(如果是时间序列,则进行标准化),并且每个时期都对批处理进行打乱处理
def SqueezeExcite(_input):
filters = _input._keras_shape[-1]

se = GlobalAveragePooling1D()(_input)
se = Reshape((1, filters))(se)
se = Dense(filters//16,activation='relu',
kernel_initializer='he_normal', use_bias=False)(se)
se = Dense(filters, activation='sigmoid',
kernel_initializer='he_normal', use_bias=False)(se)

return multiply([_input, se])
# Example usage
x = Conv1D(filters=64, kernel_size=4, activation='relu', kernel_initializer='he_normal')(x)
x = SqueezeExcite(x) # place after EACH Conv1D

关于python - CNN 后跟用于签名验证的 RNN 的训练和测试准确性不会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58043002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com