neural-network - 在 TensorFlow 中选择性地将权重为零?

标签 neural-network tensorflow

假设我有一个 NxM 权重变量 weights和一个由 1 和 0 组成的常数 NxM 矩阵 mask .

如果我的网络层是这样定义的(其他层也有类似的定义):

masked_weights = mask*weights
layer1 = tf.relu(tf.matmul(layer0, masked_weights) + biases1)

这个网络是否会像 mask 中对应的 0 一样?在 weights 中为零在训练中? (即,好像这些权重代表的连接已完全从网络中删除)?

如果没有,我如何在 TensorFlow 中实现这个目标?

最佳答案

答案是肯定的。实验描绘了下图。 enter image description here

实现是:

import numpy as np, scipy as sp, tensorflow as tf

x = tf.placeholder(tf.float32, shape=(None, 3))
weights = tf.get_variable("weights", [3, 2])
bias = tf.get_variable("bias", [2])
mask = tf.constant(np.asarray([[0, 1], [1, 0], [0, 1]], dtype=np.float32)) # constant mask

masked_weights = tf.multiply(weights, mask)
y = tf.nn.relu(tf.nn.bias_add(tf.matmul(x, masked_weights), bias))
loss = tf.losses.mean_squared_error(tf.constant(np.asarray([[1, 1]], dtype=np.float32)),y)

weights_grad = tf.gradients(loss, weights)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
print("Masked weights=\n", sess.run(masked_weights))
data = np.random.rand(1, 3)

print("Graident of weights\n=", sess.run(weights_grad, feed_dict={x: data}))
sess.close()

运行上面的代码后,您将看到渐变也被屏蔽了。在我的例子中,它们是:
Graident of weights
= [array([[ 0.        , -0.40866762],
       [ 0.34265977, -0.        ],
       [ 0.        , -0.35294518]], dtype=float32)]

关于neural-network - 在 TensorFlow 中选择性地将权重为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38278965/

相关文章:

python - 无法在 tensorflow 中实现可重复性

tensorflow - 有没有办法找到 tf.data.Dataset 的批量大小

tensorflow - 如何连接两个模型

python - 如何加载 caffe 模型并转换为 numpy 数组?

tensorflow - 为什么这个模型不能过度拟合一个例子?

python - 平方 (x^2) 近似的神经网络

algorithm - 元素拾取竞赛的AI算法

neural-network - Levenberg–Marquardt 是一种反向传播算法吗?

tensorflow - 图像序列的分类(固定数量)

python - 什么是 tensorflow.compat.as_str()?