我试图围绕我的具体任务所需的形状。我正在尝试训练一个包含在数据帧中的时间序列数据的qlearner。我的数据框有以下列:open,close,high,low,我试图得到一个50x时间步长的滑动窗口。以下是每个窗口的示例代码:
window = df.iloc[0:50]
df_norm = (window - window.mean()) / (window.max() - window.min())
x = df_norm.values
x = np.expand_dims(x, axis=0)
print x.shape
#(1,50, 4)
现在我知道我的形状是(1,50,4)X中的每个项目我都在为我的模型提供什么样的形状而感到茫然。可以说我有以下内容:
model = Sequential()
model.add(LSTM(32, return_sequences=True, input_shape=(50,4)))
model.add(LSTM(32, return_sequences=True))
model.add(Dense(num_actions))
给出以下错误
ValueError: could not broadcast input array from shape (50,4) into shape (1,50)
这是另一次尝试:
model = Sequential()
model.add(Dense(hidden_size, input_shape=(50,4), activation='relu'))
model.add(Dense(hidden_size, activation='relu'))
model.add(Dense(num_actions))
model.compile(sgd(lr=.2), "mse")
会出现以下错误:
ValueError: could not broadcast input array from shape (50,4) into shape (1,50))
这是模型期待的形状和我的环境中的状态:
print "Inputs: {}".format(model.input_shape)
print "actual: {}".format(env.state.shape)
#Inputs: (None, 50, 4)
#actual: (1, 50, 4)
有人可以解释我在这里的形状出错了吗?
答案 0 :(得分:2)
重复图层采用形状(batch_size, timesteps, input_features)
的输入。由于x
的形状为(1, 50, 4)
,因此数据应解释为50个时间步长的单个批次,每个包含4个要素。在初始化模型的第一层时,您传递input_shape
:一个元组,指定输入的形状,不包括batch_size
维度。对于LSTM图层,您可以将None
作为timesteps
维度传递。因此,这就是如何初始化网络的第一层:
model.add(LSTM(32, return_sequences=True, input_shape=(None, 4)))
第二个LSTM层后面是一个致密层。因此,您不需要返回此图层的序列。因此,这是您应该如何初始化第二个LSTM层:
model.add(LSTM(32))
x
中的每批50个时间步骤应该映射到y
中的单个动作向量。因此,由于x
的形状为(1, 50, 4)
,因此y
的形状必须为(1, num_actions)
。确保y
没有timesteps
维度。
因此,假设x
和y
具有正确的形状,以下代码应该有效:
model = Sequential()
model.add(LSTM(32, return_sequences=True, input_shape=(None, 4)))
model.add(LSTM(32))
model.add(Dense(num_actions))
model.compile(sgd(lr=.2), "mse")
# x.shape == (1, 50, 4)
# y.shape == (1, num_actions)
history = model.fit(x, y)