keras - LSTM 3D 输入 3D 输出尺寸不匹配
问题描述
我在 Keras 有一个简单的 LSTM 网络:
def create_model(x):
lstm_model = Sequential()
lstm_model.add(LSTM(100, input_dim=x.shape[2], input_length=x.shape[1]))
lstm_model.add(Dense(1,activation='sigmoid'))
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
return lstm_model
我正在尝试对具有以下形状的数据进行训练:
训练数据输入:(100, 2784, 6),训练数据输出:(100, 2784, 1)
验证数据输入:(50, 27, 6),验证数据输出:(50, 27, 1)
测试数据输入: (50, 27, 6),测试数据输出:(50, 27, 1)
model.fit(train_x, train_y, validation_data=(validation_x, validation_y), epochs=EPOCHS, batch_size=BATCH_SIZE, shuffle=False, callbacks=[...])
我一直在维度上失败,要么是因为 a)验证数据与训练数据的形状不同,要么 b)因为 y 形状不正确
我究竟做错了什么?
为方便起见 PS 独立代码
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import LSTM, Dense
x_train=np.arange(1670400)
x_train=x_train.reshape((100, 2784, 6))
y_train=np.arange(278400)
y_train=y_train.reshape((100, 2784, 1))
x_val=np.arange(8100)
x_val=x_val.reshape((50, 27, 6))
y_val=np.arange(1350)
y_val=y_val.reshape((50, 27, 1))
x_test=np.arange(8100)
x_test=x_test.reshape((50, 27, 6))
y_test=np.arange(1350)
y_test=y_test.reshape((50, 27, 1))
def create_model(x):
lstm_model = Sequential()
lstm_model.add(LSTM(100, input_dim=x.shape[2], input_length=x.shape[1]))
lstm_model.add(Dense(1,activation='sigmoid'))
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
return lstm_model
model=create_model(x_train)
model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=10, batch_size=32, shuffle=False)
解决方案
此修改有效:
更改为batch_input_shape并将return_sequences=True添加到 LSTM 层
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import LSTM, Dense
x_train=np.arange(1670400)
x_train=x_train.reshape((100, 2784, 6))
y_train=np.arange(278400)
y_train=y_train.reshape((100, 2784, 1))
x_val=np.arange(8100)
x_val=x_val.reshape((50, 27, 6))
y_val=np.arange(1350)
y_val=y_val.reshape((50, 27, 1))
x_test=np.arange(8100)
x_test=x_test.reshape((50, 27, 6))
y_test=np.arange(1350)
y_test=y_test.reshape((50, 27, 1))
def create_model():
lstm_model = Sequential()
lstm_model.add(LSTM(100, batch_input_shape=(None,None,6), return_sequences=True))
lstm_model.add(Dense(1, activation='sigmoid'))
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
return lstm_model
model=create_model()
model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=10, batch_size=32, shuffle=False)
推荐阅读
- ios - 如何快速下载 Pdf 文件并在文件管理器中查找
- php - 满足列的有效负载数据的laravel
- java - 有没有办法将这个接受整数对象集合并添加这些元素的迭代函数转换为递归函数?
- php - 如何使用数组在 PHP Mysqli 中获取结果
- algorithm - 3D 中的最小边界框算法
- r - 如何将长度为 0 的数字向量设置为 0?
- javascript - 如何在 React 的新选项卡中打开一些子链接
- python - 使用现有电子邮件进行注册测试无法在 django manage.py test 命令中的测试数据库上运行
- azure - Azure MS SQL 防火墙设置(动态 IP 公共网络上的 Azure MS SQL 和 WinForms 客户端)什么是最好的安全方法?
- abap - 集群表的内存效率最高:“select count(*)”或“select .. endselect”?