尝试在 Keras 中创建 BLSTM 网络时出现 TypeError

Posted

技术标签:

【中文标题】尝试在 Keras 中创建 BLSTM 网络时出现 TypeError【英文标题】:TypeError when trying to create a BLSTM network in Keras 【发布时间】:2018-07-02 14:31:12 【问题描述】:

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

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

模型的描述是这样的:

    输入(长度T 是特定于设备的窗口大小) 带有滤波器size 3、5和7的并行一维卷积 分别为stride=1number of filters=32activation type=linear, border mode=same 连接输出的合并层 并行一维卷积 双向 LSTM 由前向 LSTM 组成 和一个后向 LSTM,output_dim=128 双向 LSTM 由前向 LSTM 组成 和一个后向 LSTM,output_dim=128 密集层,output_dim=128activation type=ReLU 密集层,output_dim= Tactivation 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

【问题讨论】:

请在代码的哪一行发布此错误。 在我帖子的最后一行 :) 【参考方案1】:

你的问题在于这三行:

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,因为它是自动推断的。

【讨论】:

你是对的!我尝试了您的建议,但在拟合 BLSTM2 之后提供给 Dense 层的尺寸与预期尺寸之间的差异时遇到了错误。所以,我把参数return_sequnces= True 也放到了 BLSTM2 层,它起作用了!现在,我不完全确定我的网络是否像论文中描述的那样。 Bidirectional 层是否包含 2 个 LSTM?如果是这样,那么我认为我还可以。 是的 - 它包含两个LSTMs。 哦,对不起,我以为我已经这样做了!非常感谢! :)

以上是关于尝试在 Keras 中创建 BLSTM 网络时出现 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

尝试在openGL中创建空白窗口时出现异常输出

尝试在 java 中创建 AWT 窗口时出现异常

尝试在 Logic 应用中创建存储帐户时出现“无效资源”消息

当我尝试在 python 中创建浏览器时出现错误

尝试在 H2 数据库中创建表时出现 Liquibase 错误

尝试在 Google App Engine 项目中创建备份时出现 404