TypeError:“张量”对象不可调用凯拉斯·伯特

时间:2019-12-27 00:17:22

标签: python-3.x keras conv-neural-network keras-layer

我正在建立这个模型:

inputs = model.inputs[:2] 
layer_output = model.get_layer('Encoder-12-FeedForward-Norm').output  
input_layer= keras.layers.Input(shape=(SEQ_LEN,768))(layer_output)
conv_layer= keras.layers.Conv1D(100, kernel_size=3, activation='relu', data_format='channels_first')(input_layer)   
maxpool_layer = keras.layers.MaxPooling1D(pool_size=4)(conv_layer)
flat_layer= keras.layers.Flatten()(maxpool_layer)
outputs = keras.layers.Dense(units=3, activation='softmax')(flat_layer)
model = keras.models.Model(inputs, outputs)
model.compile(RAdam(learning_rate =LR),loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])

并且我不断收到此错误 TypeError:“张量”对象不可调用。我知道 layer_output 是张量而不是图层,Keras可以处理图层。但是我发现很难找出正确的方法。我以前用类似的输入构建了一个biLSTM模型,并且工作正常。有人可以向我指出一些可以帮助我更好地理解问题的东西吗?我尝试将 input_layer 传递给 conv_layer ,但遇到此错误 * TypeError:图层conv1d_1不支持屏蔽,但是传递了input_mask:Tensor(“编码器12-FeedForward-Add / All:0“,shape =(?, 35),dtype = bool)

2 个答案:

答案 0 :(得分:2)

input_layer= keras.layers.Input(shape=(SEQ_LEN,768))(layer_output)

您正在尝试将输入传递给输入张量???

要么有张量:layer_output;或者您有一个输入张量:Input(shape...)。试图将两者混合在一起是没有意义的。

在您的代码中,左侧的所有内容均为Tensor,这是正确的!
中间的所有内容均为Layer,所有层的右侧均称为Tensor

tensor_instance = Layer(...)(tensor_instance)

但是Input不是一个层,Input是一个张量。您不能Input(...)(tensor_instance),因为Input不是图层。

layer_output(张量)不需要做任何事情。您已经拥有了,所以继续:

conv_layer_output_tensor = Conv1D(...)(layer_output)

建议:

inputs = model.inputs[:2] #what is this model??
layer_output = model.get_layer('Encoder-12-FeedForward-Norm').output  
    #this may not work 
    #unless this output can be fully gotten with the two inputs you selected 
    #(and there is a chance that Keras code is not prepared for this)

conv_output = keras.layers.Conv1D(100, kernel_size=3, activation='relu', 
                                  data_format='channels_first')(layer_output)   
maxpool_output = keras.layers.MaxPooling1D(pool_size=4)(conv_output)
flat_output= keras.layers.Flatten()(maxpool_output)
outputs = keras.layers.Dense(units=3, activation='softmax')(flat_output)
another_model = keras.models.Model(inputs, outputs)
another_model.compile(RAdam(learning_rate = LR), 
                      loss='sparse_categorical_crossentropy', 
                      metrics=['sparse_categorical_accuracy'])

答案 1 :(得分:0)

尝试添加此内容:

output = Lambda(lambda x: x, output_shape=lambda s: s)(output)

Conv1D层之前。