python - LSTM 奇偶校验生成器

标签 python tensorflow neural-network keras lstm

我正在尝试学习深度学习,我偶然发现了一个练习 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_crossentropyepochs=10。那么好吧 - 如果我们完美地解决了这个任务 - 那么我们也解决了最初的任务。好吧 - 在我提供的设置的 10 次运行中,我观察到了以下行为 - 前几个时期模型的准确率饱和在 50% 左右 - 然后突然下降到 99% 的准确率。

为什么会发生这种情况?

嗯 - 在 LSTM 中,参数的最佳位置是内存细胞动态和正常激事件态之间的同步。很多时候,人们应该等待很长时间才能得到这样的行为。此外 - 架构需要足够才能捕获有值(value)的依赖项。在行为改变中,我们为网络提供了更多的见解,从而可以更快地训练网络。尽管如此 - 找到最佳位置仍需要一些时间。

为什么您的网络失败?

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

关于python - LSTM 奇偶校验生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48666843/

相关文章:

python - 如何合并一维和二维张量?

jquery - 通过flask中的查询字符串获取表单数据

python - 检测 wnck python 中窗口何时打开

python - keras 和 tf.keras 中的 ResNet 模型对同一图像给出不同的输出

machine-learning - 机器学习: Unsupervised Backpropagation

machine-learning - 如何训练具有不同大小输入的神经网络?

java - sigmoid 的单神经元 delta 规则收敛

python - 如何访问在 Amazon ec2 上运行的 Django 应用程序?

python - pandas 数据框中的值之间的比较

python - 如何在keras中将每个纪元摘要存储在变量中?