【问题标题】:Why does Keras not generalize my data?为什么 Keras 不概括我的数据?
【发布时间】:2017-12-18 12:55:26
【问题描述】:

我一直在尝试实现一个基本的多层 LSTM 回归网络来寻找加密货币价格之间的相关性。

在遇到无法使用的训练结果后,我决定尝试一些沙盒代码,以确保在我的完整数据集上再次尝试之前我的想法是正确的。

问题是我无法让 Keras 概括我的数据。

ts = 3
in_dim = 1

data = [i*100 for i in range(10)]

# tried this, didn't accomplish anything 
# data = [(d - np.mean(data))/np.std(data) for d in data]

x = data[:len(data) - 4]
y = data[3:len(data) - 1]

assert(len(x) == len(y))

x = [[_x] for _x in x]
y = [[_y] for _y in y]

x = [x[idx:idx + ts] for idx in range(0, len(x), ts)]
y = [y[idx:idx + ts] for idx in range(0, len(y), ts)]

x = np.asarray(x)
y = np.asarray(y)

x 看起来像这样:

[[[  0]
  [100]
  [200]]

 [[300]
  [400]
  [500]]]

和y:

[[[300]
  [400]
  [500]]

 [[600]
  [700]
  [800]]]

当我使用 非常 相似的数据集进行预测时,这很有效,但当我尝试使用缩放值的相似序列时,这并不能概括

model = Sequential()

model.add(BatchNormalization(
    axis = 1,
    input_shape = (ts, in_dim)))

model.add(LSTM(
    100,
    input_shape = (ts, in_dim),
    return_sequences = True))

model.add(TimeDistributed(Dense(in_dim)))
model.add(Activation('linear'))
model.compile(loss = 'mse', optimizer = 'rmsprop')

model.fit(x, y, epochs = 2000, verbose = 0)

p = np.asarray([[[10],[20],[30]]])
prediction = model.predict(p)
print(prediction)

打印

[[[ 165.78544617]
  [ 209.34489441]
  [ 216.02174377]]]

我想要

[[[ 40.0000]
  [ 50.0000]
  [ 60.0000]]]

我怎样才能格式化这个,以便当我插入一个具有完全不同比例的值的序列时,网络仍然会输出它的预测值?我已经尝试标准化我的训练数据,但结果仍然完全无法使用。

我在这里做错了什么?

【问题讨论】:

  • 我还发现这个关于使用 LSTM 对单变量数据进行自回归的讨论很有用:machinelearningmastery.com/… - 不能说它完全回答了我的问题,但它提供了一些关于 LSTM 有时如何失败的见解不辜负时间序列预测的期望。
  • 你高估了深度学习的力量。您只给它 100 的倍数作为输入,并期望它也能泛化为 10 的倍数。因为 10 不是特殊数字,所以这种迁移学习通常也适用于任何数字的倍数。但是你的模型应该如何知道这是它应该做的任务呢?您的训练数据绝不会说明这一点。该任务也可以是简单地将 100 添加到当前时间步的输入。为了能够泛化,需要给模型训练数据包含泛化的例子。

标签: machine-learning tensorflow keras lstm recurrent-neural-network


【解决方案1】:

如何在发送到 LSTM 之前转换输入数据,使用 sklearn.preprocessing.StandardScaler 之类的东西?预测后你可以调用 scaler.inverse_transform(prediction)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2019-08-27
    • 2017-08-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多