Python 决定是否根据特征上的条件更新权重
我想根据特征值决定是否训练一些特定的重量 作为一个简单的尝试,我只想“触摸”输入层和第一层之间的权重,这样,如果特征上的条件保持不变,则不训练(更新)连接第一层和输入神经元I的所有权重 假设我有这样的模型:Python 决定是否根据特征上的条件更新权重,python,tensorflow,keras,neural-network,backpropagation,Python,Tensorflow,Keras,Neural Network,Backpropagation,我想根据特征值决定是否训练一些特定的重量 作为一个简单的尝试,我只想“触摸”输入层和第一层之间的权重,这样,如果特征上的条件保持不变,则不训练(更新)连接第一层和输入神经元I的所有权重 假设我有这样的模型: model = keras.Sequential([ layers.Dense(2, activation=tf.nn.relu, input_shape=(N, 4)), layers.Dense(1, activation=tf.nn.relu)]) 如果输入为[1,2,3,4]且所有
model = keras.Sequential([
layers.Dense(2, activation=tf.nn.relu, input_shape=(N, 4)),
layers.Dense(1, activation=tf.nn.relu)])
如果输入为[1,2,3,4]且所有值均为非零值,我希望一切正常工作。但是,我想提供一个类似[1,2,3,0]的示例,并使与输入层的第四个神经元相关的权重保持不变且不更新。我试图模拟一种“缺失特征”行为。我可能完全错了。但我认为这个问题没有数学意义。如果输入为零,梯度将为零。因此不会对权重进行更新。让我们做个测试 让我们用零进行一些输入:
import tensorflow as tf
import numpy as np
x = np.array([[1.2, 1.1, 0., 2.3, 4.1]], dtype=np.float32)
y = [0.]
如您所见,缺少第三个值
现在让我们用一个随机目标向前传球,看看梯度:
x = np.array([[1.2, 1.1, 0., 2.3, 4.1]], dtype=np.float32)
y = [0.]
model = tf.keras.Sequential([
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')])
with tf.GradientTape() as tape:
out = model(x)
loss = tf.losses.sparse_categorical_crossentropy(y, out)
gradients = tape.gradient(loss, model.trainable_variables)
np.round(gradients[0].numpy().tolist(), 2)
与输入第3列(第3行)相关的所有渐变均为零。当
optimizer.apply_gradients
将应用于model.fit
中时,将不对与缺失值相关的权重执行任何操作,因为梯度为零。好的,那么可能我采用了错误的方法。我输入中的零应该意味着“缺少功能”,因此,阻止更新连接到它的权重,我想以某种方式禁用网络的该部分。但是我相信你是对的,所以我想做的是自动完成的。更准确地说,假设一个简单的网络,给定3个输入,得到它们的平均值。我希望这对非零输入很好,但是如果我插入[1 0 5],它将给出2作为平均值(因为它是实际的平均值)。但我想给3,因为我不想考虑0(这是我的“失踪的特点”)。你知道怎么做吗?
array([[0. , 0. , 0. , 0.3 , 0. , 0. , 0.17, 1.29],
[0. , 0. , 0. , 0.28, 0. , 0. , 0.15, 1.18],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0.58, 0. , 0. , 0.32, 2.47],
[0. , 0. , 0. , 1.03, 0. , 0. , 0.57, 4.4 ]])