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, None
pois 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_dim
nú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 dim
se 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, Sequential
modelos 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)
input_shape=
parâmetro permanece: a qual dimensão o primeiro valor do argumento se refere? Eu vejo coisas assiminput_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?