Python 理解Keras模型的形状

Python 理解Keras模型的形状,python,keras,Python,Keras,我正试着把我的头绕在我的特定任务所需的形状上。我正在尝试对qlearner进行数据帧中包含的一些时间序列数据的培训。我的数据帧有以下列:打开、关闭、高、低,我试图得到一个滑动窗口,比如说50倍的时间步长。下面是每个窗口的示例代码: window = df.iloc[0:50] df_norm = (window - window.mean()) / (window.max() - window.min()) x = df_norm.values x = np.expand_dims(x, a

我正试着把我的头绕在我的特定任务所需的形状上。我正在尝试对qlearner进行数据帧中包含的一些时间序列数据的培训。我的数据帧有以下列:打开、关闭、高、低,我试图得到一个滑动窗口,比如说50倍的时间步长。下面是每个窗口的示例代码:

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))
以下是模型预期的形状和my env的状态:

print "Inputs: {}".format(model.input_shape)
print "actual: {}".format(env.state.shape)
#Inputs: (None, 50, 4)
#actual: (1, 50, 4)

有人能解释一下我的形状哪里出了问题吗

重复层接受形状的输入
(批大小、时间步长、输入特征)
。由于
x
的形状是
(1,50,4)
,因此应将数据解释为50个时间步的单个批次,每个时间步包含4个特征。初始化模型的第一层时,传递一个
input\u shape
:一个指定输入形状的元组,不包括
batch\u 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\u 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)

当我尝试这样做时,我得到了以下错误:ValueError:检查时出错:预期lstm_1_输入为3维,但得到了形状为(50,4)的数组。我删除了展开dims的线条,并将输入_形状设置为(无,4)。在我的代码中,环境的状态是(50,4)数组。我是否应该返回一个形状类似(1,50,4)的数组,因为通常我会提供一个已成形(50,4)的样本列表,例如(500,50,4),其中500是样本数?对不起,如果这些看起来像是基本的问题,我想也许我没有完全弄清楚我想做什么。我的示例中的“x”是我的环境返回的一个窗口,它有50个时间步,每个时间步有4个特性。在每个点上,代理将从具有形状(50,4)的环境中获取状态。因此,如果我要收集一个更大的样本,比如说500个州,形状应该是(500,50,4)。@NomadCrypto,我想我已经弄明白了你在努力实现什么,并相应地编辑了我的答案。让我知道这是否有帮助。