#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. Я обнаружил, что это пока не работает для моего случая… я ищу только обернутую обучаемую переменную, я думаю, вы, возможно, решаете какой-то более сложный случай, когда нулевой выбор распространяется по модели.