Esta página foi traduzida pela API Cloud Translation.
Switch to English

Normalizações

Ver em TensorFlow.org Executar no Google Colab Ver fonte no GitHub Download do 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 da instância (complementos do TensorFlow)
  • Normalização de Camada (TensorFlow Core)

A idéia 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. Ao contrário da normalização de lotes, essas normalizações não funcionam em lotes, mas normalizam as ativações de uma única amostra, tornando-as adequadas para redes neurais recorrentes.

Normalmente, a normalização é realizada calculando a média e o desvio padrão de um subgrupo no seu tensor de entrada. Também é possível aplicar uma escala e um fator de deslocamento a isso também.

$ y_ {i} = \ frac {\ gama (x_ {i} - \ mu)} {\ sigma} + \ beta $

$ y $: Saída

$ x $: Entrada

$ \ gama $: fator de escala

$ \ mu $: média

$ \ sigma $: desvio padrão

$ \ beta $: fator de deslocamento

A imagem a seguir demonstra a diferença entre essas técnicas. Cada subparcela mostra um tensor de entrada, com N como eixo do lote, C como eixo do canal e (H, W) como eixos espaciais (Altura e Largura de uma imagem, por exemplo). Os pixels em azul são normalizados pela mesma média e variação, 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 sinalizador de scale como True . Obviamente, você pode usar initializers , constraints e regularizer para beta e gamma para ajustar esses valores durante o processo de treinamento.

Configuração

Instale o Tensorflow 2.0 e Add-ons do Tensorflow

 try:
  %tensorflow_version 2.x
except:
  pass

import tensorflow as tf
 
pip install -q  --no-deps tensorflow-addons~=0.7
 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 variação. Como o GN trabalha em um único exemplo, essa técnica é independente do tamanho do lote.

GN avaliado experimentalmente fechado para normalização de lote em tarefas de classificação de imagens. Pode ser benéfico usar o GN em vez da Normalização de Lote, caso o tamanho total do lote seja baixo, o que levaria a um desempenho ruim da normalização do lote

Exemplo

Divisão de 10 canais após uma camada Conv2D em 5 subgrupos em uma configuração padrão de "último canal":

 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)
 
Train on 10000 samples
10000/10000 [==============================] - 4s 363us/sample - loss: 0.5466 - accuracy: 0.8366

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

Tutorial de Normalização de Instâncias

Introdução

Normalização de instância é um caso especial de normalização de grupo em que o tamanho do grupo é do mesmo tamanho que o tamanho do canal (ou o tamanho do eixo).

Resultados experimentais mostram que a normalização da instância funciona bem na transferência de estilos 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 um 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)
 
Train on 10000 samples
10000/10000 [==============================] - 2s 163us/sample - loss: 0.5175 - accuracy: 0.8434

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

Tutorial de normalização de camada

Introdução

A normalização de camada é um caso especial de normalização de grupo em que 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 da camada é adequada para redes neurais recorrentes, uma vez que funciona em lotes independentes.

Exemplo

Aplicando normalização layern após uma camada Conv2D e usando uma escala e um 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=1 , 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)
 
Train on 10000 samples
10000/10000 [==============================] - 2s 164us/sample - loss: 0.4464 - accuracy: 0.8724

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

Literatura

Norma de camada

Norma da instância

Norma do Grupo

Visão geral completa das normalizações