O Google I / O retorna de 18 a 20 de maio! Reserve espaço e monte sua agenda Cadastre-se agora

Normalizações

Ver no TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar caderno

Visão geral

Este notebook fornece uma breve introdução às camadas de normalização do TensorFlow. As camadas atualmente suportadas são:

  • Normalização de grupo (complementos do TensorFlow)
  • Normalização de instância (complementos do TensorFlow)
  • Normalização de camada (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 de lote, essas normalizações não funcionam em lotes, em vez disso, normalizam as ativações de uma única amostra, tornando-as adequadas também para redes neuais recorrentes.

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 $: entrada

$ \ gamma $: fator de escala

$ \ mu $: significa

$ \ sigma $: desvio padrão

$ \ beta $: fator de compensação

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 o indicador de scale como True . É claro que você pode usar initializers , constraints e regularizer para beta e gamma para ajustar esses valores durante o processo de treinamento.

Configurar

Instale o Tensorflow 2.0 e os complementos do Tensorflow

pip install -q -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 [==============================] - 4s 3ms/step - loss: 0.7835 - accuracy: 0.7722

<tensorflow.python.keras.callbacks.History at 0x7f94db65ca58>

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 [==============================] - 2s 3ms/step - loss: 0.9159 - accuracy: 0.7194

<tensorflow.python.keras.callbacks.History at 0x7f9549c37278>

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.6272 - accuracy: 0.8049

<tensorflow.python.keras.callbacks.History at 0x7f9549b0a748>

Literatura

Norma de camada

Norma de instância

Norma do Grupo

Visão geral completa das normalizações