Keras与形状[(1,8),(None,32)]

时间:2018-11-22 21:40:30

标签: python tensorflow keras

我的网络由 LSTM和密集部分通过另一个密集部分连接在一起组成,我无法连接大小为[(1,8),(None,32)]的输入ReshapeFlatten不起作用。

这是架构:

def build_model_equal(dropout_rate=0.25):

    curve_input_1 = Input(batch_shape=(1, None, 1), name='curve_input_1')
    lstm_1 = LSTM(256, return_sequences=True, dropout=0.1)(curve_input_1)
    lstm_1 = LSTM(64, dropout=0.1)(lstm_1)
    lstm_out = Dense(8)(lstm_1)

    metadata_input = Input(shape=(31,), name='metadata_input')

    dense_1 = Dense(512, activation='relu')(metadata_input)
    dense_1 = BatchNormalization()(dense_1)
    dense_1 = Dropout(dropout_rate)(dense_1)

    dense_out = Dense(32)(dense_1)

    x = keras.layers.concatenate([lstm_out, dense_out], axis=1)

    output_hidden = Dense(64)(x)
    output_hidden = BatchNormalization()(output_hidden)
    output_hidden = Dropout(dropout_rate)(output_hidden)

    output = Dense(n_classes, activation='softmax', name='output')(output_hidden)

    model = Model(inputs=[curve_input_1, metadata_input], outputs=output)
    return model

当我通过

训练该模型时
model.fit([x_train, x_metadata], y_train,
    validation_data=[[x_valid, x_metadata_val], y_valid], 
    epochs=n_epoch,
    batch_size=n_batch, shuffle=True, 
    verbose=2, callbacks=[checkPoint]
)  

我收到错误

  

ValueError:连续图层需要输入的形状与concat轴一致,但形状匹配。 输入了以下形状:[(1,8),(None,32)]

当我添加

Reshape层时
dense_out = Dense(32)(dense_4)
dense_out = Reshape((1, 32))(dense_out)

x = keras.layers.concatenate([lstm_out, dense_out], axis=1)

我知道

  

ValueError:连续图层需要输入的形状与concat轴一致,但形状匹配。 输入了以下形状:[(1,8),(None,1,32)]

Reshapeinput_shape=(32,)input_shape=(None, 32)参数不会改变情况,误差和形状相同。

Reshape添加到LSTM中

curve_input_1 = Input(batch_shape=(1, None, 1), name='curve_input_1')
lstm_first_1 = LSTM(256, return_sequences=True, dropout=0.1, name='lstm_first_1')(curve_input_1)
lstm_second_1 = LSTM(64, dropout=0.1, name='lstm_second_1')(lstm_first_1)
lstm_out = Dense(8)(lstm_second_1)
lstm_out = Reshape((None, 8))(lstm_out)

产生错误

  

ValueError:试图将'shape'转换为张量,但失败。错误:不支持任何值。

concatenate axis参数更改为01-1并没有帮助。

更改Dense零件输入形状无济于事。当我执行metadata_input = Input(shape=(1, 31), name='metadata_input')而不是metadata_input = Input(shape =(31,),name ='metadata_input')时,会产生一个[(1, 8), (None, 1, 32)]尺寸的错误。

我的猜测是我需要将数据转换为[(1, 8), (1, 32)][(None, 8), (None, 32)]的形状,但是ReshapeFlatten层却无济于事。

应该有一种我错过的简便方法。

1 个答案:

答案 0 :(得分:0)

我认为问题可能是第一个batch_shape使用Input,第二个shape使用。

在第一个输入中,您的批次大小被硬编码为1,并且输入数据具有2个额外的维度:None(未指定)和1

对于第二个输入,由于您正在使用shape,因此您声明输入的批次大小未指定,数据的一维值为31

请注意,使用shape=(31,)与使用batch_shape=(None, 31)(来自here)相同。

至少在模型声明时,两者都对我有用(尽管我无法进行拟合,而且我不确定是否遗漏了什么,并且该解决方案不适合您的用例。< / p>

因此,总而言之,您可以尝试:

curve_input_1 = Input(batch_shape=(1, None, 1), name='curve_input_1')
metadata_input = Input(batch_shape=(1, 31), name='metadata_input')

或者:

curve_input_1 = Input(batch_shape=(1, None, 1), name='curve_input_1')
metadata_input = Input(batch_shape=(1, 31), name='metadata_input')

等同于:

curve_input_1 = Input(shape=(None, 1, ), name='curve_input_1')
metadata_input = Input(shape=(31, ), name='metadata_input')

请让我知道这可以奏效,或将您引向正确的方向!