Проблемы при создании пользовательского слоя keras - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь создать пользовательский слой keras для выполнения определенной задачи

У меня есть ввод shape = (batch_size, M, N, p) Я хочу, чтобы мой вывод имел форму = (batch_size,M, N, f)

Итак, я установил обучаемый составной фигуры = (M, N, p, f)

Ниже мой код

class convLayer(Layer):
    """
    Self defined convolutional layer
    """
    def __init__(self, filter_no, **kwargs):
        self.filter_no = filter_no

        super(convLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        self.conv_weights = self.add_weight(name='weight',
                                      shape=(input_shape[1], input_shape[2], 
                                             input_shape[3], self.filter_no),
                                      initializer='uniform',
                                      trainable=True)

        super(convLayer, self).build(input_shape)

    def call(self, inputs):
        outputs = K.placeholder(shape=(inputs.shape[0], inputs.shape[1], 
                                 inputs.shape[2], self.filter_no), 
                                 dtype=tf.float32)
        for i in range(self.filter_no):
            weight = self.conv_weights[:,:,:, i]
            val = tf.math.multiply(inputs, weight)
            for j in range(val.shape[3]):
                if i==0:
                    outputs[:,:,:,i].assign(val[:,:,:,j])
                else:        
                    outputs[:,:,:,i].assign(tf.math.add(outputs[:,:,:,i], val[:,:,:,j]))

        return outputs

    def compute_output_shape(self, input_shape):
        return (input_shape[0], input_shape[1], input_shape[2], self.filter_no)

Мой вывод должен иметь форму = (batch_size, M, N, f) для каждого f, все элементы оси p в обоих входных и conv_weight должны быть умножены и суммированы вместе.

Я пытался и получаюнесколько ошибок.Я относительно новичок в создании пользовательских слоев.Пожалуйста, помогите.Спасибо.

Сообщение об ошибке: Назначение нарезки поддерживается только для переменных.

1 Ответ

0 голосов
/ 09 июля 2019

Нельзя назначать тензорам, потому что они неизменны. Что вы можете сделать, это создать новый тензор, скопированный из другого с заменой некоторых значений. Вы можете попробовать как this .

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