我对NN很新,我自己做了#34; Hello World"使用LSTM而不是复制某些东西。我选择了一个简单的逻辑如下:
输入3次步。第一个是1或0,另外2个是随机数。预期输出与输入的第一个时间步长相同。数据Feed如下所示:
_X0=[1,5,9] _Y0=[1] _X1=[0,5,9] _Y1=[0] ... 200 more records like this.
这种简单的(?)逻辑可以100%准确度进行训练。我运行了很多测试,我找到的最有效的模型是3个LSTM层,每个层有15个隐藏单元。这在22个时期后恢复了100%的准确性。
然而,我注意到了一些我难以理解的东西:在前12个时代,模型没有任何进展,根据准确度来衡量(acc。保持0.5),并且只有按分类Crossentropy测量的边际进度(从0.69到0.65) 。然后从第12纪元到第22纪元,它以非常快的速度训练到精度1.0。问题是:为什么训练会像这样发生?为什么前12个时代没有取得进展?为什么12-22这个时代的效率更高?
这是我的整个代码:
from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, LSTM
from keras.models import Model
import helper
from keras.utils.np_utils import to_categorical
x_,y_ = helper.rnn_csv_toXY("LSTM_hello.csv",3,"target")
y_binary = to_categorical(y_)
model = Sequential()
model.add(LSTM(15, input_shape=(3,1),return_sequences=True))
model.add(LSTM(15,return_sequences=True))
model.add(LSTM(15, return_sequences=False))
model.add(Dense(2, activation='softmax', kernel_initializer='RandomUniform'))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc'])
model.fit(x_, y_binary, epochs=100)
答案 0 :(得分:1)
很难给出具体答案,因为它取决于很多因素。在训练神经网络时发挥作用的一个主要因素是您选择的优化器的学习率。
在您的代码中,您没有特定的学习率设置。在Keras 2.0.3中,Adam的默认学习率为0.001。 Adam根据初始学习率(0.001)和当前时间步长使用动态学习率lr_t
,定义为
lr_t = lr * (sqrt(1. - beta_2**t) / (1. - beta_1**t)) .
beta_2
和beta_1
的值通常分别保留为默认值0.999
和0.9
。如果你绘制这个学习率,你会得到这样的图片:
可能只是因为这是更新权重以找到本地(可能是全局)最小值的最佳位置。过高的学习率通常不会产生任何差别,只是“跳过”。在可以降低错误的区域,而较低的学习率会在错误环境中占据较小的一步,并让您找到错误较低的区域。
我建议你使用一个假设较少的优化器,例如随机梯度下降(SGD),你可以用较低的学习率测试这个假设。