Создавайте слои с фиксированными весами в TensorFlow - PullRequest
1 голос
/ 16 января 2020

Я хочу построить полностью связанный (плотный) слой для задачи регрессии. Я обычно делаю это с TF2, используя Keras API, например:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=2, activation='sigmoid', input_shape=(1, )))
model.add(tf.keras.layers.Dense(units=2, activation='linear'))
model.compile(optimizer='adam', loss='mae')
model.fit(inp_data, out_data, epochs=1000)

Теперь я хочу создать собственный слой. Слой состоит, скажем, из 10 единиц, в которых 8 единиц имеют предопределенные, фиксированные, неизучаемые веса и смещения, а 2 единицы имеют произвольно выбранные веса и смещения, которые должны быть обучены сетью. Кто-нибудь знает, как я могу определить его в Tensorflow?

1 Ответ

2 голосов
/ 16 января 2020

Слои Keras могут получить параметр trainable, по умолчанию True, чтобы указать, хотите ли вы их обучать. Не обучаемые слои просто сохранят значение, которое они дают инициализатору. Если я правильно понимаю, вы хотите иметь один слой, который можно тренировать только частично. Это невозможно как таковое с существующими слоями. Возможно, вы могли бы сделать это с помощью пользовательского класса слоя, но вы можете иметь эквивалентное поведение, используя два простых слоя и затем объединяя их (если ваша активация работает поэлементно, и даже если это не так, как в softmax слой, вы можете применить эту активацию после объединения). Вот как это может работать:

inputs = tf.keras.Input(shape=(1,))
# This is the trainable part of the layer
layer_train = tf.keras.layers.Dense(units=8, activation='sigmoid')(inputs)
# This is the non-trainable part
layer_const = tf.keras.layers.Dense(units=2, activation='sigmoid', trainable=False)(inputs)
# Merge both parts
layer = tf.keras.layers.Concatenate()([layer_train, layer_const])
# Make model
model = tf.keras.Model(inputs=inputs, outputs=layer)
# ...
...