python - 在 tf.nn.conv2d 中使用权重初始化器

标签 python tensorflow conv-neural-network initializer

使用tf.layers.conv2d时,设置初始化器很简单,可以通过它的参数来完成。但是如果我使用 tf.nn.conv2d 呢?我用这个代码。这是否等同于在 tf.layers.conv2d 中设置 kernel_initializer 参数?虽然程序运行没有错误,但我不知道如何验证它是否按预期执行。

 with tf.name_scope('conv1_2') as scope:
        kernel = tf.get_variable(initializer=tf.contrib.layers.xavier_initializer(), 
                                 shape=[3, 3, 32, 32], name='weights')
        conv = tf.nn.conv2d(conv1_1, kernel, [1, 1, 1, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[32], dtype=tf.float32),
                             trainable=True, name='biases')
        out = tf.nn.bias_add(conv, biases)
        self.conv1_2 = tf.nn.relu(out, name=scope)
        self.parameters += [kernel, biases]

最佳答案

下面的操作是一样的(见here)。

至于内核及其初始化,我瞥了一眼代码,它看起来是一样的……layers.conv2d调用tf .get_variable 在一天结束时。

但我想从经验上看它,所以这里是一个测试代码,它使用每种方法(tf.layers.conv2dtf.nn.conv2d 声明一个 conv2d ), 评估初始化内核并比较它们。

我任意设置了不应该干扰比较的东西,例如输入张量和步幅。

import tensorflow as tf
import numpy as np


# the way you described in your question
def _nn(input_tensor, initializer, filters, size):
    kernel = tf.get_variable(
        initializer=initializer, 
        shape=[size, size, 32, filters],
        name='kernel')

    conv = tf.nn.conv2d(
        input=input_tensor,
        filter=kernel,
        strides=[1, 1, 1, 1],
        padding='SAME')

    return kernel

# the other way
def _layer(input_tensor, initializer, filters, size):
    tf.layers.conv2d(
        inputs=input_tensor,
        filters=filters,
        kernel_size=size,
        kernel_initializer=initializer)

    # 'conv2d/kernel:0' is the name of the generated kernel
    return tf.get_default_graph().get_tensor_by_name('conv2d/kernel:0')

def _get_kernel(method):
    # an isolated context for each conv2d
    graph = tf.Graph()
    sess = tf.Session(graph=graph)

    with graph.as_default(), sess.as_default():
        # important so that same randomness doesnt play a role
        tf.set_random_seed(42)

        # arbitrary input tensor with compatible shape
        input_tensor = tf.constant(1.0, shape=[1, 64, 64, 32])

        initializer = tf.contrib.layers.xavier_initializer()

        kernel = method(
            input_tensor=input_tensor,
            initializer=initializer,
            filters=32,
            size=3)

        sess.run(tf.global_variables_initializer())
        return sess.run(kernel)

if __name__ == '__main__':
    kernel_nn = _get_kernel(_nn)
    kernel_layer = _get_kernel(_layer)

    print('kernels are ', end='')
    # compares shape and values
    if np.array_equal(kernel_layer, kernel_nn):
        print('exactly the same')
    else:
        print('not the same!')

输出是...内核完全相同

文档,顺便说一句:tf.nn.conv2dtf.layers.conv2d .

关于python - 在 tf.nn.conv2d 中使用权重初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167409/

相关文章:

python - 当达到特定的验证准确度时如何停止训练?

python - Bokeh 中的自动图例放置

python - tf.GradientTape 和 backprop.GradientTape 的区别

python - 了解 tf.layers.conv2d 的输入/输出张量

deep-learning - Inception风格的卷积

tensorflow - Keras 自定义损失函数打印张量值

python - 如何使用 TensorFlow 2 数据集从 URL 加载图像

python - Pandas 数据框中的前填充和后填充缺失组值

python方法具有1个变量的嵌套字典

python - zlib 模块丢失