Normalizações

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>

Literatura

Norma de camada

Norma de instância

Norma do Grupo