LSTM奇偶校验发生器

时间:2018-02-07 14:57:45

标签: python tensorflow neural-network keras lstm

我正在努力学习深度学习,我偶然发现了一项练习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。

1 个答案:

答案 0 :(得分: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_crossentropyepochs=10。好吧 - 如果我们完美地解决这个问题 - 那么我们也会解决初始任务。好吧 - 在我提供的10次设置中,有10次我观察到以下行为 - 前几个时期的模型饱和度大约为50% - 然后突然降低到99%的准确度。

为什么会这样?

嗯 - 在LSTM中,参数的最佳点是记忆细胞动力学和正常激活动力学之间的同步。通常,人们应该等待很长时间才能获得这样的行为。而且 - 体系结构需要足以捕获有价值的依赖关系。在改变的行为中 - 我们为网络提供了更多的见解,因此可以更快地训练它。仍然 - 找到最佳位置需要一些时间。

为什么您的网络失败了?

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