Estou tentando entender o papel da Flatten
função em Keras. Abaixo está meu código, que é uma rede simples de duas camadas. Ele recebe dados bidimensionais de forma (3, 2) e produz dados unidimensionais de forma (1, 4):
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
Isso imprime que y
tem forma (1, 4). No entanto, se eu remover a Flatten
linha, ela imprime que y
tem forma (1, 3, 4).
Eu não entendo isso. Do meu conhecimento de redes neurais, a model.add(Dense(16, input_shape=(3, 2)))
função é criar uma camada oculta totalmente conectada, com 16 nós. Cada um desses nós está conectado a cada um dos elementos de entrada 3x2. Portanto, os 16 nós na saída dessa primeira camada já são "planos". Portanto, a forma de saída da primeira camada deve ser (1, 16). Em seguida, a segunda camada leva isso como uma entrada e produz dados de forma (1, 4).
Portanto, se a saída da primeira camada já é "plana" e tem a forma (1, 16), por que preciso achatá-la ainda mais?
fonte
Dense(16, input_shape=(5,3)
, cada neurônio de saída do conjunto de 16 (e, para todos os 5 conjuntos desses neurônios), será conectado a todos (3 x 5 = 15) neurônios de entrada? Ou cada neurônio no primeiro conjunto de 16 será conectado apenas aos 3 neurônios no primeiro conjunto de 5 neurônios de entrada, e então cada neurônio no segundo conjunto de 16 será conectado apenas aos 3 neurônios no segundo conjunto de 5 neurônios de entrada neurônios, etc .... Estou confuso sobre o que é!input_shape=(5,3)
significa que existem 5 pixels, e cada pixel possui três canais (R, G, B). Mas, de acordo com o que você está dizendo, cada canal seria processado individualmente, enquanto eu quero que todos os três canais sejam processados por todos os neurônios na primeira camada. Então, aplicar aFlatten
camada imediatamente no início me daria o que eu quero?Flatten
pode ajudar a entender.É assim que Flatten funciona convertendo Matrix em array único.
fonte
leitura curta:
longa leitura:
Se levarmos em consideração o modelo original (com a camada Flatten) criado, podemos obter o seguinte resumo do modelo:
Para este resumo, a próxima imagem irá fornecer um pouco mais de sentido sobre os tamanhos de entrada e saída para cada camada.
A forma de saída para a camada Flatten como você pode ler é
(None, 48)
. Aqui está a dica. Você deve ler(1, 48)
ou(2, 48)
ou ... ou(16, 48)
... ou(32, 48)
, ...Na verdade,
None
nessa posição significa qualquer tamanho de lote. Para que as entradas sejam recuperadas, a primeira dimensão significa o tamanho do lote e a segunda significa o número de recursos de entrada.A função da camada Flatten em Keras é super simples:
Uma operação de achatamento em um tensor remodela o tensor para ter a forma que é igual ao número de elementos contidos no tensor, não incluindo a dimensão do lote .
Observação: usei o
model.summary()
método para fornecer a forma de saída e os detalhes dos parâmetros.fonte
Flatten torna explícito como você serializa um tensor multidimensional (tipicamente o de entrada). Isso permite o mapeamento entre o tensor de entrada (achatado) e a primeira camada oculta. Se a primeira camada oculta for "densa", cada elemento do tensor de entrada (serializado) será conectado a cada elemento da matriz oculta. Se você não usar Flatten, a maneira como o tensor de entrada é mapeado na primeira camada oculta seria ambígua.
fonte
Eu me deparei com isso recentemente, certamente me ajudou a entender: https://www.cs.ryerson.ca/~aharley/vis/conv/
Portanto, há uma entrada, um Conv2D, MaxPooling2D etc, as camadas Flatten estão no final e mostram exatamente como são formadas e como vão para definir as classificações finais (0-9).
fonte