尝试在 Keras 中创建 BLSTM 网络时出现 TypeError
TypeError when trying to create a BLSTM network in Keras
我对 Keras 和深度学习有点陌生。我目前正在尝试复制此 paper 但是当我编译第二个模型(使用 LSTM)时,我收到以下错误:
"TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'"
模型的描述是这样的:
- 输入(长度
T
是设备特定的 window 尺寸)
- 带过滤器的并行一维卷积
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)
之后我得到了上面的错误。我的目标是将一批 8 个长度为 40 的序列作为输入,并获得一批 8 个长度为 40 的序列作为输出。我在 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
,因为它是自动推断的。
我对 Keras 和深度学习有点陌生。我目前正在尝试复制此 paper 但是当我编译第二个模型(使用 LSTM)时,我收到以下错误:
"TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'"
模型的描述是这样的:
- 输入(长度
T
是设备特定的 window 尺寸) - 带过滤器的并行一维卷积
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)
之后我得到了上面的错误。我的目标是将一批 8 个长度为 40 的序列作为输入,并获得一批 8 个长度为 40 的序列作为输出。我在 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
,因为它是自动推断的。