Python 克朗中的CTC损失没有减少

Python 克朗中的CTC损失没有减少,python,deep-learning,keras,handwriting-recognition,Python,Deep Learning,Keras,Handwriting Recognition,我正在使用Keras和theano后端来解决本文中解决的在线手写识别问题: 我遵循Keras图像ocr示例,修改了在线手写样本的代码,而不是图像样本。在使用200个历元的842行文本数据集(每个历元需要约6分钟)进行训练时,CTC日志损失在第一个历元之后降低,但在所有剩余历元中保持不变。我也尝试过使用不同的优化器(sgd、adam、ADADDelta)和学习率(0.01,0.1,0.2),但损失几乎没有任何变化 x_train.shape=(8421263,4)[842行文字,1263个笔划点,

我正在使用Keras和theano后端来解决本文中解决的在线手写识别问题:

我遵循Keras图像ocr示例,修改了在线手写样本的代码,而不是图像样本。在使用200个历元的842行文本数据集(每个历元需要约6分钟)进行训练时,CTC日志损失在第一个历元之后降低,但在所有剩余历元中保持不变。我也尝试过使用不同的优化器(sgd、adam、ADADDelta)和学习率(0.01,0.1,0.2),但损失几乎没有任何变化

x_train.shape=(8421263,4)[842行文字,1263个笔划点,4维]

y_train.shape=(842,64)[842行文字,每行最多64个字符]

标签类型(len_字母)=66

代码快照:

size=x_train.shape[0]
trainable=True
inputs = Input(name='the_input', shape=x_train.shape[1:], dtype='float32')
rnn_encoded = Bidirectional(GRU(64, return_sequences=True),
                            name='bidirectional_1',
                            merge_mode='concat',trainable=trainable)(inputs)
birnn_encoded = Bidirectional(GRU(64, return_sequences=True),
                            name='bidirectional_2',
                            merge_mode='concat',trainable=trainable)(rnn_encoded)

output = TimeDistributed(Dense(66, activation='softmax'))(birnn_encoded)
y_pred = Activation('softmax', name='softmax')(output)
labels = Input(name='the_labels', shape=[max_len], dtype='int32')
input_length = Input(name='input_length', shape=[1], dtype='int64')
label_length = Input(name='label_length', shape=[1], dtype='int64')
loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name='ctc')([y_pred,labels, input_length, label_length])
model = Model(inputs=[inputs, labels, input_length, label_length], outputs=loss_out)
model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer='Adadelta')
absolute_max_string_len=max_len
blank_label=len(alphabet)+1
labels = np.ones([size, absolute_max_string_len])
input_length = np.zeros([size, 1])
label_length = np.zeros([size, 1])
source_str = []
for i in range (x_train.shape[0]):
    labels[i, :] = y_train[i]
    input_length[i] = x_train.shape[1]
    label_length[i] =len(y_train[i])
    source_str.append('')
inputs_again = {'the_input': x_train,
              'the_labels': labels,
              'input_length': input_length,
              'label_length': label_length,
              'source_str': source_str  # used for visualization only
              }
outputs = {'ctc': np.zeros([size])} 
model.fit(inputs_again, outputs, epochs=200,batch_size=25)
我的完整代码位于此处: 以下是模型和培训的截图:

如果需要修改模型架构,请建议使用其他优化器解决此问题,或者使用其他方法解决此问题。
谢谢

我能够通过改变网络结构使其工作:2层,每个层有128个和64个神经元。损失减少,在短短10个时期内迅速下降后,以某种方式变成负值!实际上我也有一个类似的问题,我的模型并没有达到低损耗。它发现了一些类似于局部极小值的东西(收敛到所有空白符号)。。。知道如何解决吗?根据您的模型和数据,可能有不同的解决方案:数据规范化、提高学习率、隐藏层/单元、尝试不同的激活函数和优化算法。