神经网络 – TensorFlow中的选择性零权重?

假设我有一个NxM权重可变权重和一个1s和0s掩码的常量NxM矩阵.

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

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

这个网络的行为就像在训练期间掩码中相应的0是重量零一样吗? (即好像那些权重所代表的连接已完全从网络中删除)?

如果没有,我怎样才能在TensorFlow中实现这一目标?

最佳答案 答案是肯定的.该实验描述了以下图表
《神经网络 – TensorFlow中的选择性零权重?》

实施是:

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)]
点赞