2017-11-07 17 views
1

tf.layers.conv2dを使用する場合、イニシャライザの設定は簡単ですが、パラメータを使用して行うことができます。しかし、tf.nn.conv2dを使用すればどうなりますか?私はこのコードを使用します。これはkernel_initializerパラメータをtf.layers.conv2dに設定するのと同じですか?プログラムはエラーなく実行されますが、期待どおりに動作するかどうかを確認する方法はわかりません。tf.nn.conv2dでウェイト初期化子を使用

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] 

答えて

0

下の操作は同じです(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!') 

、出力がある... カーネルはまったく同じあります。

ドキュメント、btw:tf.nn.conv2dおよびtf.layers.conv2d

関連する問題