如何为自定义keras图层创建可训练的权重变量

时间:2018-12-21 14:40:31

标签: tensorflow machine-learning keras layer

我正在实现自定义平均池化层,其中每个神经元计算其输入的均值,然后将结果乘以可学习的系数,并添加可学习的偏差项,最后应用激活函数

from tensorflow.keras.layers import Layer

from keras import backend as K


class Average_Pooling_Layer(Layer):
    def __init__(self, output_dimension, **kwargs):
        super(Average_Pooling_Layer, self).__init__(**kwargs)
        self.output_dimension = output_dimension

    def build(self, input_shape):

        self.weights = self.add_weight(name='weights2',
                              shape=(input_shape[0], 
                               int(self.output_dimension[0]), 
                               int(self.output_dimension[1]), 
                               int(self.output_dimension[2])),
                               initializer='uniform',
                               trainable=True)
    super(Average_Pooling_Layer, self).build(input_shape)

   def call(self, inputs):
        return K.tanh((inputs * self.weights))

    def compute_output_shape(self, input_shape):
        return (input_shape)

代码用法

model = tf.keras.Sequential()
stride = 1
c1 = model.add(Conv2D(6, kernel_size=[5,5], strides=(stride,stride), padding="valid", input_shape=(32,32,1), 
                  activation = 'tanh'))
s2_before_activation = model.add(AveragePooling2D(pool_size=(2, 2), strides=(2, 2)))
s2 = model.add(Average_Pooling_Layer(output_dimension = (14, 14, 6)))

我收到错误消息“无法将类型的对象转换为Tensor。内容:(Dimension(None),14,14,6)。考虑将元素强制转换为受支持的类型。” “无”是批次大小,这是我从上一层获得的。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的错误是由数据类型引起的。 input_shape[0]返回<class 'tensorflow.python.framework.tensor_shape.Dimension'>而不是int

您可以将input_shape[0]替换为tf.TensorShape(input_shape).as_list()[0]。但是您的数据维度不合适,您必须根据需要进行调整和修改。

修改

如果由于“无法设置属性”而出现错误,则应重命名您的体重变量,而不是self.weights。例如,更改为self.weights_new