python-3.x - 在卷积操作中修复/冻结单个内核权重
问题描述
我正在尝试一种解决方法,以使用 Python 3.7 在 TensorFlow 中的卷积运算中修复单个内核权重。我通过创造来做到这一点
- 一个可训练的变量,
- 一个相同的不可训练变量和
- 由1和0组成的“掩码”张量,其形状与上述步骤 1 和 2 中创建的变量相同。
“掩码”张量中的1表示我想在训练期间修复/冻结该特定权重,即不在后向传递中更新它。
现在,这种解决方法在应用于全连接层时工作得非常好,但在应用于卷积层时会失败,我不知道为什么或如何使它工作。
tf.nn.conv2d()函数调用中似乎发生了一些事情(参见下面的代码示例),根据文档,这就是他们所做的:
给定一个 shape 的输入张量
[batch, in_height, in_width, in_channels]
和一个 shape 的过滤器/内核张量
[filter_height, filter_width, in_channels, out_channels]
,此操作
执行以下操作:
1. 将过滤器展平为一个具有 shape 的二维矩阵
[filter_height * filter_width * in_channels, output_channels]
。
2. 从输入张量中提取图像块,形成形状为 的虚拟
张量[batch, out_height, out_width,<br> filter_height * filter_width * in_channels]
。
3. 对于每个补丁,右乘滤波器矩阵和图像补丁
向量。
但是由于我使用weights_frozen这是一个张量并且取决于可训练变量、不可训练变量和mask_weights它应该在我在mask_weights张量中有 1 的位置获得零值梯度。
def conv(input_, layer_name...):
weights = tf.get_variable(shape=[filter_height, filter_width, in_channels, out_channels], dtype=tf.float32, initializer=tf.glorot_uniform_initializer(), trainable=True)
weights_fixed = tf.Variable(tf.identity(weights), trainable=False)
mask_weights = tf.placeholder(tf.float32, weights.shape)
weights_frozen = tf.add(tf.multiply(mask_weights, weights_fixed), tf.multiply((1 - mask_weights), weights))
out_conv = tf.nn.conv2d(input=input_, filter=weights_frozen, strides=strides_, padding='SAME')
out_add = tf.nn.bias_add(value=out_conv, bias=biases_frozen)
out = tf.nn.relu(features=out_add)
return out
如前所述,我希望在mask_weights张量中有1的位置获得零值梯度,但它们不是零,因此正在训练这些权重,这不是我想要实现的行为.
解决方案
推荐阅读
- postgresql - 升级bitnami postgresql镜像k8s
- css - 有条件地将 CSS 文件导入 Angular 组件
- javascript - 在新选项卡中打开仅包含来自 PostgreSQL 的图像数据 URI 的图像
- reactjs - 在 React 中排序后如何导出表格?
- c# - Xamarin Forms - 无法在运行时翻译菜单项
- javascript - 多个createObjectURL时加载资源err_file_not_found失败
- syntax - 使用 jq 删除重复项
- appium - Appium 桌面未在 MAC 中启动 Appium Inspector UI
- testing - 使用 cypress 在第一次尝试时失败,但在第二次尝试时总是通过而不重试
- python - 比较两个文件并将新列添加到文件一,如果为真