我正在使用以下代码创建CNN图层。
conv1 = tf.layers.conv2d(inputs = input, filters = 20, kernel_size = [3,3],
padding = "same", activation = tf.nn.relu)
我希望在训练后获得所有内核的值。它不起作用我只是做
kernels = conv1.kernel
那么我该如何检索这些内核的值呢?我也不确定conv2d有哪些变量和方法,因为张量流不能在conv2d类中真正告诉它。
答案 0 :(得分: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))
将图表恢复为:
gr = tf.get_default_graph()
将内核值恢复为:
conv1_kernel_val = gr.get_tensor_by_name('conv1/kernel:0').eval()
将偏差值恢复为:
conv1_bias_val = gr.get_tensor_by_name('conv1/bias:0').eval()
答案 1 :(得分:0)
您的意思是想要获取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()
这是我用来定义5个卷积层的例子,这个例子直接来自我的代码,所以请注意它的5个卷积层没有使用max pooling或任何东西,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
还有一个关于如何建立卷积网络的tensorflow网站上的一个很好的教程:
https://www.tensorflow.org/tutorials/deep_cnn
你问题的直接答案是卷积层的权重在那里被定义为w
,这是你正在理解我是否正确理解你的张量。