如何在Tensorflow中获取CNN内核值

Ziy*_*Zhu 4 tensorflow

我使用下面的代码来创建CNN图层.

conv1 = tf.layers.conv2d(inputs = input, filters = 20, kernel_size = [3,3],
    padding = "same", activation = tf.nn.relu)
Run Code Online (Sandbox Code Playgroud)

我希望在训练后获得所有内核的值.它不起作用,我只是这样做

kernels = conv1.kernel
Run Code Online (Sandbox Code Playgroud)

那么我应该如何检索这些内核的值呢?我也不确定conv2d有哪些变量和方法,因为tensorflow在conv2d类中没有真正告诉它.

小智 9

您可以在返回的列表中找到所有变量,tf.global_variables()并轻松查找所需的变量.

如果您希望按名称获取这些变量,请将图层声明为:

conv_layer_1 = tf.layers.conv2d(activation=tf.nn.relu, 
                                filters=10, 
                                inputs=input_placeholder, 
                                kernel_size=(3, 3), 
                                name="conv1",         # NOTE THE NAME 
                                padding="same", 
                                strides=(1, 1))
Run Code Online (Sandbox Code Playgroud)

恢复图表为:

gr = tf.get_default_graph()
Run Code Online (Sandbox Code Playgroud)

将内核值恢复为:

conv1_kernel_val = gr.get_tensor_by_name('conv1/kernel:0').eval()
Run Code Online (Sandbox Code Playgroud)

将偏差值恢复为:

conv1_bias_val = gr.get_tensor_by_name('conv1/bias:0').eval()
Run Code Online (Sandbox Code Playgroud)


Dav*_*rks 1

您的意思是您想要获取 conv1 层的权重值。

您实际上还没有使用 conv2d 定义权重,您需要这样做。当我创建卷积层时,我使用一个执行所有必要步骤的函数,这是我用来创建每个卷积层的函数的复制/粘贴:

def _conv_layer(self, name, in_channels, filters, kernel, input_tensor, strides, dtype=tf.float32):
    with tf.variable_scope(name):
        w = tf.get_variable("w", shape=[kernel, kernel, in_channels, filters],
                            initializer=tf.contrib.layers.xavier_initializer_conv2d(), dtype=dtype)
        b = tf.get_variable("b", shape=[filters], initializer=tf.constant_initializer(0.0), dtype=dtype)
        c = tf.nn.conv2d(input_tensor, w, strides, padding='SAME', name=name + "c")
        a = tf.nn.relu(c + b, name=name + "_a")
        print name + "_a", a.get_shape().as_list(), name + "_w", w.get_shape().as_list(), \
            "params", np.prod(w.get_shape().as_list()[1:]) + filters
        return a, w.get_shape().as_list()
Run Code Online (Sandbox Code Playgroud)

这就是我用来定义 5 个卷积层的内容,这个例子直接来自我的代码,所以请注意,它是 5 个卷积层堆叠而成的,没有使用最大池化或任何东西,步长为 2 和 5x5 内核。

    conv1_a, _ = self._conv_layer("conv1", 3,     24, 5, self.imgs4d, [1, 2, 2, 1])   # 24.8 MiB/feature -> 540 x 960
    conv2_a, _ = self._conv_layer("conv2", 24,    80, 5,     conv1_a, [1, 2, 2, 1])   #  6.2 MiB         -> 270 x 480
    conv3_a, _ = self._conv_layer("conv3", 80,   256, 5,     conv2_a, [1, 2, 2, 1])   #  1.5 MiB         -> 135 x 240
    conv4_a, _ = self._conv_layer("conv4", 256,  750, 5,     conv3_a, [1, 2, 2, 1])   #  0.4 MiB         ->  68 x 120
    conv5_a, _ = self._conv_layer("conv5", 750, 2048, 5,     conv4_a, [1, 2, 2, 1])   #  0.1 MiB         ->  34 x  60
Run Code Online (Sandbox Code Playgroud)

在tensorflow网站上还有一个关于如何设置卷积网络的很好的教程:

https://www.tensorflow.org/tutorials/deep_cnn

你的问题的直接答案是,卷积层的权重定义为w,如果我理解正确的话,这就是你要问的张量。