【问题标题】:Set weight and bias tensors of tensorflow conv2d operation设置tensorflow conv2d操作的权重和偏置张量
【发布时间】:2016-07-13 09:35:09
【问题描述】:

我在 Torch 中获得了一个训练有素的神经网络,我需要在 tensorflow 中完全重建它。我相信我已经在 tensorflow 中正确定义了网络的架构,但是我在传输权重和偏差张量时遇到了麻烦。使用第三方包,我将所有权重和偏差张量从火炬网络转换为 numpy 数组,然后将它们写入磁盘。我可以将它们重新加载到我的 python 程序中,但我无法找到一种方法将它们分配给我的 tensorflow 网络中的相应层。

例如,我在 tensorflow 中定义了一个卷积层

kernel_1 = tf.Variable(tf.truncated_normal([11,11,3,64], stddev=0.1))
conv_kernel_1 = tf.nn.conv2d(input, kernel_1, [1,4,4,1], padding='SAME')
biases_1 = tf.Variable(tf.zeros[64])
bias_layer_1 = tf.nn_add(conv_kernel_1, biases_1)

根据 tensorflow 文档,tf.nn.conv2d 操作使用 kernel_1 变量中定义的形状来构造权重张量。但是,我无法弄清楚如何访问该权重张量以将其设置为我从文件加载的权重数组。

是否可以显式设置权重张量?如果是,怎么做?

(同样的问题也适用于偏置张量。)

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    如果您在 NumPy 数组中有权重和偏差,应该很容易将它们连接到您的 TensorFlow 网络中:

    weights_1_array = ...  # ndarray of weights for layer 1
    biases_1_array = ...  # ndarray of biases for layer 1
    
    conv_kernel_1 = tf.nn.conv2d(input, weights_1_array, [1, 4, 4, 1], padding='SAME')
    bias_layer_1 = tf.nn.bias_add(conv_kernel_1, biases_1_array)
    

    请注意,您必须确保weights_1_arraybiases_1_array 的数据格式正确。有关所需过滤器形状的说明,请参阅 tf.nn.conv2d() 的文档。

    【讨论】:

    • 我已经尝试过这种方法,但它给了我一个错误 ValueError: Shape (64, 363) must have rank 4. 我的理解是 filter 参数定义了权重张量的构造方式
    • 或者我需要重塑加载的重量张量吗?它会在执行期间保留这些值吗?
    • 是的,您可能需要重塑权重张量。 tf.nn.conv2d() 操作要求它是 4-D,尺寸为 [filter_height, filter_width, in_channels, out_channels]
    • (例如,如果是 1 x 1 卷积,您也许可以使用tf.reshape(weights_1_array, [1, 1, 64, 363])。)
    猜你喜欢
    • 2019-06-18
    • 2018-07-27
    • 2017-02-26
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多