Как создать обучаемую переменную веса для пользовательского слоя Keras - PullRequest
0 голосов
/ 21 декабря 2018

Я реализую пользовательский средний уровень пула, где каждый нейрон вычисляет среднее значение своих входных данных, затем умножает результат на усваиваемый коэффициент и добавляет обучаемый термин смещения, а затем, наконец, применяет функцию активации

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. Содержание: (Измерение (Нет), 14, 14, 6). Рассмотрим приведение элементов к поддерживаемому типу."«Нет» - это размер партии, который я получаю из предыдущего слоя.

Как решить эту проблему?

1 Ответ

0 голосов
/ 21 декабря 2018

Ваша ошибка вызвана типом данных.input_shape[0] возвращает <class 'tensorflow.python.framework.tensor_shape.Dimension'> вместо int.

Вы можете заменить input_shape[0] на tf.TensorShape(input_shape).as_list()[0].Но ваше измерение данных неверно, и вы должны отрегулировать и изменить его в соответствии с вашими потребностями.

Редактировать

Если вы получаете сообщение об ошибке "не можете установить атрибутmsgstr "вы должны переименовать переменную веса вместо self.weights.Например, измените на self.weights_new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...