gpt4 book ai didi

python-3.x - 尝试在 Keras 中创建 BLSTM 网络时出现类型错误

转载 作者:行者123 更新时间:2023-12-03 10:01:55 26 4
gpt4 key购买 nike

我对 Keras 和深度学习有点陌生。我目前正在尝试复制此 paper但是当我编译第二个模型(使用 LSTM)时,我收到以下错误:

"TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'"

该模型的描述是这样的:
  • 输入(长度 T 是设备特定的窗口大小)
  • 带滤波器的并行一维卷积 size 3、5 和 7
    分别,stride=1 , number of filters=32 ,activation type=linear , border mode=same
  • 连接输出的合并层
    并行一维卷积
  • 双向 LSTM 由前向 LSTM 组成
    和一个反向 LSTM,output_dim=128
  • 双向 LSTM 由前向 LSTM 组成
    和反向 LSTM,output_dim=128
  • 密层,output_dim=128 , activation type=ReLU
  • 密层,output_dim= T , activation type=linear

  • 我的代码是这样的:
    from keras import layers, Input
    from keras.models import Model

    def lstm_net(T):
    input_layer = Input(shape=(T,1))
    branch_a = layers.Conv1D(32, 3, activation='linear', padding='same', strides=1)(input_layer)
    branch_b = layers.Conv1D(32, 5, activation='linear', padding='same', strides=1)(input_layer)
    branch_c = layers.Conv1D(32, 7, activation='linear', padding='same', strides=1)(input_layer)

    merge_layer = layers.Concatenate(axis=-1)([branch_a, branch_b, branch_c])
    print(merge_layer.shape)
    BLSTM1 = layers.Bidirectional(layers.LSTM(128, input_shape=(8,40,96)))(merge_layer)
    print(BLSTM1.shape)
    BLSTM2 = layers.Bidirectional(layers.LSTM(128))(BLSTM1)
    dense_layer = layers.Dense(128, activation='relu')(BLSTM2)
    output_dense = layers.Dense(1, activation='linear')(dense_layer)
    model = Model(input_layer, output_dense)
    model.name = "lstm_net"
    return model

    model = lstm_net(40)

    之后,我收到上述错误。我的目标是将一批长度为 40 的 8 个序列作为输入,并获得一批长度为 40 的 8 个序列作为输出。我在 Keras Github 上发现了这个问题 LSTM layer cannot connect to Dense layer after Flatten #818并且@fchollet 建议我应该在第一层中指定“input_shape”,但可能不正确。我放了两个打印语句,看看形状是如何变化的,输出是:
    (?, 40, 96)
    (?, 256)

    错误发生在BLSTM2定义行上,可以查看全文 here

    最佳答案

    你的问题在于这三行:

    BLSTM1 = layers.Bidirectional(layers.LSTM(128, input_shape=(8,40,96)))(merge_layer)
    print(BLSTM1.shape)
    BLSTM2 = layers.Bidirectional(layers.LSTM(128))(BLSTM1)

    默认情况下, LSTM仅返回计算的最后一个元素 - 因此您的数据正在失去其顺序性。这就是处理层引发错误的原因。将此行更改为:
    BLSTM1 = layers.Bidirectional(layers.LSTM(128, return_sequences=True))(merge_layer)
    print(BLSTM1.shape)
    BLSTM2 = layers.Bidirectional(layers.LSTM(128))(BLSTM1)

    为了使第二个 LSTM的输入也具有顺序性。

    除此之外 - 我宁愿不使用 input_shape在中间模型层,因为它是自动推断的。

    关于python-3.x - 尝试在 Keras 中创建 BLSTM 网络时出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407346/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com