2017-03-09 2 views
6

자동 인코딩을 구현하는 데 tf.slim을 사용하고 있습니다. 그것은이Tensorflow에서 레이어 가중치 재사용

[conv, outputs = 1] => [conv, outputs = 15] => [conv, outputs = 25] => 
=> [conv_transpose, outputs = 25] => [conv_transpose, outputs = 15] => 
[conv_transpose, outputs = 1] 

완전히 길쌈로 나는 (더 큰 문제의 제한)를 풀링 할 수 없습니다 : 나는 다음과 같은 아키텍처와 완벽하게 길쌈입니다. 나는 묶여 가중치를 사용하려면, 그래서

encoder_W_3 = decoder_W_1_Transposed 

(제 1 디코더 층의 때문에 무게는 마지막 인코더 층의 사람, 전치이다). 나는 무게를 재사용하는 경우

정규 방법 tfslim은 당신이 그들을 다시 사용할 수 있습니다, 즉 재사용 = TRUE 후 바로 재사용 할 레이어의 범위 이름을 제공, 내가 할 크기 문제 :

ValueError: Trying to share variable cnn_block_3/weights, but specified shape (21, 11, 25, 25) and found shape (21, 11, 15, 25). 

이가 있습니다 이전 모델의 가중치를 조 변경하지 않으면 의미가 있습니다. 누구든지 그 무게를 어떻게 바꿀 수 있는지에 대한 아이디어가 있습니까?

추신 : 저는 이것이 매우 추상적이며 손을 흔드는 것을 알고 있지만 tfslim 위에 사용자 정의 api로 작업 중이므로 여기에 코드 예제를 게시 할 수 없습니다.

+0

아시다시피 Tensorflow의 가중치는 '[filter_height, filter_width, in_channels, out_channels]'형식으로되어 있습니다. 각 레이어에 대해 동일한 필터 크기가 있다고 가정하기 때문에 가중치를 조 변경하면 디코더와 코더에 대한 대응이 있어야합니다. 예를 들어'[outputs = 1] => [outputs = 15]'는'[outputs = 15] => [outputs = 1]'에서만 사용할 수 있습니다. 오류 메시지에서 '15 => 25'가 '25 => 25'에 할당되었다고 생각합니다. 그러나이 두 레이어의 가중치 수가 다르면 어떻게 공유 할 수 있습니까? – Seven

답변

2

그 무게를 어떻게 옮길 수 있습니까?

조옮김은 간단하다 :

new_weights = tf.transpose(weights, perm=[0, 1, 3, 2]) 

지난 2 개 축을 교환합니다.

그러나 위에서 언급 한대로 전체 가중치 수가 변경되면 오류를 해결하기에 충분하지 않습니다.

+0

이것은 기존 변수의 조 변경에 적합합니다. 그러나 tf.slim을 사용하면 커널 가중치가 추상화 뒤에 숨겨져 있으므로 재사용 (및 변환)은 아직 알려지지 않은 다른 방법을 통해 수행해야합니다. –

관련 문제