2017-04-06 21 views
1

CNN層を作成するために、以下のコードを使用しています。TensorflowでCNNカーネル値を取得する方法

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

と私はトレーニング後にすべてのカーネルの値を取得したいと思います。それは私が単純にそれを動作しません

kernels = conv1.kernel 

私はこれらのカーネルの値をどのように取得する必要がありますか?私はまた、どのような変数とメソッドがconv2dクラスにあるのかわからないのです。

答えて

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つの畳み込みレイヤー、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のWebサイトで良いのチュートリアルも用意されています:

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

あなたの質問に直接答えは、畳み込み層の重みが定義されているということですwのように、それは私があなたを正しく理解しているかについてあなたが求めているテンソルです。

4

リスト内のすべての変数が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)) 

は、グラフを回復として:

conv1_kernel_val = gr.get_tensor_by_name('conv1/kernel:0').eval() 

gr = tf.get_default_graph() 

としてカーネル値を回復

バイアス値を次のように回復します。

conv1_bias_val = gr.get_tensor_by_name('conv1/bias:0').eval() 
関連する問題