Я пытаюсь изучить внутреннюю работу регуляризации отсева в 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))