Tensorflow에는 활성화 기능으로 tanh
을 사용하는 2 계층 비 길쌈 네트워크가 있습니다. 나는 무게로 나눈 절단 정규 분포로 초기화되어야 함을 이해 sqrt(nInputs)
예 :Supressing 가중치가 Tensorflow 신경 네트워크 성능을 향상시키는 이유는 무엇입니까?
weightsLayer1 = tf.Variable(tf.div(tf.truncated_normal([nInputUnits, nUnitsHiddenLayer1),math.sqrt(nInputUnits))))
가 NN과 Tensorflow에서 더듬 거리는 초보자의 비트가, 내가 실수 만 더 읽을 수 있도록 2 명 선으로이 구현 것 :
weightsLayer1 = tf.Variable(tf.truncated_normal([nInputUnits, nUnitsHiddenLayer1])
weightsLayer1 = tf.div(weightsLayer1, math.sqrt(nInputUnits))
는 지금이 잘못된 것을 알고 그리고 그 두 번째 라인은 무게가 각 학습 단계에서 다시 계산됩니다. 그러나 필자의 생각에 "잘못된"구현은 열차 및 테스트/평가 데이터 세트에서 일관되게 더 나은 성능을 제공합니다. 나는 최적화 과정에서 큰 혼란을 가져올 것으로 예상되는 옵티 마이저에 의해 선택된 값 이외의 다른 값으로 가중치를 다시 계산 (억제)하기 때문에 잘못된 2 행 구현이 열차 사고가되어야한다고 생각했지만 실제로 개선되었다. . 누구든지 이에 대한 설명이 있습니까? Tensorflow adam optimizer를 사용하고 있습니다.
업데이트 2016.6.22 - 위의 두 번째 코드 블록을 업데이트했습니다.
우선, 두 줄 구현에서,''sqrt (nInputUnits)'로 나누기를 두 번하고,''nInputUnits''로 효과적으로 나눕니다. 그게 의도적 인거야? 둘째 : 나는 당신의 질문을 정확하게 이해하지 못합니까? ''weightsLayer1'' 변수가 훈련 단계를 실행할 때마다 다시 초기화되는 것을 염려하십니까? 그렇다면 사실이 아닙니다. 나는 이것에 대해 자세히 설명 할 수는 있지만, 그것이 실제로 묻고있는 것인지 확실하지는 않습니다. – lballes
나의 실수는 위의 두 줄의 경우에 잘못 입력 한 것입니다. 위의 내용을 수정했습니다. 나는 'sqrt (nInputUnits)'로 한 번만 나눕니다. 2 줄의 경우,'weightsLayer1'은'tf.Variable' 줄에서 한번만 초기화된다는 것을 알고 있습니다. 내 질문 : a) 두 번째 라인 (weightsLayer1 = tf.div (weightsLayer1, math.sqrt (nInputUnits)))이 런타임에 실행되는 것이 사실입니까? b) 그렇다면 옵티마이 저가 계산 한 'weightsLayer1'의 값을 수정하여 최적화 과정을 방해합니까?c) 그렇다면 최적화 프로그램에서 계산 한 'weightsLayer1'값보다 어떻게 더 좋을까요? –
좋아, 이제 알았어. 아래 내 대답을 참조하십시오. – lballes