1

CNN에서 출력이 1 차원 벡터 (예 : 사전 로깅 레이어) 인 경우 회선 만 사용하여 차원을 지정된 크기로 줄이면 어떻게됩니까?1 차원 벡터의 차원을 줄이기위한 회선

이러한 작업을 수행하려면 필터 크기/수용 필드를 어떻게 유도합니까?

네트워크의 끝 부분에 완전히 연결된 레이어를 겹쳐서 만들 수 있음을 알고 있지만 너무 우아하지는 않습니다.

+0

이에 대한 특별한 이유가된다

여기서 64 내지 32 중 텐서 길이를 감소 tensorflow의 코드는,인가? 공간 정보 또는 다른 것을 보존하고 싶습니까? –

답변

0

사용 아이디어는 원래 All Convolutional Net 논문에서 제안 이후 광범위하게 Inception network에 사용됩니다.

트릭 필터 적은 수 (3-D 등을 위해 2-D에 대한 컨볼 루션 1x1, 1x1x1) 단위 filter으로 컨벌루션을 수행하기위한 것이다. 요즘에는이 트릭이 매우 깊은 컨벌루션 네트워크에서 계산을 저장하기 위해 항상 적용되므로 컨볼 루션 레이어 전에도 사용할 수 있습니다. 귀하의 질문에, 출력 텐서는 1 차원 (일괄 처리 크기 제외)이기 때문에 커널 크기가 1 인 1 차원 컨벌루션을 사용하십시오.

       # `x` shape: [batch, length] = [?, 64] 
layer = tf.expand_dims(x, 2) # reshape to: [batch, channels, 1] = [?, 64, 1] 

output = tf.layers.conv1d(layer, filters=32, kernel_size=1, 
          strides=1, padding='valid', 
          data_format='channels_first') 

           # new shape: [batch, filters, 1] = [?, 32, 1] 
output = tf.squeeze(output) # reshape to: [batch, length] = [?, 32] 
+1

크기 1의 공간 필드에 대한이 1x1 컨볼 루션은 완전히 연결된 레이어를 사용하는 것과 정확히 동일하다는 점에 유의할 필요가 있습니다. 이것은 [Network in Network] (https://arxiv.org/abs/1312.4400)의 기초가됩니다. –

0

컨벌루션 한 후에 풀링 레이어를 추가 할 가능성이 있습니까? 그렇다면이 레이어의 주요 목적 중 하나이며 벡터를 더 낮은 차원으로 다운 샘플링합니다.

그렇지 않으면 적용된 필터의 수는 출력 공간의 차원입니다.

0

1 차원 컨볼 루션이란 무엇입니까? 당신은 다음과 같은 strides를 사용할 수 있습니다

n,w = x.shape 
c = 1 
x = x.reshape(n,w,c) # 1d vector with one 1 channel 
x = conv1d(x, 1, 3, stride=2, pad=1) # 1 filter so output size will be (n,w/2,c) 
x = x.reshape(n,w//2) 

그건 당신에게 당신의 현재 차원의 정수 분열을 줄 것이다. 또는 당신은 당신의 출력에 대한 각 차원의 채널이 다음 전체 1D 지역에 걸쳐 풀 수 :

x = x.reshape(n,w,c) 
x = conv1d(x, d, 3, pad=1) # d filters so output (n,w,d) 
x = x.mean(1) # mean over 1d space so now (n,d) 

이 중 실제로 잘 작동 여부에 대한 보장,하지만 그들은 아마 '원 신경망 인 너무 나쁜 것을 깨지 마십시오.

마지막으로, 속임수 답변 : 차원 감소를 위해 회선을 적용 즉,

x = x.reshape(n,c,w) # (n,1,w) 
x = conv1d(x, d, 1) # (n,1,d) 
x = x.reshape(n,d)