2017-11-29 21 views
2

정말 천천히 진행되는 무언가에 내 머리를 긁적이며 다시 최적화 할 수 있기를 바랍니다.TensorFlow에서 채널별로 완전히 연결된 레이어를 적용하는 방법

그래서 TensorFlow에서 인코더와 디코더 사이에 큰 잠복 공간이있는 컨볼 루션 자동 인코더를 구현하려고합니다. 이제는 일반적으로 완전히 연결된 레이어가있는 디코더에 인코더를 연결하지만 잠재적 인 공간은 높은 차원을 가지므로 계산하기에 너무 많은 기능을 생성하게됩니다.

this paper에서이 문제에 대한 멋진 해결책을 발견했습니다. 그들은 그것을 '채널과 완전히 연결된 층'이라고 부릅니다. 기본적으로 채널 당 완전히 연결된 레이어입니다.

나는 이것을 구현하려고하고 실제로 작동 시키지만, 그래프의 생성에는 오랜 시간이 걸린다. 지금까지 내 코드입니다 :

def _network(self, dataset, isTraining): 
     encoded = self._encoder(dataset, isTraining) 
     with tf.variable_scope("fully_connected_channel_wise"): 
      shape = encoded.get_shape().as_list() 
      print(shape) 
      channel_wise = tf.TensorArray(dtype=tf.float32, size=(shape[-1])) 
      for i in range(shape[-1]): # last index in shape should be the output channels of the last conv 
       channel_wise = channel_wise.write(i, self._linearLayer(encoded[:,:,i], shape[1], shape[1]*4, 
            name='Channel-wise' + str(i), isTraining=isTraining)) 
      channel_wise = channel_wise.concat() 
      reshape = tf.reshape(channel_wise, [shape[0], shape[1]*4, shape[-1]]) 
     reconstructed = self._decoder(reshape, isTraining) 
     return reconstructed 

그래서 왜 이렇게 오래 걸리나요? 실제로는 범위 (2048)이지만 모든 선형 레이어는 실제로 작습니다 (4x16). 나는 이것을 잘못된 방향으로 접근하고 있는가?

감사합니다.

답변

1

Tensorflow에서 해당 용지의 구현을 확인할 수 있습니다. 여기에 '채널별로 완전히 연결된 레이어'가 구현되었습니다.

https://github.com/jazzsaxmafia/Inpainting/blob/8c7735ec85393e0a1d40f05c11fa1686f9bd530f/src/model.py#L60

주요 아이디어

def channel_wise_fc_layer(self, input, name): # bottom: (7x7x512) 
    _, width, height, n_feat_map = input.get_shape().as_list() 
    input_reshape = tf.reshape(input, [-1, width*height, n_feat_map]) 
    input_transpose = tf.transpose(input_reshape, [2,0,1]) 

    with tf.variable_scope(name): 
     W = tf.get_variable(
       "W", 
       shape=[n_feat_map,width*height, width*height], # (512,49,49) 
       initializer=tf.random_normal_initializer(0., 0.005)) 
     output = tf.batch_matmul(input_transpose, W) 

    output_transpose = tf.transpose(output, [1,2,0]) 
    output_reshape = tf.reshape(output_transpose, [-1, height, width, n_feat_map]) 

    return output_reshape 

는 tf.batch_matmul 기능을 사용하고 있습니다.

그러나 tf.batch_matmul은 Tensorflow의 최신 버전에서 제거되었으므로 tf.matmul을 사용하여 대체 할 수 있습니다.

+0

이 링크는 질문에 대답 할 수 있지만 답변의 핵심 부분을 여기에 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [검토 중] (리뷰/저품절 게시물/18677744) – aerokite

+0

@aerokite 고마워, 이미 내 대답을 수정했습니다. – Haibo

+0

와우! 감사! 나는 그들이 온라인 구현을 가지고 있으며 텍스트에서도 언급하지 않는다고 믿을 수 없다! 또한 이것은 내가하고있는 것과는 아주 거리가 멀다. 나는 그들이 나처럼 똑같은 문제가 있는지 궁금하다. –