【问题标题】:LSTM parity generatorLSTM 奇偶校验生成器
【发布时间】:2018-02-07 14:57:44
【问题描述】:

我正在尝试学习深度学习,我偶然发现了一个练习here

这是第一次热身运动。我被困住了。对于小长度(2,3)的恒定序列,它没有问题。但是,当我尝试 50 的整个序列时,它会以 50% 的准确率停止,这基本上是随机猜测。

根据here 太平空间蚂蚁找不到梯度来解决。所以我尝试了不断增加长度和每次保存模型的方法(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 拼写错误。

【问题讨论】:

  • 您确定您的代码有效吗?不应该在那里return_sequences=False?
  • 你说得对,我有两个 LSTM 层,第二个被删除,忘记重写 return_sequences。现在它运行良好。问题仍然存在。
  • 你的损失是否在0.69附近饱和?
  • 如果我选择 loss='binary_crossentropy',它确实会在 0.69 左右饱和。当我使用 loss='mse' 时,如图所示,它在 0.25 处饱和。我认为这是用不同的方式说同样的话。
  • 是的 - 它只是不断预测0 - 你可以很容易地检查:)

标签: python tensorflow neural-network keras lstm


【解决方案1】:

嗯,这可能是一个关于LSTM 和梯度消失的非常有价值的练习。因此,让我们深入研究一下。我会从改变任务开始。让我们将数据集更改为:

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 次运行中,我观察到以下行为 - 在最初的几个 epoch 中,模型的准确率达到了 50% 左右 - 然后突然下降到 99% 的准确率。

为什么会这样?

嗯 - 在LSTM 中,参数的最佳点是记忆细胞动力学和正常激活动力学之间的同步。很多时候,人们应该等待很长时间才能获得这种行为。此外 - 架构需要足以捕捉有价值的依赖关系。在改变行为中——我们正在为网络提供更多的洞察力,这要归功于它可以更快地训练。仍然 - 需要一些时间才能找到最佳位置。

为什么您的网络出现故障?

梯度消失问题和问题复杂性 - 如果信息网络在计算序列结束时仅获得单个信号,则完全不清楚应该提取什么信息。这就是为什么它需要以我提供的形式(cumsum)进行监督,或者需要大量的时间和运气才能最终自己找到一个甜蜜的停止点。

【讨论】:

  • 谢谢!当我从 sum 更改为 cumsum 时,它解决了问题,因为它看到了生成的整个过程而不是只看到结果。现在我努力使用可变长度来开始工作,因为它只接受输入张量。怎么可能实现呢?一种方法是 batch_size 并在迭代中调用 fit,但这非常慢。另一种方法是掩蔽,但如何?我不能用 0 屏蔽,因为它带有信息。
  • 我什至用掩蔽层和 2 作为掩码解决了可变序列 - 它不会改变奇偶校验的结果。它没有学习任何问题,然后能够采用任意序列长度。它似乎学得很好,因为它能够正确预测 1000 的序列。更多我没有测试。谢谢提示!
猜你喜欢
  • 2016-10-19
  • 2012-04-20
  • 2015-06-29
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2013-04-21
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多