Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 决定是否根据特征上的条件更新权重_Python_Tensorflow_Keras_Neural Network_Backpropagation - Fatal编程技术网

Python 决定是否根据特征上的条件更新权重

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]且所有

我想根据特征值决定是否训练一些特定的重量

作为一个简单的尝试,我只想“触摸”输入层和第一层之间的权重,这样,如果特征上的条件保持不变,则不训练(更新)连接第一层和输入神经元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]且所有值均为非零值,我希望一切正常工作。但是,我想提供一个类似[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 ]])