Explicação de entrada de Keras: input_shape, units, batch_size, dim, etc

262

Para qualquer camada Keras ( Layerclasse), alguém pode explicar como entender a diferença entre input_shape, units, dim, etc.?

Por exemplo, o documento diz unitsespecificar a forma de saída de uma camada.

Na imagem da rede neural abaixo hidden layer1tem 4 unidades. Isso se traduz diretamente no unitsatributo do Layerobjeto? Ou unitsem Keras é igual a forma de cada peso na camada oculta multiplicado pelo número de unidades?

Em resumo, como entender / visualizar os atributos do modelo - em particular as camadas - com a imagem abaixo? insira a descrição da imagem aqui

espantalho
fonte

Respostas:

412

Unidades:

A quantidade de "neurônios", ou "células", ou o que a camada tiver dentro dela.

É uma propriedade de cada camada e, sim, está relacionada à forma de saída (como veremos mais adiante). Na sua imagem, exceto pela camada de entrada, que é conceitualmente diferente de outras camadas, você tem:

  • Camada oculta 1: 4 unidades (4 neurônios)
  • Camada oculta 2: 4 unidades
  • Última camada: 1 unidade

Formas

Formas são consequências da configuração do modelo. Formas são tuplas representando quantos elementos uma matriz ou tensor possui em cada dimensão.

Ex: uma forma(30,4,10) significa uma matriz ou tensor com 3 dimensões, contendo 30 elementos na primeira dimensão, 4 na segunda e 10 na terceira, totalizando 30 * 4 * 10 = 1200 elementos ou números.

A forma de entrada

O que flui entre as camadas são tensores. Os tensores podem ser vistos como matrizes, com formas.

Em Keras, a própria camada de entrada não é uma camada, mas um tensor. É o tensor inicial que você envia para a primeira camada oculta. Esse tensor deve ter a mesma forma que seus dados de treinamento.

Exemplo: se você possui 30 imagens de 50x50 pixels em RGB (3 canais), o formato dos dados de entrada é (30,50,50,3). Então o tensor da camada de entrada deve ter esse formato (veja detalhes na seção "shapes in keras").

Cada tipo de camada requer a entrada com um certo número de dimensões:

  • Dense camadas requerem entradas como (batch_size, input_size)
    • ou (batch_size, optional,...,optional, input_size)
  • As camadas convolucionais 2D precisam de entradas como:
    • se estiver usando channels_last:(batch_size, imageside1, imageside2, channels)
    • se estiver usando channels_first:(batch_size, channels, imageside1, imageside2)
  • Convoluções 1D e uso recorrente de camadas (batch_size, sequence_length, features)

Agora, o formato de entrada é o único que você deve definir, porque seu modelo não pode conhecê-lo. Só você sabe disso, com base nos seus dados de treinamento.

Todas as outras formas são calculadas automaticamente com base nas unidades e particularidades de cada camada.

Relação entre formas e unidades - A forma de saída

Dada a forma de entrada, todas as outras formas são resultados de cálculos de camadas.

As "unidades" de cada camada definirão a forma de saída (a forma do tensor produzido pela camada e que será a entrada da próxima camada).

Cada tipo de camada funciona de uma maneira específica. Camadas densas têm formato de saída baseado em "unidades", camadas convolucionais têm formato de saída baseado em "filtros". Mas é sempre baseado em alguma propriedade da camada. (Veja a documentação para o que cada camada produz)

Vamos mostrar o que acontece com as camadas "Densas", que são o tipo mostrado no seu gráfico.

Uma camada densa tem uma forma de saída de (batch_size,units). Portanto, sim, as unidades, a propriedade da camada, também definem o formato da saída.

  • Camada escondida 1: 4 unidades, forma saída: (batch_size,4).
  • Camada escondida 2: 4 unidades, forma saída: (batch_size,4).
  • Última camada: 1 unidade, forma saída: (batch_size,1).

