itr*_*lli 5 python-3.x lstm keras recurrent-neural-network keras-layer
我对 Keras 和深度学习有点陌生。我目前正在尝试复制这篇论文,但是当我编译第二个模型(使用 LSTM)时,出现以下错误:
"TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'"
Run Code Online (Sandbox Code Playgroud)
该模型的描述是这样的:
T是设备特定的窗口尺寸)size分别使用滤波器3、5 和 7 的并行一维卷积, stride=1, number of filters=32,
activation type=linear,border mode=sameoutput_dim=128output_dim=128output_dim=128,activation type=ReLUoutput_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)
Run Code Online (Sandbox Code Playgroud)
之后我收到上述错误。我的目标是提供一批 8 个长度为 40 的序列作为输入,并获得一批 8 个长度为 40 的序列作为输出。我在 Keras Github 上发现这个问题,在 Flatten #818 之后 LSTM 层无法连接到 Dense 层,@fchollet 建议我应该在第一层中指定“input_shape”,我这样做了,但可能不正确。我放置了两个 print 语句来查看形状如何变化,输出是:
(?, 40, 96)
(?, 256)
Run Code Online (Sandbox Code Playgroud)
错误发生在 BLSTM2 已定义行上,可以在此处查看完整内容
你的问题出在这三行:
BLSTM1 = layers.Bidirectional(layers.LSTM(128, input_shape=(8,40,96)))(merge_layer)
print(BLSTM1.shape)
BLSTM2 = layers.Bidirectional(layers.LSTM(128))(BLSTM1)
Run Code Online (Sandbox Code Playgroud)
默认情况下,LSTM仅返回计算的最后一个元素 - 因此您的数据正在失去其顺序性质。这就是前一层产生错误的原因。将此行更改为:
BLSTM1 = layers.Bidirectional(layers.LSTM(128, return_sequences=True))(merge_layer)
print(BLSTM1.shape)
BLSTM2 = layers.Bidirectional(layers.LSTM(128))(BLSTM1)
Run Code Online (Sandbox Code Playgroud)
为了使第二个的输入LSTM也具有顺序性。
除此之外 - 我不想input_shape在中间模型层中使用,因为它是自动推断的。
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |