"Это 10-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."
предисловие
Улучшением метода нормализации является генеративно-состязательная сеть (Generative Adversarial Networks, GAN
), одно из многих улучшений, в этой статье представлена нормализация пикселей, обычно используемая в текущих GAN (Pixel normalization
, или нормализация пикселей) и спектральная нормализация (Spectral normalization
, или спектральная нормализация), при создании изображений высокой четкости эти два метода нормализации широко использовались и, наконец, использовалисьTensorflow2
Реализуйте нормализацию пикселей и спектральную нормализацию.
нормализация пикселей
Подробное объяснение нормализации пикселей
Нормализация пикселей включенаProGAN
предложенный в модели,ProGAN
Автор сдался批归一化
, и для生成器
Используется пользовательская нормализация, то есть нормализация пикселей.
Цель нормализации в ProGAN — ограничить значение веса, чтобы предотвратить его экспоненциальный рост. Большие веса могут увеличить амплитуду сигнала и привести к жесткой конкуренции между генератором и дискриминатором.像素归一化
Преобразование каждой позиции пикселя в измерении канала(H, W)
Характеристики нормализованы. Если тензор имеет размер(N, H, W, C)
пакетные изображения RGB, размер вектора RGB любого пикселя будет равен 1 после нормализации пикселя.
Реализация нормализации пикселей
В Tensorflow2 можно использовать пользовательский слой для нормализации пикселей:
from tensorflow.keras.layers import Layer
class PixelNorm(Layer):
def __init__(self, epsilon=1e-8):
super(PixelNorm, self).__init__()
self.epsilon = epsilon
def call(self, input_tensor):
return input_tensor / tf.math.sqrt(tf.reduce_mean(input_tensor ** 2, axis=-1, keepdims=True) + self.epsilon)
В отличие от других нормализации, нормализация пикселей не имеет обучаемых параметров. Он состоит только из простых арифметических операций, поэтому он эффективен в вычислительном отношении.
Спектральная нормализация
Нормализация спектра в деталях
Чтобы объяснить спектральную нормализацию, сначала необходимо повторить знания линейной алгебры, чтобы примерно объяснить, что такое спектральная норма.
Сначала просмотрите собственные значения и собственные векторы в теории матриц:
вквадратная матрица,является собственным вектором, иявляется его характеристическим значением.
Мы будем использовать простой пример, чтобы понять эти термины. Предположениеэто о местоположениивектор ипредставляет собой линейное преобразование:
еслиумножить на, мы получим новую позицию, ориентация которой меняется следующим образом:
Собственные векторы — это векторы, которые не меняют направление, когда к вектору применяется A. Вместо этого они могут передавать только скалярные собственные значения.масштабировать. Может быть несколько пар собственный вектор-собственное значение. Квадратный корень из наибольшего собственного значения является спектральной нормой матрицы. Для неквадратных матриц нам нужно будет использовать математические алгоритмы (например, разложение по сингулярным числам (singular value decomposition, SVD
)) для вычисления собственных значений, что может быть дорогостоящим в вычислительном отношении.
Следовательно, использование метода степенной итерации может ускорить расчет, что делает его пригодным для обучения нейронной сети. Далее, вTensorFlow
Спектральная нормализация реализована как ограничение по весу в .
Реализация спектральной нормализации
Математический алгоритм спектральной нормализации может показаться сложным. Однако часто реализация алгоритма оказывается проще, чем кажется математически.
Вот шаги для выполнения спектральной нормализации:
-
Веса в сверточном слое
4维张量
, поэтому первый шаг — изменить его форму на2D
матрица, где мы сохраняем последнее измерение весов. После переформовки форма весов(H×W, C)
. -
использоватьвектор инициализации.
-
существует
for
В цикле вычислите следующее:а) Расчет с транспонированием матриц и умножением матриц.
б) использовать егонормализация нормы,Сейчас.
в) расчет.
г) использоватьнормализация нормы,Сейчас.
-
Вычислить спектральную норму как.
-
Наконец, разделите веса на спектральную норму.
Полный код выглядит следующим образом:
import tensorflow as tf
class SpectralNorm(tf.keras.constraints.Constraint):
def __init__(self, n_iter=5):
self.n_iter = n_iter
def call(self, input_weights):
w = tf.reshape(input_weights, (-1, input_weights.shape[-1]))
u = tf.random.normal((w.shape[0], 1))
for _ in range(self.n_iter):
v = tf.matmul(w, u, transpose_a=True)
v /= tf.norm(v)
u = tf.matmul(w, v)
u /= tf.norm(u)
spec_norm = tf.matmul(u, tf.matmul(w, v), transpose_a=True)
return input_weights/spec_norm
Количество итераций является гиперпараметром, и обычно достаточно 5. Спектральная нормализация также может быть реализована как переменная для хранения вектора., вместо того, чтобы начинать со случайного значения. Это уменьшает количество итераций до 1. Чтобы реализовать спектральную нормализацию, мы можем применить спектральную нормализацию, используя ее в качестве ограничения ядра свертки, например:
Conv2D(3,1,kernel_constraint = SpectralNorm())