Pesos

Os pesos serão totalmente calculados automaticamente com base nas formas de entrada e saída. Novamente, cada tipo de camada funciona de uma certa maneira. Mas os pesos serão uma matriz capaz de transformar a forma de entrada na forma de saída por alguma operação matemática.

Em uma camada densa, os pesos multiplicam todas as entradas. É uma matriz com uma coluna por entrada e uma linha por unidade, mas isso geralmente não é importante para trabalhos básicos.

Na imagem, se cada seta tivesse um número de multiplicação, todos os números juntos formariam a matriz de pesos.

Formas em Keras

Anteriormente, dei um exemplo de 30 imagens, 50x50 pixels e 3 canais, tendo uma forma de entrada de (30,50,50,3).

Como o formato de entrada é o único que você precisa definir, o Keras o exigirá na primeira camada.

Mas nesta definição, Keras ignora a primeira dimensão, que é o tamanho do lote. Seu modelo deve ser capaz de lidar com qualquer tamanho de lote; portanto, você define apenas as outras dimensões:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

Opcionalmente, ou quando exigido por certos tipos de modelos, você pode passar a forma que contém o tamanho do lote por meio de batch_input_shape=(30,50,50,3)ou batch_shape=(30,50,50,3). Isso limita suas possibilidades de treinamento a esse tamanho de lote exclusivo; portanto, ele deve ser usado apenas quando realmente necessário.

De qualquer maneira que você escolher, os tensores no modelo terão a dimensão do lote.

Portanto, mesmo que você tenha usado input_shape=(50,50,3), quando o keras envia mensagens ou quando você imprime o resumo do modelo, ele será exibido (None,50,50,3).

A primeira dimensão é o tamanho do lote, Nonepois pode variar dependendo de quantos exemplos você dá para o treinamento. (Se você definiu o tamanho do lote explicitamente, o número que você definiu aparecerá em vez de None)

Além disso, em trabalhos avançados, quando você realmente opera diretamente nos tensores (dentro das camadas Lambda ou na função de perda, por exemplo), a dimensão do tamanho do lote estará lá.

  • Portanto, ao definir o formato da entrada, você ignora o tamanho do lote: input_shape=(50,50,3)
  • Ao realizar operações diretamente em tensores, a forma será novamente (30,50,50,3)
  • Quando o keras envia uma mensagem, a forma será (None,50,50,3)ou (30,50,50,3), dependendo do tipo de mensagem que ele enviar.

Dim

E no final, o que é dim?

Se o seu formato de entrada tiver apenas uma dimensão, você não precisará fornecê-lo como uma tupla, mas sim como um input_dimnúmero escalar.

Portanto, no seu modelo, onde sua camada de entrada possui 3 elementos, você pode usar qualquer um destes dois:

  • input_shape=(3,) - A vírgula é necessária quando você possui apenas uma dimensão
  • input_dim = 3

Porém, ao lidar diretamente com os tensores, geralmente dimse refere a quantas dimensões um tensor possui. Por exemplo, um tensor com forma (25,10909) tem 2 dimensões.


Definindo sua imagem no Keras

Keras tem duas maneiras de fazer isso, Sequentialmodelos ou a API funcional Model. Eu não gosto de usar o modelo seqüencial, mais tarde você terá que esquecê-lo de qualquer maneira, porque você quer modelos com ramificações.

PS: aqui eu ignorei outros aspectos, como funções de ativação.

Com o modelo Sequencial :

from keras.models import Sequential  
from keras.layers import *  

model = Sequential()    

#start from the first hidden layer, since the input is not actually a layer   
#but inform the shape of the input, with 3 elements.    
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input

#further layers:    
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer   

Com o modelo de API funcional :

from keras.models import Model   
from keras.layers import * 

#Start defining the input tensor:
inpTensor = Input((3,))   

