为了账号安全,请及时绑定邮箱和手机立即绑定

Keras GRU 模型仅预测 [-0., -0., -0., -0., -0.]

Keras GRU 模型仅预测 [-0., -0., -0., -0., -0.]

哆啦的时光机 2021-05-30 03:45:23
我试图根据之前的 50 个输入预测加密货币的 5 个周期价格。>>> X_train.shape, X_test.shape, Y_train.shape, Y_test.shape((291314, 50, 8), (72829, 50, 8), (291314, 5), (72829, 5))在这里,我有50个先前的样本x 8个特征作为输入样本,接下来5个时期的价格作为输出我使用以下代码构建模型:from tensorflow.keras.layers import GRUfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, Activationmodel = Sequential()model.add(GRU(units=50, input_shape=X_train.shape[1:], return_sequences=False))model.add(Activation('tanh'))model.add(Dropout(0.2))model.add(Dense(NFS))model.add(Activation('relu'))model.compile(loss='mse', optimizer='adam')model.fit(X_train, Y_train, batch_size=50, validation_data=(X_test, Y_test), epochs=2)这给了我输出:Train on 291314 samples, validate on 72829 samplesEpoch 1/2291314/291314 [==============================] - 487s 2ms/step - loss: 0.0107 - val_loss: 0.2502Epoch 2/2291314/291314 [==============================] - 463 2ms/step - loss: 0.0103 - val_loss: 0.2502在此步骤之后,我尝试预测X_test的输出,但没有预测,而是得到了形状正确但充满零的矩阵,而不是任何预测:>>> model.predict(X_test)array([[-0., -0., -0., -0., -0.],       [-0., -0., -0., -0., -0.],       [-0., -0., -0., -0., -0.],       ...,       [-0., -0., -0., -0., -0.],       [-0., -0., -0., -0., -0.],       [-0., -0., -0., -0., -0.]], dtype=float32)为什么我会变得这么糟糕?我是否使用正确的方式做我想做的事?UPD:这是完整的笔记本。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

好吧,我认为@blue-phoenox 的答案中建议的规范化方案是有缺陷的。那是因为你永远不应该独立地标准化测试数据(即使用不同的统计数据)。相反,您应该使用在训练数据标准化期间计算的统计数据来标准化测试数据。所以它必须是这样的:


mms = preprocessing.MinMaxScaler()

X_train = mms.fit_transform(X_train)

X_test = mms.transform(X_test) # you should not use fit_transform

这是有道理的,因为考虑以下场景,您已经训练了模型并将其部署到生产中以供实际使用。现在,用户使用一个新样本来喂食它。您需要首先标准化这个新样本,但如何标准化?您不能单独缩放其值,因为它只是一个样本(即,如果使用最小-最大缩放器,则所有这些值将为1或0)。相反,您将使用(在使用 min-max 缩放器的情况下)在训练数据上计算的“min”和“max”值来规范化这个新的测试数据。


这在图像模型中很常见,如下所示:


X_train /= 255.

X_test /= 255.

注意,我们将训练数据和测试数据除以相同的数字(即255)。或更复杂的标准化方案:


X_mean = X_train.mean(axis=0)

X_std = X_train.std(axis=0)

X_train -= X_mean

X_train /= X_std + 1e-8   # add a small constant to prevent division by zero


# Now to normalize test data we use the same X_mean and X_std already computed

X_test -= X_mean

X_test /= X_std + 1e-8

旁注(正如我在评论中提到的):如果您在 GPU 上运行训练,那么您可以考虑使用CuDNNGRU代替GRU(或CuDNNLSTM代替LSTM),因为它专门针对 GPU 进行了优化并加快了训练过程。


查看完整回答
反对 回复 2021-06-01
  • 3 回答
  • 0 关注
  • 228 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号