Выпадение установки массива весов слоя на пустой

Я пытаюсь получить доступ к обученным значениям веса этой сети:

X = [[1] , [2], [3], [4], [5], [6], [7], [8]]
Y = [[1] , [2] ,[3] ,[4] ,[5] ,[6] ,[7] ,[8]]

from keras.callbacks import History 
history = History()

from keras import optimizers

inputDim = len(X[0])
print('input dim' , inputDim)
model = Sequential()

model.add(Dense(1, activation='sigmoid', input_dim=inputDim))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.add(Dropout(0.2))

sgd = optimizers.SGD(lr=0.009, decay=1e-10, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd , metrics=['accuracy'])
model.fit(X,Y , validation_split=0.1 , verbose=2 , callbacks=[history] , epochs=5,batch_size=32)

Можно получить доступ к весам в первом слое:

weights = model.get_layer(index=1).get_weights()
weights
[array([[-0.93537247]], dtype=float32), array([ 0.00989669], dtype=float32)]

Но не во 2-м слое:

weights = model.get_layer(index=2).get_weights()
weights
[]

Похоже, что добавление отсева вызывает это как удаление отсева:

model.add(Dense(1, activation='sigmoid', input_dim=inputDim))
model.add(Dense(1, activation='sigmoid'))

Приводит к успешному доступу к весам

weights = model.get_layer(index=1).get_weights()
weights

[array([[-0.62137389]], dtype=float32), array([-0.05591233], dtype=float32)]

weights = model.get_layer(index=2).get_weights()
weights

[array([[-1.09568715]], dtype=float32), array([ 0.53271592], dtype=float32)]

Читайте о Dropout: https://keras.io/layers/core/:

«Отсев состоит в случайной установке доли входных единиц в 0 при каждом обновлении во время обучения, что помогает предотвратить переобучение».

Визуализация выпадения:  введите описание изображения здесь src: http://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf

Таким образом, часть нейронов отбрасывается. Но в моем примере кажется, что все нейроны отброшены, поскольку весовые параметры в слое 2 являются пустым массивом? Почему добавление выпадения приводит к тому, что весовые параметры в последующих слоях становятся недоступными?


person blue-sky    schedule 26.09.2017    source источник


Ответы (1)


У бросивших школу нет веса. Плотные слои (и некоторые другие типы) имеют.

В вашей первой модели есть следующие слои:

0: input layer - no weights 
1: Dense(...) - weights and biases    
2: Dropout(...) - no weights    
3: Dense(...) - weights and biases
4: Dropout(...) - no weights

Веса - это обучаемые параметры, принадлежащие одному слою.

У выпавших из школы просто есть постоянный параметр, который нельзя обучить. Этот параметр просто удаляет часть результатов.


Плотные слои используют свои веса для изменения входных данных и выдачи выходных данных:

#pseudocode
output = Weights x input + biases

Выпадающие слои просто отбрасывают некоторые из выходных данных:

#pseudocode - suppose the dropout parameter is 0.2
output = input[take 80% of the elements]    
person Daniel Möller    schedule 26.09.2017