如何解决keras 中注意力层和 CONV1D 之间的层兼容性
我正在以 bilstm-attention-conv1d 方式构建模型(我想使用具有不同内核大小的多个 conv1d)我面临着注意力层和 conv1d 层之间的层不兼容问题。我尝试过 Reshape 功能,但它不起作用,以下是我的代码:
我的模型如下
sequence_input = Input(shape=(maxlen,),dtype="int32")
embedded_sequences = Embedding(50000,output_dim=output_dim)(sequence_input)
lstm = Bidirectional(LSTM(RNN_CELL_SIZE,return_sequences = True),name="bi_lstm_0")(embedded_sequences)
# Getting our LSTM outputs
(lstm,forward_h,forward_c,backward_h,backward_c) = Bidirectional(LSTM(RNN_CELL_SIZE,return_sequences=True,return_state=True),name="bi_lstm_1")(lstm)
state_h = Concatenate()([forward_h,backward_h])
state_c = Concatenate()([forward_c,backward_c])
context_vector,attention_weights = Attention(10)(lstm,state_h)
x = Reshape((maxlen,output_dim,1))(context_vector)
kernel_sizes = [1,2,3,4,5]
convs = []
for kernel_size in range(len(kernel_sizes)):
conv = Conv1D(128,kernel_size,activation='relu')(x)
convs.append(conv)
avg_pool = GlobalAveragePooling1D()(convs)
max_pool = GlobalMaxPooling1D()(convs)
conc = concatenate([avg_pool,max_pool])
output = Dense(50,activation="sigmoid")(conc)
model = keras.Model(inputs=sequence_input,outputs=output)
print(model.summary())
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-114-8e5c0c75e84a> in <module>()
13 context_vector,state_h)
14
---> 15 x = Reshape((maxlen,1))(context_vector)
16
17
6 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self,*args,**kwargs)
950 if _in_functional_construction_mode(self,inputs,args,kwargs,input_list):
951 return self._functional_construction_call(inputs,--> 952 input_list)
953
954 # Maintains info about the `Layer.call` stack.
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in _functional_construction_call(self,input_list)
1089 # Check input assumptions set after layer building,e.g. input shape.
1090 outputs = self._keras_tensor_symbolic_call(
-> 1091 inputs,input_masks,kwargs)
1092
1093 if outputs is None:
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in _keras_tensor_symbolic_call(self,kwargs)
820 return nest.map_structure(keras_tensor.KerasTensor,output_signature)
821 else:
--> 822 return self._infer_output_signature(inputs,input_masks)
823
824 def _infer_output_signature(self,input_masks):
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in _infer_output_signature(self,input_masks)
861 # Todo(kaftan): do we maybe_build here,or have we already done it?
862 self._maybe_build(inputs)
--> 863 outputs = call_fn(inputs,**kwargs)
864
865 self._handle_activity_regularization(inputs,outputs)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py in call(self,inputs)
555 # Set the static shape for the result since it might lost during array_ops
556 # reshape,eg,some `None` dim in the result Could be inferred.
--> 557 result.set_shape(self.compute_output_shape(inputs.shape))
558 return result
559
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py in compute_output_shape(self,input_shape)
546 output_shape = [input_shape[0]]
547 output_shape += self._fix_unkNown_dimension(input_shape[1:],--> 548 self.target_shape)
549 return tensor_shape.TensorShape(output_shape)
550
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py in _fix_unkNown_dimension(self,input_shape,output_shape)
534 output_shape[unkNown] = original // kNown
535 elif original != kNown:
--> 536 raise ValueError(msg)
537 return output_shape
538
ValueError: total size of new array must be unchanged,input_shape = [256],output_shape = [2500,100,1]
请帮助我
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。