program tip

tf.layers.conv2d 및 tf.layers.dense의 기본 커널 이니셜 라이저는 무엇입니까?

radiobox 2020. 11. 28. 08:58
반응형

tf.layers.conv2d 및 tf.layers.dense의 기본 커널 이니셜 라이저는 무엇입니까?


공식 Tensorflow API 문서 에서는 tf.layers.conv2d 및 tf.layers.dense에 대해 kernel_initializer 매개 변수가 기본적으로 None으로 설정되어 있다고 주장합니다.

그러나 레이어 자습서 ( https://www.tensorflow.org/tutorials/layers )를 읽으면서이 매개 변수가 코드에 설정되어 있지 않다는 것을 알았습니다. 예를 들면 :

# Convolutional Layer #1
conv1 = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu)

튜토리얼의 예제 코드는 오류없이 실행되므로 기본값 kernel_initializerNone. 그렇다면 어떤 이니셜 라이저가 사용됩니까?

다른 코드에서는 kernel_initializerconv2d 및 고밀도 레이어를 설정하지 않았 으며 모든 것이 정상이었습니다. 내가 설정하려고 할 때 그러나, kernel_initializertf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), 나는 NaN의 오류를 얻었다. 여기서 무슨 일이 일어나고 있습니까? 누구든지 도울 수 있습니까?


좋은 질문입니다! 알아내는 것은 꽤 속임수입니다!

  • 보시다시피, 문서화되지 않았습니다. tf.layers.conv2d
  • 함수 의 정의를 보면 함수가 variable_scope.get_variable다음을 호출하는 것을 볼 수 있습니다 .

코드에서 :

self.kernel = vs.get_variable('kernel',
                                  shape=kernel_shape,
                                  initializer=self.kernel_initializer,
                                  regularizer=self.kernel_regularizer,
                                  trainable=True,
                                  dtype=self.dtype)

다음 단계 : 이니셜 라이저가 None 일 때 변수 범위는 무엇을합니까?

여기에 말한다 :

initializer가 None(기본값)이면 생성자에 전달 된 기본 이니셜 라이저가 사용됩니다. 이 경우 None에도 새 glorot_uniform_initializer.

그래서 대답은 : glorot_uniform_initializer

완전성을 위해이 이니셜 라이저의 정의 :

Glorot 균일 이니셜 라이저, Xavier 균일 이니셜 라이저라고도합니다. 그것은 내의 균일 분포로부터 샘플을 그리는 [-limit, 한계] 여기서, limit이고 sqrt(6 / (fan_in + fan_out))여기서 fan_in중량 텐서의 입력 유닛의 개수 및 fan_out중량 텐서 출력 유닛의 수이다. 참조 : http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

편집 : 이것은 코드와 문서에서 찾은 것입니다. 가중치에 대해 eval을 실행하여 초기화가 다음과 같은지 확인할 수 있습니다!


Andrew Ng 및 Xavier 문서 의이 과정따르면 ReLU 를 활성화 함수로 사용 하는 경우 기본 가중치 이니셜 라이저 ( Xavier uniform )를 다음과 같이 Xavier normal변경하는 것이 좋습니다 .

y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )

참고 URL : https://stackoverflow.com/questions/43284047/what-is-the-default-kernel-initializer-in-tf-layers-conv2d-and-tf-layers-dense

반응형