Как создать слой tf.keras без кернала, то есть создать обучаемую переменную, которую можно использовать в любом месте определения модели keras? - PullRequest
0 голосов
/ 16 апреля 2019

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

Использование 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 Ответ

1 голос
/ 16 апреля 2019

Вы можете установить 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()

Резюме с ядром

enter image description here

Без ядра

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

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

enter image description here

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