这个RNN架构将作为输入采用什么数据形状?

时间:2017-11-07 02:55:45

标签: python machine-learning tensorflow keras rnn

完成RNN的菜鸟。

我在网上看到了这段代码:

def buildModel(dataLength, labelLength):

    height = Input(shape=(dataLength, 1), name="height")
    weight = Input(shape=(dataLength, 1), name="weight")

    heightLayers = LSTM(64, return_sequences=False)(height)
    weightLayers = LSTM(64, return_sequences=False)(weight)

    output = concatenate([ heightLayers, weightLayers ])

    output = Dense(labelLength, activation="linear", name="weightedAverage_output")(output)

    model = Model(
        inputs=[height, weight],
        outputs=[output]
        )

    model.compile(optimizer="rmsprop", loss="mse")

    return model

我应该输入时间序列数据作为numpy数组,但我不确定这里预期的numpy数组形状高度/重量

我传递了类似

的内容
[[[ 0]
  [ 1]
  [ 2]
  [ 3]
  [ 4]
  ....
  [ 10]]]

并且它给了我这个错误

  

ValueError:检查输入时出错:预期接近有形状(无,60,1)但得到的形状为数组(2,45,1)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要两次输入形状(batch_size, dataLength, 1)作为输入。在这种特定情况下,它是(batch_size, 60, 1)

现在,batch_size是您将用于更新权重的数据点数。它可以是1或它可以是n(所有数据)。最常见的batch_size是2的幂,因此如果您不确定,64128应该没问题。 (错误说None,因为它没有严格的形状要求)

dataLength是您特定的问题,它是dataLengthx2,因为您的heightLayers单元格和weightLayers单元格想要获取大小为dataLength的高度输入,并且您的权重输入大小为dataLength。你可以看到:

model = Model(
    inputs=[height, weight], # requested input shape is height + weight
    outputs=[output]         # outputs a tensor of shape labelLength
    )

如果您只想运行并查看模型是否正常工作,您可以提供类似的内容,它应该有效:

[numpy.zeros((32,30,1)), numpy.zeros((32,30,1))] # one for height, one for width

编辑:再次查看您的错误,看起来它需要一个形状为(batch_size, 60, 1)的输入。看起来它想要连接数组(它在我的设置上的行为不同,需要两个输入的列表)。 所以你应该尝试:

np.zeros((32,60,1))

看看它是否有效。

编辑2:抱歉,我在第一次观看时误解了你的输入。看看你发布的pastebin。你的dataLength是60.所以网络需要两个形状为(batch_size, dataLength, 1)的numpy数组。

所以这应该有效:

batch_input = [np.zeros((32,60,1)), np.zeros((32,60,1))]
batch_labels = np.ones((32,4))
model.fit(batch_input, batch_labels)

哦,重要的补充,如果您使用keras,可以致电model.summary()以获得有关图层结构的更多信息。在这种情况下,它应该显示它以2个输入图层开始,每个图层都需要(None, 60, 1)形状。