[machine-learning] Keras에서 “Flatten”의 역할은 무엇입니까?

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 개의 노드로 숨겨진 완전 연결 계층을 생성하는 것입니다. 이러한 각 노드는 3×2 입력 요소 각각에 연결됩니다. 따라서이 첫 번째 계층의 출력에있는 16 개의 노드는 이미 “평평”합니다. 따라서 첫 번째 레이어의 출력 모양은 (1, 16)이어야합니다. 그런 다음 두 번째 레이어는 이것을 입력으로 받아 (1, 4) 모양의 데이터를 출력합니다.

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



답변

에 대한 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')

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

여기에 이미지 설명 입력


답변

여기에 이미지 설명 입력
이것은 Flatten이 Matrix를 단일 배열로 변환하는 방식입니다.


답변

짧은 읽기 :

텐서를 평평하게한다는 것은 하나를 제외한 모든 차원을 제거하는 것을 의미합니다. 이것이 바로 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()메서드를 사용하여 출력 모양 및 매개 변수 세부 정보를 제공했습니다.


답변

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


답변

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

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


답변