我正在尝试学习深度学习,我偶然发现了一个练习 here
这是第一个热身运动。我被困住了。对于小长度(2,3)的恒定序列,它解决它没有问题。然而,当我尝试 50 的整个序列时,它会停止在 50% 的准确度,这基本上是随机猜测。
根据here它太大了,平坦的空间 Ant 无法找到梯度来解决它。所以我尝试了每次不断增加长度并保存模型的方法(2,5,10,15,20,30,40,50)。它似乎不能很好地概括,就好像我输入的序列比我学到的序列更大上,失败。
根据here这应该是一个简单的问题。我想不通。这里使用了一些不同的 LSTM 架构悬停器。
还有一个解决方案 here对于完全相同的问题,它适用于 Adagrad 优化器,学习率为 0.5。
我有时不确定我是否一开始就喂对了。我希望我做对了。
对于可变长度,我尝试过但惨败。
代码:
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, LSTM
from keras.optimizers import SGD, Adagrad, Adadelta
from keras.callbacks import TensorBoard
from keras.models import load_model
import numpy as np
import time
import os.path
# building the model
def build_model():
model = Sequential()
model.add(LSTM(
32,
input_shape=(None, 1),
return_sequences=False))
model.add(Dropout(0.1))
model.add(Dense(
1))
model.add(Activation("sigmoid"))
return model
# generating random data
def generate_data(num_points, seq_length):
#seq_rand = np.random.randint(1,12)
x = np.random.randint(2, size=(num_points, seq_length, 1))
y = x.sum(axis=1) % 2
return x, y
X, y = generate_data(100000, 50)
X_test, y_test = generate_data(1000, 50)
tensorboard = TensorBoard(log_dir='./logs', histogram_freq=0,
write_graph=True, write_images=False)
if os.path.isfile('model.h5'):
model = load_model('model.h5')
else:
model = build_model()
opti = Adagrad(lr=0.5)
model.compile(loss="mse", optimizer=opti, metrics=['binary_accuracy'])
model.fit(
X, y,
batch_size=10, callbacks=[tensorboard],
epochs=5)
score = model.evaluate(X_test, y_test,
batch_size=1,
verbose=1)
print('Test score:', score)
print('Model saved')
model.save('model.h5')
我现在很困惑。感谢您的回复!
编辑:将先前实验中的 return_sequences 修复为 False 拼写错误。
最佳答案
嗯,这可能是关于 LSTM 和消失梯度的非常有值(value)的练习。那么让我们深入探讨一下。我会从稍微改变任务开始。让我们将数据集更改为:
def generate_data(num_points, seq_length):
#seq_rand = np.random.randint(1,12)
x = np.random.randint(2, size=(num_points, seq_length, 1))
y = x.cumsum(axis=1) % 2
return x, y
通过设置return_sequences=True
进行建模,将损失更改为binary_crossentropy
和epochs=10
。那么好吧 - 如果我们完美地解决了这个任务 - 那么我们也解决了最初的任务。好吧 - 在我提供的设置的 10 次运行中,我观察到了以下行为 - 前几个时期模型的准确率饱和在 50% 左右 - 然后突然下降到 99% 的准确率。
为什么会发生这种情况?
嗯 - 在 LSTM 中,参数的最佳位置是内存细胞动态和正常激事件态之间的同步。很多时候,人们应该等待很长时间才能得到这样的行为。此外 - 架构需要足够才能捕获有值(value)的依赖项。在行为改变中,我们为网络提供了更多的见解,从而可以更快地训练网络。尽管如此 - 找到最佳位置仍需要一些时间。
为什么您的网络失败?
消失的梯度问题和问题复杂性 - 如果在计算序列结束时仅获得单个信号,则完全不明显网络应该提取什么信息。这就是为什么它需要我提供的形式(cumsum
)的监督,或者需要大量的时间和运气才能最终找到自己的甜蜜停留。
关于python - LSTM 奇偶校验生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48666843/