Tensorflow2 реализует нормализацию пикселей и спектральную нормализацию.

искусственный интеллект глубокое обучение
Tensorflow2 реализует нормализацию пикселей и спектральную нормализацию.

"Это 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)

В отличие от других нормализации, нормализация пикселей не имеет обучаемых параметров. Он состоит только из простых арифметических операций, поэтому он эффективен в вычислительном отношении.

Спектральная нормализация

Нормализация спектра в деталях

Чтобы объяснить спектральную нормализацию, сначала необходимо повторить знания линейной алгебры, чтобы примерно объяснить, что такое спектральная норма.

Сначала просмотрите собственные значения и собственные векторы в теории матриц:

Av=λvAv=\lambda v

вAAквадратная матрица,vvявляется собственным вектором, иλ\lambdaявляется его характеристическим значением.

Мы будем использовать простой пример, чтобы понять эти термины. Предположениеvvэто о местоположении(x,y)(x, y)вектор иAAпредставляет собой линейное преобразование:

A=(abcd),v=(xy)A=\begin{pmatrix} a & b\\ c & d\\ \end{pmatrix},v=\begin{pmatrix} x \\ y \\ \end{pmatrix}

еслиAAумножить наvv, мы получим новую позицию, ориентация которой меняется следующим образом:

Av=(abcd)×(xy)=(ax+bycx+dy)Av=\begin{pmatrix} a & b\\ c & d\\ \end{pmatrix}\times \begin{pmatrix} x \\ y \\ \end{pmatrix}=\begin{pmatrix} ax + by\\ cx + dy\\ \end{pmatrix}

Собственные векторы — это векторы, которые не меняют направление, когда к вектору применяется A. Вместо этого они могут передавать только скалярные собственные значения.λ\lambdaмасштабировать. Может быть несколько пар собственный вектор-собственное значение. Квадратный корень из наибольшего собственного значения является спектральной нормой матрицы. Для неквадратных матриц нам нужно будет использовать математические алгоритмы (например, разложение по сингулярным числам (singular value decomposition, SVD)) для вычисления собственных значений, что может быть дорогостоящим в вычислительном отношении.

Следовательно, использование метода степенной итерации может ускорить расчет, что делает его пригодным для обучения нейронной сети. Далее, вTensorFlowСпектральная нормализация реализована как ограничение по весу в .

Реализация спектральной нормализации

Математический алгоритм спектральной нормализации может показаться сложным. Однако часто реализация алгоритма оказывается проще, чем кажется математически.

Вот шаги для выполнения спектральной нормализации:

  1. Веса в сверточном слое4维张量, поэтому первый шаг — изменить его форму на2Dматрица, где мы сохраняем последнее измерение весов. После переформовки форма весов(H×W, C).

  2. использоватьN(0,1)N(0,1)вектор инициализацииuu.

  3. существуетforВ цикле вычислите следующее:

    а) Расчет с транспонированием матриц и умножением матрицv=(wT)uv =(w^T)u.

    б) использовать егоL2L_2нормализация нормыvv,Сейчасv=v/v2v = v/||v||_2.

    в) расчетu=wvu = wv.

    г) использоватьL2L_2нормализация нормыuu,Сейчасu=u/u2u = u/||u||_2.

  4. Вычислить спектральную норму какuTwvu^Twv.

  5. Наконец, разделите веса на спектральную норму.

Полный код выглядит следующим образом:

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. Спектральная нормализация также может быть реализована как переменная для хранения вектора.uu, вместо того, чтобы начинать со случайного значения. Это уменьшает количество итераций до 1. Чтобы реализовать спектральную нормализацию, мы можем применить спектральную нормализацию, используя ее в качестве ограничения ядра свертки, например:

Conv2D(3,1,kernel_constraint = SpectralNorm())