Вручную назначить выпадающий слой в Керасе - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь изучить внутреннюю работу регуляризации отсева в NN.Я в основном работаю над «Глубоким обучением с Python» Франсуа Шоле.

Скажем, я использую данные настроения для обзора фильмов IMDB и строю простую модель, как показано ниже:

# download IMDB movie review data
# keeping only the first 10000 most freq. occurring words to ensure manageble sized vectors
from keras.datasets import imdb

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(
    num_words=10000)

# prepare the data
import numpy as np
# create an all 0 matrix of shape (len(sequences), dimension)
def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        # set specific indices of results[i] = 1
        results[i, sequence] = 1.
    return results

# vectorize training data
x_train = vectorize_sequences(train_data)
# vectorize test data
x_test = vectorize_sequences(test_data)

# vectorize response labels
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

# build a model with L2 regularization
from keras import regularizers
from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                       activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                       activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

В книге приведен пример ручной установки весов случайного отсева с использованием следующей строки:

# at training time, zero out a random fraction of the values in the matrix
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)

Как бы я 1) фактически интегрировал это в свою модель и 2) как бы я удалил отсев во время тестирования?

РЕДАКТИРОВАТЬ: я знаю об интегрированном методе использования отсева, как в строке ниже, я на самом деле ищу способ реализовать вышеописанное вручную

model.add(layers.Dropout(0.5))

Ответы [ 2 ]

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

Это может быть реализовано с использованием лямбда-слоя.

from keras import backend as K
def dropout(input):
    training = K.learning_phase()
    if training is 1 or training is True:
        input *= K.cast(K.random_uniform(K.shape(input), minval=0, maxval=2, dtype='int32'), dtype='float32')
        input /= 0.5    
    return input

def get_model():
        model = models.Sequential()
        model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                               activation='relu', input_shape=(10000,)))
        model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                               activation='relu'))
        model.add(layers.Lambda(dropout)) # add dropout using Lambda layer
        model.add(layers.Dense(1, activation='sigmoid'))
        print(model.summary())
        return model

K.set_learning_phase(1)
model = get_model()
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
weights = model.get_weights()
K.set_learning_phase(0)
model = get_model()
model.set_weights(weights)
print('model prediction is {}, label is {} '.format(model.predict(x_test[0][None]), y_test[0]))

Прогноз модели - [[0.1484453]], метка - 0.0

0 голосов
/ 21 июня 2019

Как бы я 1) на самом деле интегрировал это в мою модель

На самом деле, этот фрагмент кода Python, который использует библиотеку NumPy, служит только для иллюстрации того, как работает выпадение.Вы не должны реализовывать Dropout в модели Keras.Скорее, чтобы использовать Dropout в модели Keras, вам нужно использовать слой Dropout и присвоить ему коэффициент отношения (от нуля до единицы), который обозначает коэффициент отсева:

from keras import layers

# ...
model.add(layers.Dropout(dropout_rate))
# add the rest of layers to the model ...

2) как бы удалить выпадение во время теста?

Вам не нужно ничего делать вручную.Он обрабатывается Keras автоматически и будет отключен на этапе прогнозирования при использовании метода predict().

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