Python CNN和RNN用于签名验证的培训和测试精度不增加

Python CNN和RNN用于签名验证的培训和测试精度不增加,python,keras,conv-neural-network,recurrent-neural-network,Python,Keras,Conv Neural Network,Recurrent Neural Network,我目前正在进行在线签名验证。数据集有一个可变形状(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

我目前正在进行在线签名验证。数据集有一个可变形状(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。我尝试过增加历代的数量,改变激活函数,增加更多的层,移动层,改变学习速度和改变优化器


请分享一些关于更改我的模型或数据集的建议。非常感谢您的帮助

对于CNN-RNN,可以尝试一些有希望的事情:

  • Conv1D层
    activation='relu'
    kernel\u初始化器='he\u normal'
  • LSTM层
    activation='tanh'
    ,和
    recurrent_dropout=.1、.2、.3
  • 优化器
    Nadam
    lr=2e-4
    (Nadam可能会显著优于RNN的所有其他优化器)
  • 批量大小:将其降低。除非您总共有200多个批次,否则设置
    batch_size=32
    ;较小的批量可以更好地利用优化器的随机机制,提高泛化能力
  • 退出:在第二次
    Conv1D
    之后,速率为
    .1、.2
    ——或者在第一次
    Conv1D
    之后,速率为
    .25、.3
    ,但只有使用挤压激励(见下文),否则
    MaxPooling
    将无法正常工作
  • :显示可提高CNN在各种任务中的所有性能;您可以在下面使用Keras实现
  • BatchNormalization:虽然您的模型不大,但它仍然很深,并且可能在第二次
    Conv1D
  • L2权重衰减:在第一个
    Conv1D
    ,以防止其记忆输入;尝试
    1e-5、1e-4
    ,例如从keras导入内核正则化器=l2(1e-4)。正则化器导入l2
  • 预处理:确保所有数据都已标准化(如果是时间序列,则为标准化),并且批次在每个历元中都被洗牌

谢谢你的帮助。我已经实现了上面所有的功能(除了screezeexite,因为我在理解该做什么时遇到了问题)。但我仍然有相同的结果。@AbigailLeahSingh您的完整列车数据集大小和完整验证数据集大小是多少?我使用的是SVC数据集。这不是一个很大的数据集;只有1200个签名,因此我只将其分为训练集和测试集。我已经将它们分成60-40、70-30和75-25三部分,以获得结果。@AbigailLeahSingh 1200个签名,因此每个“签名”的形状都是
(1,7)
,对吗?如果是这样的话,你的数据集对于深度学习来说太小了——你最好使用“浅”的方法,比如支持向量机(或者获取更大的数据集)如果您坚持,请显著减小模型大小,这样您就不会有超过10000个参数。另外,我建议使用过顺序的,因为它更灵活、更直观——上面的
SqueezeExcite
就是为它编写的。每个签名都有一个(n,7)的形状,因为每个人每个签名都有n个点。这就是我使用变量输入(None,7)的原因。我可以使用另一个数据集:SigComp2009,每个签名都有形状(n,5)。它有1906个签名的训练集和1552个签名的测试集。如果我使用这个数据集,它会更有效吗?
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