我有问题。我建立了一个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
但是当我遇到错误时:
ValueError: A merge layer should be called on a list of inputs
之后,我尝试使用后端文档代替keras.layer.average:
out=K.mean(conv4,axis=1)
但是我收到此错误:
'Tensor' object has no attribute '_keras_history'
有什么想法吗?
答案 0 :(得分:4)
假设conv4
是形状为(batch_size, nb_channels, 32, 32)
的张量。您可以按以下方式平均计算渠道范围内的conv4
:
out = Lambda(lambda x: K.mean(x, axis=1))(conv4)
所得张量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)
注意:未测试。
答案 1 :(得分:0)
在rvinas答案中加我几分钱-有一个名为keepdims的参数,该参数可防止对张量进行某些操作后减小张量的形状。
keepdims:布尔值,是否保留尺寸。如果 keepdims为False,张量的等级降低1。如果keepdims 为True,则缩小的尺寸保留为长度1。
out = Lambda(lambda x: K.mean(x, axis=1), keepdims=True)(conv4)