Как ограничить вес в диапазоне в кератах - PullRequest
0 голосов
/ 30 июня 2019

Я использую keras для простого 3-х слойного MLP. Я хочу ограничить вес изученного MLP в диапазоне. например, после того, как модель установлена, все веса и отклонения находятся в диапазоне (-1, 1). Как я могу это сделать? Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 июня 2019

Модуль constraints может использоваться для достижения этой цели. Это применяется к весам (kernel_constraint) следующим образом:

model.add(Dense(500, kernel_constraint=unit_norm()))

https://keras.io/constraints/#unitnorm

1 голос
/ 30 июня 2019

Используйте Constraint для этого.

Для этого нет стандартного ограничения, поэтому нам нужно создать собственное.unit_norm относится к «тензорной норме», а не к «единственному значению веса».

from keras.constraints import Constraint
import keras.backend as K

class Between(Constraint):
    def __init__(self, min_value, max_value):
        self.min_value = min_value
        self.max_value = max_value

    def __call__(self, w):        
        return K.clip(w, self.min_value, self.max_value)

    def get_config(self):
        return {'min_value': self.min_value,
                'max_value': self.max_value}

В любом слое, который принимает ограничение, должны быть аргументы kernel_constraint и bias_constraint.Или несколько очень похожих имен.

Dense(units, kernel_constraint=Between(), bias_constraint=Between())

Загрузка моделей:

custom = {'Between':Between}
model = load_model(path, custom_objects = custom)
0 голосов
/ 30 июня 2019

Краткий ответ: Основываясь на Ioffe & Szegedy 2015 , вам нужно реализовать слой Batch Normalization (BN) + слой Activation Function (который в вашем случае Tanh ограничивает выход в диапазоне [-1, + 1]) после Fully Связанные (FC) слои и до нелинейности следующим образом:

img Для этого нам нужно импортировать BatchNormilization из Keras, как показано ниже.

from keras.models import Sequential
from keras.layers import Dense, Activation, BatchNormalization

model = Sequential([
    Dense(16, input_shape=(1,5), activation='tanh'),
    BatchNormalization(axis=1),
    Dense(32, activation='tanh'),
    BatchNormalization(axis=1),
    Dense(2, activation='tanh')
])

Полный ответ

Функция активации Tanh: Активация tanh используется, чтобы помочь регулировать значения, проходящие через сеть. Функция tanh сводит значения, чтобы всегда быть между -1 и 1.

img

Нормализация партии: Чтобы повысить стабильность нейронной сети, нормализация партии нормализует выходные данные предыдущего слоя активации путем вычитания среднего значения партии и деления на стандартное отклонение партии. Однако после этого сдвига / шкалы активации по некоторым случайно инициализированным параметрам веса в следующем слое перестают быть оптимальными. SGD (Стохастический градиентный спуск) отменяет эту нормализацию, если это способ минимизировать функцию потерь.

Следовательно, нормализация партии добавляет два обучаемых параметра к каждому слою, поэтому нормализованный вывод умножается на параметр «стандартное отклонение» gamma_initializer и добавляет «средний» параметр beta_initializer. Другими словами, пакетная нормализация позволяет SGD выполнять денормализацию, изменяя только эти два веса для каждой активации, вместо потери стабильности сети путем изменения всех весов. По умолчанию они установлены на 0 и 1 от Keras, но мы можем при желании изменить их, а также некоторые другие необязательные параметры. img

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...