Keras에서 "Flatten"의 역할은 무엇입니까?


108

FlattenKeras 에서 기능 의 역할을 이해하려고합니다 . 아래는 간단한 2 계층 네트워크 인 내 코드입니다. 모양 (3, 2)의 2 차원 데이터를 가져 와서 모양 (1, 4)의 1 차원 데이터를 출력합니다.

model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

x = np.array([[[1, 2], [3, 4], [5, 6]]])

y = model.predict(x)

print y.shape

이것은 y(1, 4) 모양을 출력합니다 . 그러나 Flatten선을 제거하면 y(1, 3, 4) 모양이 인쇄됩니다 .

나는 이것을 이해하지 못한다. 신경망에 대한 나의 이해에서이 model.add(Dense(16, input_shape=(3, 2)))기능은 16 개의 노드로 숨겨진 완전 연결 계층을 생성하는 것입니다. 이러한 각 노드는 3x2 입력 요소 각각에 연결됩니다. 따라서이 첫 번째 계층의 출력에있는 16 개의 노드는 이미 "평평"합니다. 따라서 첫 번째 레이어의 출력 모양은 (1, 16)이어야합니다. 그런 다음 두 번째 레이어는 이것을 입력으로 받아 (1, 4) 모양의 데이터를 출력합니다.

따라서 첫 번째 레이어의 출력이 이미 "평평"하고 모양 (1, 16) 인 경우 더 평면화해야하는 이유는 무엇입니까?

답변:


123

에 대한 Keras 문서 항목을 읽으면 Dense다음 호출을 볼 수 있습니다.

Dense(16, input_shape=(5,3))

Dense3 개의 입력과 16 개의 출력이 있는 네트워크 가 생성되며 이는 5 단계 각각에 대해 독립적으로 적용됩니다. 그래서, 만약 D(x)당신이 벡터의 순서가 될 것입니다 귀하의 계층에서 출력으로 얻을 것이다 무엇 16-D 벡터로 변환 3 차원 벡터 : [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]모양은 (5, 16). 동작을 지정하려면 먼저 Flatten15d 벡터에 입력 한 다음 적용 할 수 있습니다 Dense.

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

편집 : 일부 사람들은 이해하기 위해 고군분투했습니다. 여기에 설명 이미지가 있습니다.

여기에 이미지 설명 입력


설명해 주셔서 감사합니다. 하지만 명확히하기 위해 :를 사용 Dense(16, input_shape=(5,3)하면 16 개 집합 (그리고 이러한 뉴런의 5 개 집합 모두에 대해)의 각 출력 뉴런이 모든 (3 x 5 = 15) 입력 뉴런에 연결됩니까? 또는 첫 번째 16 개 세트의 각 뉴런은 첫 번째 5 개 입력 뉴런 세트의 3 개 뉴런에만 연결되고 두 번째 16 개 세트의 각 뉴런은 5 개 입력 두 번째 세트의 3 개 뉴런에만 연결됩니다. 뉴런, 등등 ... 나는 그것이 무엇인지 혼란 스럽습니다!
Karnivaurus 2017

1
3 개의 뉴런을 얻고 3 개의 뉴런의 5 개 세트 각각에 적용되는 16 개의 출력을 얻는 하나의 Dense 레이어가 있습니다.
Marcin Możejko 2017

1
그래. 내가하려는 것은 입력으로 5 개의 컬러 픽셀 목록을 가져 와서 완전히 연결된 레이어를 통과하도록하는 것입니다. 그래서 input_shape=(5,3)수단이 5 개 화소이며, 각 화소에 3 개 채널 (R, G, B)를 가지고있다. 하지만 말씀하신 내용에 따르면 각 채널은 개별적으로 처리되는 반면 세 채널은 모두 첫 번째 레이어의 모든 뉴런에 의해 처리되기를 원합니다. 그래서 Flatten처음에 레이어를 적용하면 내가 원하는 것을 얻을 수 있습니까?
Karnivaurus 2017

8
유무에 관계없이 약간의 그림이 Flatten이해하는 데 도움이 될 수 있습니다.
Xvolks

2
좋아, 여러분-이미지를 제공했습니다. 이제 귀하의 반대표를 삭제할 수 있습니다.
Marcin Możejko 2007 년


35

짧은 읽기 :

텐서를 평평하게한다는 것은 하나를 제외한 모든 차원을 제거하는 것을 의미합니다. 이것이 바로 Flatten 레이어가하는 일입니다.

긴 읽기 :

고려하여 생성 된 원래 모델 (플랫 튼 레이어 포함)을 고려하면 다음 모델 요약을 얻을 수 있습니다.

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

이 요약을 위해 다음 이미지는 각 레이어의 입력 및 출력 크기에 대해 조금 더 이해하기를 바랍니다.

읽을 수있는 Flatten 레이어의 출력 모양은 (None, 48)입니다. 여기에 팁이 있습니다. 당신은 그것을 읽어야합니다 (1, 48)또는 (2, 48)또는 ... 또는 (16, 48)... 또는 (32, 48), ...

실제로 None해당 위치는 배치 크기를 의미합니다. 리콜 할 입력의 경우 첫 번째 차원은 배치 크기를 의미하고 두 번째 차원은 입력 기능의 수를 의미합니다.

Keras 에서 Flatten 레이어 의 역할 은 매우 간단합니다.

텐서에 대한 평면화 작업 은 배치 차원을 포함하지 않고 텐서에 포함 된 요소의 수와 동일한 모양을 갖도록 텐서를 재구성 합니다 .

여기에 이미지 설명 입력


참고 :이 model.summary()메서드를 사용하여 출력 모양 및 매개 변수 세부 정보를 제공했습니다.


1
매우 통찰력있는 다이어그램.
Shrey Joshi

1
다이어그램 주셔서 감사합니다. 그것은 나에게 명확한 그림을 준다.
Sultan Ahmed Sagor

0

Flatten은 다차원 텐서 (일반적으로 입력)를 직렬화하는 방법을 명시합니다. 이를 통해 (평탄화 된) 입력 텐서와 첫 번째 히든 레이어 간의 매핑이 가능합니다. 첫 번째 히든 레이어가 "밀집"이면 (직렬화 된) 입력 텐서의 각 요소는 히든 배열의 각 요소와 연결됩니다. Flatten을 사용하지 않으면 입력 텐서가 첫 번째 숨겨진 레이어에 매핑되는 방식이 모호합니다.


0

나는 최근에 이것을 보았고 확실히 이해하는 데 도움이되었습니다 : https://www.cs.ryerson.ca/~aharley/vis/conv/

그래서 입력, Conv2D, MaxPooling2D 등이 있습니다. Flatten 레이어는 끝에 있으며 어떻게 형성되고 최종 분류 (0-9)를 정의하기 위해 어떻게 진행되는지 정확히 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.