#create the layers and pass them the input tensor to get the output tensor:    
hidden1Out = Dense(units=4)(inpTensor)    
hidden2Out = Dense(units=4)(hidden1Out)    
finalOut = Dense(units=1)(hidden2Out)   

#define the model's start and end points    
model = Model(inpTensor,finalOut)

Formas dos tensores

Lembre-se de ignorar os tamanhos dos lotes ao definir as camadas:

  • inpTensor: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • finalOut: (None,1)
Daniel Möller
fonte
7
Uma pergunta sobre o input_shape=parâmetro permanece: a qual dimensão o primeiro valor do argumento se refere? Eu vejo coisas assim input_shape=(728, ), então, na minha opinião, o primeiro argumento se refere a colunas (fixas) e o segundo a linhas (livres para variar). Mas como isso se encaixa na ordem de matrizes principais do Python?
precisa saber é o seguinte
17
Essa vírgula não cria uma segunda dimensão. É apenas uma notação python para criar um tupleque contém apenas um elemento. input_shape(728,)é o mesmo que batch_input=(batch_size,728). Isso significa que cada amostra possui 728 valores.
Daniel Möller
@ DanielMöller: você poderia elaborar um pouco qual é a diferença entre "elementos de entrada" e "dimensões"? Eu pensaria que o gráfico acima tinha uma camada de entrada tridimensional, tornando dim = 3 , então estou me perguntando o que estou perdendo aqui, porque vejo que você escreve que a entrada é unidimensional ...
Helen
1
Um vetor tem uma dimensão, mas muitos elementos. Possui forma (n,) ---- Uma matriz possui duas dimensões, a dimensão 0 possui m elementos, a dimensão 1 possui n elementos, totalizando elementos mxn, forma (m, n). Se você imaginar um "cubo" dividido em pequenos cubos, cada cubo com dados, este seria 3D, com elementos mxnxo, forma (m, n, o).
Daniel Möller
2
@Prince, a ordem é importante. Você pode configurar o Keras para usar data_format = 'channels_first'ou data_format='channels_last'. Eu recomendo usar sempre os canais por último (o padrão de Keras). É mais compatível com todas as outras camadas.
Daniel Möller
11

Dimensão de entrada esclarecida:

Não é uma resposta direta, mas acabei de perceber que a palavra Dimensão de Entrada pode ser bastante confusa, portanto, tenha cuidado:

Ele (apenas a dimensão dimensão) pode se referir a:

a) A dimensão dos dados de entrada (ou fluxo) , como # N dos eixos dos sensores, para transmitir o sinal da série temporal ou o canal de cores RGB (3): palavra sugerida => "Dimensão do fluxo de entrada "

b) O número / comprimento total de recursos de entrada (ou camada de entrada) (28 x 28 = 784 para a imagem colorida MINST) ou 3000 nos valores de espectro transformados pela FFT, ou

"Camada de entrada / dimensão do recurso de entrada"

c) A dimensionalidade (# da dimensão) da entrada (normalmente 3D como esperado no Keras LSTM) ou (#RowofSamples, #of Senors, #of Values ​​..) 3 é a resposta.

"N dimensionalidade da entrada"

d) O formato de entrada ESPECÍFICO (por exemplo, (30,50,50,3) nesses dados de imagem de entrada não empacotados ou (30, 250, 3) se Keras não desembrulhados :

Keras tem seu input_dim refere-se à dimensão da camada de entrada / número de recursos de entrada

model = Sequential()
model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
model.add(Activation('relu'))

No Keras LSTM, refere-se ao total de etapas de tempo

O termo tem sido muito confuso, está correto e vivemos em um mundo muito confuso !!

Acho que um dos desafios do Machine Learning é lidar com diferentes idiomas, dialetos e terminologias (como se você tiver de 5 a 8 versões muito diferentes do inglês, precisará de uma proficiência muito alta para conversar com diferentes falantes). Provavelmente também é o mesmo nas linguagens de programação.

r poon
fonte