CNN에서 출력이 1 차원 벡터 (예 : 사전 로깅 레이어) 인 경우 회선 만 사용하여 차원을 지정된 크기로 줄이면 어떻게됩니까?1 차원 벡터의 차원을 줄이기위한 회선
이러한 작업을 수행하려면 필터 크기/수용 필드를 어떻게 유도합니까?
네트워크의 끝 부분에 완전히 연결된 레이어를 겹쳐서 만들 수 있음을 알고 있지만 너무 우아하지는 않습니다.
CNN에서 출력이 1 차원 벡터 (예 : 사전 로깅 레이어) 인 경우 회선 만 사용하여 차원을 지정된 크기로 줄이면 어떻게됩니까?1 차원 벡터의 차원을 줄이기위한 회선
이러한 작업을 수행하려면 필터 크기/수용 필드를 어떻게 유도합니까?
네트워크의 끝 부분에 완전히 연결된 레이어를 겹쳐서 만들 수 있음을 알고 있지만 너무 우아하지는 않습니다.
사용 아이디어는 원래 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의 공간 필드에 대한이 1x1 컨볼 루션은 완전히 연결된 레이어를 사용하는 것과 정확히 동일하다는 점에 유의할 필요가 있습니다. 이것은 [Network in Network] (https://arxiv.org/abs/1312.4400)의 기초가됩니다. –
컨벌루션 한 후에 풀링 레이어를 추가 할 가능성이 있습니까? 그렇다면이 레이어의 주요 목적 중 하나이며 벡터를 더 낮은 차원으로 다운 샘플링합니다.
그렇지 않으면 적용된 필터의 수는 출력 공간의 차원입니다.
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)
이에 대한 특별한 이유가된다
여기서 64 내지 32 중 텐서 길이를 감소 tensorflow의 코드는,인가? 공간 정보 또는 다른 것을 보존하고 싶습니까? –