Keras中的点积会产生错误的尺寸

时间:2018-09-13 07:32:41

标签: python neural-network keras conv-neural-network theano

我正在尝试使用一种注意力机制来合并Keras中卷积层的输出(使用Theano后端)。这是我的代码:

class AttentionPooledConvolution(keras.layers.Layer):

def __init__(self,n_features,**kwargs):
    self.n_features=n_features
    self.convolution=None
    self.attention=None
    self.shape=None
    super(AttentionPooledConvolution,self).__init__(**kwargs)

def build(self,input_shape):
    self.shape=((input_shape[1]+1)//2,
                (input_shape[2]+1)//2,
                self.n_features)
    self.convolution=keras.layers.Conv2D(self.n_features,
                                         (3,3),
                                         activation='tanh',
                                         data_format='channels_last',
                                         padding='same')
    self.convolution.build(input_shape)
    self.attention=keras.layers.Conv2D(4,
                                       (4,4),
                                       strides=(2,2),
                                       activation='softmax',
                                       data_format='channels_last',
                                       padding='same')
    self.attention.build(input_shape)
    super(AttentionPooledConvolution,self).build(input_shape)

def call(self,x):
    conv=self.convolution(x)
    attn=self.attention(x)
    features=keras.backend.stack([conv[:,::2,::2,:],
                                  conv[:,1::2,::2,:],
                                  conv[:,::2,1::2,:],
                                  conv[:,1::2,1::2,:]],
                                 axis=2)
    print(features.shape)
    return keras.backend.dot(attn,features)

def get_output_shape(self):
return self.shape

此代码应采用(None,2x,2y,n)形式的输入。然后,Conv2D层self.convolution生成形状为(None,2x,2y,self.n_features)的输出“特征” 在self.build中看到的切片和堆叠操作应将其重塑为(None,x,y,4,self.n_features)

Conv2D层self.attention应产生尺寸为(None,x,y,4)的输出,然后此点与要素的乘积应为形状(None,x,y,self.n_features)

但是,该层正在生成7维输出,然后在传递到下一层时会引发错误。

错误似乎出在点积中。 convattn的尺寸为4,而features的尺寸为5,但是点积为7。我尝试使用keras.backend.int_shape来找出确切的输出它产生的形状,但张量没有定义_keras_shape,所以我没有得到任何有用的信息。如何获得点积以给我合适的形状?

0 个答案:

没有答案