卷积层keras的平均通道

Nat*_*han 3 python keras

我有个问题。我建立了一个ConvNet。在最终输出之前隐藏的那个隐藏层的输出形状是(None,64,32,32)。我想要的是取这64个通道的元素明智的平均值。我已经试过了:

main_inputs=[]
outputs=[]

def convnet(channels,rows,columns):
        input=Input(shape=(channels,rows,columns))
        main_inputs.append(input)
        conv1=Convolution2D(kernel_size=(3,3) ,filters=64, padding="same")(input)
        activation1= Activation('relu')(conv1)
        conv2=Convolution2D(kernel_size=(3,3), filters=64, padding="same")(activation1)
        activation2 = Activation('relu')(conv2)
        conv3=Convolution2D(kernel_size=(3,3), filters=64, padding="same")(activation2)
        activation3 = Activation('relu')(conv3)
        conv4=Convolution2D(kernel_size=(3,3), filters=channels, padding="same")(activation3)
        out=keras.layers.Average()(conv4)
        activation4 = Activation('linear')(out)
        outputs.append(activation4)
        print(np.shape(outputs))
        model = Model(inputs=main_inputs, outputs=outputs)

        return model
Run Code Online (Sandbox Code Playgroud)

但是当我遇到错误时:

ValueError: A merge layer should be called on a list of inputs
Run Code Online (Sandbox Code Playgroud)

之后,我尝试使用后端文档,而不是keras.layer.average:

out=K.mean(conv4,axis=1)
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

'Tensor' object has no attribute '_keras_history'
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

rvi*_*nas 6

假设conv4是具有张量的张量(batch_size, nb_channels, 32, 32)。您可以conv4按以下方式对渠道的维度进行平均:

out = Lambda(lambda x: K.mean(x, axis=1))(conv4)
Run Code Online (Sandbox Code Playgroud)

结果张量out将具有形状(batch_size, 32, 32)。您需要将所有后端操作包装在Lambda层中,以便生成的张量是有效的Keras张量(这样它们就不会缺少诸如的某些属性_keras_history)。

如果你想要的形状,out(batch_size, 1, 32, 32)不是,你可以这样做:

out = Lambda(lambda x: K.mean(x, axis=1)[:, None, :, :])(conv4)
Run Code Online (Sandbox Code Playgroud)

注意:未经测试。