Я строю свою модель, используя 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) имеет градиент, не равный нулю.
У меня есть проблема с пониманием?
Как мне установить вес (или некоторые веса) в слое ( не все веса в одном слое) на постоянное значение (которое должно не меняется во время тренировки)?