2017-11-07 7 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.conv2dtf.layers.conv2d.