我正在尝试使用一种注意力机制来合并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维输出,然后在传递到下一层时会引发错误。
错误似乎出在点积中。 conv
和attn
的尺寸为4,而features
的尺寸为5,但是点积为7。我尝试使用keras.backend.int_shape
来找出确切的输出它产生的形状,但张量没有定义_keras_shape
,所以我没有得到任何有用的信息。如何获得点积以给我合适的形状?