了解Keras模型的形状

时间:2018-03-13 18:22:08

标签: python keras

我试图围绕我的具体任务所需的形状。我正在尝试训练一个包含在数据帧中的时间序列数据的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)

有人可以解释我在这里的形状出错了吗?

1 个答案:

答案 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维度。

因此,假设xy具有正确的形状,以下代码应该有效:

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)