Ver no TensorFlow.org | Executar no Google Colab | Ver fonte no GitHub | Baixar caderno |
Visão geral
Este notebook fornece uma introdução breve para as camadas de normalização de TensorFlow. As camadas atualmente suportadas são:
- Grupo de Normalização (TensorFlow Complementos)
- Instância Normalização (TensorFlow Complementos)
- Camada de Normalização (TensorFlow Core)
A ideia básica por trás dessas camadas é normalizar a saída de uma camada de ativação para melhorar a convergência durante o treinamento. Em contraste com a normalização lote estes normalizations não funcionam em lotes, em vez disso, normalizar as ativações de uma única amostra, tornando-os adequados para redes neual recorrentes também.
Normalmente, a normalização é realizada calculando a média e o desvio padrão de um subgrupo em seu tensor de entrada. Também é possível aplicar uma escala e um fator de deslocamento a isso.
\(y_{i} = \frac{\gamma ( x_{i} - \mu )}{\sigma }+ \beta\)
\( y\) : Saída
\(x\) : Input
\(\gamma\) : Fator de escala
\(\mu\): significativo
\(\sigma\): desvio padrão
\(\beta\): fator de offset
A imagem a seguir demonstra a diferença entre essas técnicas. Cada subtrama mostra um tensor de entrada, com N como o eixo do lote, C como o eixo do canal e (H, W) como os eixos espaciais (Altura e Largura de uma imagem, por exemplo). Os pixels em azul são normalizados pela mesma média e variância, calculados agregando os valores desses pixels.
Fonte: ( https://arxiv.org/pdf/1803.08494.pdf )
Os pesos gama e beta são treináveis em todas as camadas de normalização para compensar a possível perda de capacidade de representação. Você pode ativar esses fatores, definindo o center
ou a scale
bandeira para True
. Claro que você pode usar initializers
, constraints
e regularizer
para beta
e gamma
para ajustar esses valores durante o processo de formação.
Configurar
Instale o Tensorflow 2.0 e os complementos do Tensorflow
pip install -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa
Preparando o conjunto de dados
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
Tutorial de normalização de grupo
Introdução
A normalização de grupo (GN) divide os canais de suas entradas em subgrupos menores e normaliza esses valores com base em sua média e variância. Como o GN funciona em um único exemplo, essa técnica independe do tamanho do lote.
GN experimentalmente classificado como fechado para normalização em lote em tarefas de classificação de imagem. Pode ser benéfico usar GN em vez da normalização em lote no caso de seu batch_size geral ser baixo, o que levaria a um mau desempenho da normalização em lote
Exemplo
Dividindo 10 canais após uma camada Conv2D em 5 subgrupos em uma configuração padrão de "últimos canais":
model = tf.keras.models.Sequential([
# Reshape into "channels last" setup.
tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
# Groupnorm Layer
tfa.layers.GroupNormalization(groups=5, axis=3),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 3s 3ms/step - loss: 0.4707 - accuracy: 0.8613 <keras.callbacks.History at 0x7f63a5c5f490>
Tutorial de normalização de instância
Introdução
A normalização de instância é um caso especial de normalização de grupo onde o tamanho do grupo é do mesmo tamanho que o tamanho do canal (ou o tamanho do eixo).
Os resultados experimentais mostram que a normalização da instância tem um bom desempenho na transferência de estilo ao substituir a normalização em lote. Recentemente, a normalização de instância também foi usada como um substituto para a normalização de lote em GANs.
Exemplo
Aplicando InstanceNormalization após uma camada Conv2D e usando uma escala inicializada uniformizada e fator de deslocamento.
model = tf.keras.models.Sequential([
# Reshape into "channels last" setup.
tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
# LayerNorm Layer
tfa.layers.InstanceNormalization(axis=3,
center=True,
scale=True,
beta_initializer="random_uniform",
gamma_initializer="random_uniform"),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.5367 - accuracy: 0.8405 <keras.callbacks.History at 0x7f63a58d9f50>
Tutorial de normalização de camadas
Introdução
A normalização de camada é um caso especial de normalização de grupo onde o tamanho do grupo é 1. A média e o desvio padrão são calculados a partir de todas as ativações de uma única amostra.
Resultados experimentais mostram que a normalização de camadas é bem adequada para redes neurais recorrentes, uma vez que funciona independentemente do tamanho do lote.
Exemplo
Aplicar a normalização de camadas após uma camada Conv2D e usar uma escala e fator de deslocamento.
model = tf.keras.models.Sequential([
# Reshape into "channels last" setup.
tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
# LayerNorm Layer
tf.keras.layers.LayerNormalization(axis=3 , center=True , scale=True),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.4056 - accuracy: 0.8754 <keras.callbacks.History at 0x7f63a5722d10>