首页 > 解决方案 > ResNet 的 tf-slim 实现上的权重共享

问题描述

我正在尝试应用此处描述的第一种技术(https://arxiv.org/abs/1510.00149)。基本上,我想减轻 ResNet 卷积网络,修改权重的存储和使用方式 - 简要地说,我想将每个权重矩阵转换为索引矩阵,其中每个索引对应于 k 个值的向量,其中每个这些值是原始矩阵给出的 k 个簇上的质心。

为此,我需要更改每个权重存储和用于卷积的方式。我通过在 Tensorflow 中实现的小型 CNN 做到了这一点,我之所以能够做到这一点,是因为通过 tf.nn.conv2d 的操作(https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/nn /conv2d ) 你直接传递 TF 将用于卷积的权重。

现在的问题是我也在尝试将此方法应用于使用 tf-slim 的 ResNet 实现(https://github.com/google-research/tf-slim/tree/8f0215e924996d7287392241bc8d8b1133d0c5ca),在这个实现中每个卷积操作改为使用 tf.python.layers ( https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/layers/Conv2D ) 在模型中应用 - 在这种方法中您无权访问权重矩阵,您只需将输入和要应用的过滤器数量(当然还有其他参数)传递给 Tensorflow,该函数将只返回卷积的结果,隐藏您的权重部分由 Tensorfow 自动存储和训练。

问题是:我怎样才能访问它?有办法解决这个卷积的实现部分吗?我只需要找到一种方法来将实际权重矩阵传递给函数。

谢谢你。

ps 只是给你一些代码和具体的例子:我想以一种我接受模型权重的方式转换这个 tf.slim.convolution 实现,并以一种恢复经典权重矩阵并传递它的方式更新它们到卷积。

layer = tf.layers.Conv2D(
    filters=num_outputs,
    kernel_size=kernel_size,
    strides=stride,
    padding=padding,
    data_format=df,
    dilation_rate=rate,
    activation=None,
    use_bias=not normalizer_fn and biases_initializer,
    kernel_initializer=weights_initializer,
    bias_initializer=biases_initializer,
    kernel_regularizer=weights_regularizer,
    bias_regularizer=biases_regularizer,
    activity_regularizer=None,
    trainable=trainable,
    name=sc.name,
    dtype=inputs.dtype.base_dtype,
    _scope=sc,
    _reuse=reuse)
outputs = layer.apply(inputs)

标签: tensorflowconvolutionresnettf-slim

解决方案


推荐阅读