首页 文章

Keras与形状[(1,8),(无,32)]连接

提问于
浏览
0

我的网络由其他密集部分的 LSTM and Dense parts connected together 和我 cannot concatenate inputs of size [(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:Concatenate层要求输入具有匹配的形状,但concat轴除外 . 得到输入形状:[(1,8),(无,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:Concatenate层要求输入具有匹配的形状,但concat轴除外 . 得到输入形状:[(1,8),(无,1,32)]

Reshape layer input_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

    我认为问题可能是使用 batch_shape 作为第一个 Inputshape 作为第二个 .

    使用第一个输入时,批量大小被硬编码为 1 ,输入数据有2个额外维度 None (未指定)和 1 .

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

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

    两者对齐对我来说是有用的,至少在模型声明时间(虽然我无法运行,但我不确定我是否遗漏了某些东西而且此解决方案不适合您的用例 .

    总而言之,您可以尝试:

    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')
    

    请让我知道这有用或引导你朝着一个好方向前进!

相关问题