Как установить постоянную как вес в модели керас? - PullRequest
0 голосов
/ 09 января 2019

Я строю свою модель, используя tf.keras.layers.Dense. В первом слое моей модели я хочу, чтобы некоторые веса были постоянными Ноль. Как и при расчете градиента, эти веса должны быть равны нулю (поскольку последний член в правиле цепочки соответствует весу, который равен 0 для константы). Это мой подход до сих пор:

import tensorflow as tf
import tensorflow.contrib.eager as tfe    
import numpy as np

tf.enable_eager_execution()

model = tf.keras.Sequential([
  tf.keras.layers.Dense(2, activation=tf.sigmoid, input_shape=(2,)),
  tf.keras.layers.Dense(2, activation=tf.sigmoid)
])

weights=[np.array([[tf.constant(0), 0.25],[0.2,0.3]]),np.array([0.35,0.35]),np.array([[0.4,0.5],[0.45, 0.55]]),np.array([0.6,0.6])]
model.set_weights(weights)
def loss(model, x, y):
  y_ = model(x)
  return tf.losses.mean_squared_error(labels=y, predictions=y_)

    def grad(model, inputs, targets):
  with tf.GradientTape() as tape:
    loss_value = loss(model, inputs, targets)
  return loss_value, tape.gradient(loss_value, model.trainable_variables) 

Но при расчете градиента вес tf.constant (0) имеет градиент, не равный нулю. У меня есть проблема с пониманием?

Как мне установить вес (или некоторые веса) в слое ( не все веса в одном слое) на постоянное значение (которое должно не меняется во время тренировки)?

1 Ответ

0 голосов
/ 11 января 2019

Мой ответ основан на слое CustomConnected из этого ответа . Как я сказал в комментарии, когда вы умножаете вес w_ij на c_ij=0 через матрицу соединений, градиент потерь по отношению к этому весу также становится равным нулю (поскольку последний фактор в правиле цепочки соответствует c_ij=0).

Вот минимальный пример в Керасе:

# Using CustomConnected from:
# https://stackoverflow.com/questions/50290769/specify-connections-in-nn-in-keras  
import tensorflow as tf
import numpy as np

tf.enable_eager_execution()

# Define model
inp = tf.keras.layers.Input(shape=(2,))
c = np.array([[1., 1.], [1., 0.]], dtype=np.float32)
h = CustomConnected(2, c)(inp)
model = tf.keras.models.Model(inp, h)

# Set initial weights and compile
w = [np.random.rand(2, 2) * c]
model.set_weights(w)
model.compile(tf.train.AdamOptimizer(), 'mse')

# Check gradients
x = tf.constant(np.random.rand(10, 2), dtype=tf.float32)
y = np.random.rand(10, 2)

with tf.GradientTape() as tape:
    loss_value = tf.losses.mean_squared_error(labels=y, predictions=model(x))
    grad = tape.gradient(loss_value, model.trainable_variables)
    print('Gradients: ', grad[0])

Обратите внимание, что я установил c[1,1]=0, поэтому градиент, соответствующий весу w[1,1], равен 0 независимо от ввода.

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