Как создать слой tf.keras без ядра, т.Е. Создать обучаемую переменную, которую можно использовать в любом месте определения модели keras?

#keras

#keras

Вопрос:

Например, просто нужно смещение. Скаляр. Нет ядра.

Использование model.add_weight для tf.Variable и K.variable завершается с ошибкой.

Это должно быть просто. Не удается найти его в документах.

Обновить:

Кажется, это лучший способ, с которым я сталкивался до сих пор:

 class BiasLayer(keras.layers.Layer):
    def __init__(self, output_dim=1, **kwargs):
        self.output_dim = output_dim
        super().__init__(**kwargs)

    def build(self, input_shape):
        self.V = self.add_weight(shape=(1,), initializer=keras.initializers.Constant(value=0), dtype=tf.float32, trainable=True)
        super().build(input_shape)

    def call(self, x):
        return x * 0   self.V # this is stupid, is there a better way
        # return self.V # this does not work, results in no trainable variables

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)
 

Комментарии:

1. Вы можете установить значение ядра для всех единиц.

2. вы имеете в виду константу всех нулей?

3. Я имею в виду все постоянные.

4. Это ядро идентификации. Я просто пытаюсь взломать Keras, чтобы дать мне переменную смещения для обучения как отдельную переменную, не имеющую ничего общего ни с чем другим. Я не хочу добавлять дополнительные обучающие переменные. Если бы я мог заставить Keras работать с add_weight(tf.Variable(1.0), мне бы тоже не понадобился этот взлом.

Ответ №1:

Вы можете установить kernel_size=0 . Я пишу пример, чтобы продемонстрировать это.

С обычным ядром

 import tensorflow as tf
from tensorflow.keras import layers
import numpy as np

mnist = tf.keras.datasets.mnist


(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)


kernel_size=(5, 5)
# kernel_size = 0

model = tf.keras.Sequential()
model.add(layers.Conv2D(64, kernel_size, strides=(1, 1), padding='same',
                        input_shape=(28, 28, 1)))
model.add(layers.LeakyReLU())
model.add(layers.MaxPooling2D(pool_size=(2,2)))

model.add(layers.Conv2D(32, kernel_size, strides=(1, 1), padding='same'))
model.add(layers.LeakyReLU())
model.add(layers.MaxPooling2D(pool_size=(2,2)))

model.add(layers.Flatten())
model.add(layers.Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# model.fit(x_train, y_train,
#           batch_size=32, nb_epoch=1, verbose=1)
# model.evaluate(x_test, y_test)
model.summary()
 

Краткое изложение с ядром

введите описание изображения здесь

Без ядра

измените значение kernel_size=5 на kernel_size=0

Сводка без ядра

введите описание изображения здесь

Комментарии:

1. БОЖЕ, так просто. Не думал, что нулевой размер ядра должен работать! Должно быть добавлено в документы как быстрый / удобный способ создания переменных.

2. Я обнаружил, что это пока не работает для моего случая… я ищу только обернутую обучаемую переменную, я думаю, вы, возможно, решаете какой-то более сложный случай, когда нулевой выбор распространяется по модели.