Извлечение маски выпадения из слоя выпадения керас? - PullRequest
1 голос
/ 20 сентября 2019

Я хотел бы извлечь и сохранить маску выпадения [массив 1/0 с] из выпадающего слоя в модели Sequential Keras в каждой партии во время тренировки.Мне было интересно, есть ли прямой способ сделать это в Keras или мне нужно переключиться на tenorflow ( Как получить маску выпадения в Tensorflow ).

Буду признателен за любую помощь!Я совсем новичок в TensorFlow и Keras.

Есть пара функций (dropout_layer.get_output_mask (), dropout_layer.get_input_mask ()) для слоя удаления, который я пытался использовать, но получил None после вызова на предыдущем уровне.

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(name="flat", input_shape=(28, 28, 1)))
model.add(tf.keras.layers.Dense(
    512,
    activation='relu',
    name = 'dense_1',
    kernel_initializer=tf.keras.initializers.GlorotUniform(seed=123),
    bias_initializer='zeros'))
dropout = tf.keras.layers.Dropout(0.2, name = 'dropout') #want this layer's mask

model.add(dropout)
x = dropout.output_mask
y = dropout.input_mask
model.add(tf.keras.layers.Dense(
    10,
    activation='softmax',
    name='dense_2',
    kernel_initializer=tf.keras.initializers.GlorotUniform(seed=123),
    bias_initializer='zeros'))

model.compile(...)
model.fit(...)

1 Ответ

0 голосов
/ 20 сентября 2019

Это не так легко разоблачить в Керасе.Он углубляется, пока не вызовет выпадение Tensorflow.

Итак, хотя вы используете Keras, он также будет тензором в графе, который можно получить по имени (при нахождении его имени: ) В Tensorflow получите имена всех Tensors вграфик ).

Эта опция, конечно, будет не иметь некоторой информации о keras, вам, вероятно, придется делать это внутри слоя Lambda, чтобы Keras добавлял некоторую информацию в тензор.И вы должны быть особенно осторожны, потому что тензор будет существовать даже тогда, когда он не тренировался (там, где пропущена маска)

Теперь вы также можете использовать менее хакерский способ, который может потребовать небольшой обработки:

def getMask(x):
    boolMask = tf.not_equal(x, 0)
    floatMask = tf.cast(boolMask, tf.float32) #or tf.float64
    return floatMask

Используйте Lambda(getMasc)(output_of_dropout_layer)

Но вместо использования Sequential модели вам потребуется функциональный API Model.

inputs = tf.keras.layers.Input((28, 28, 1))
outputs = tf.keras.layers.Flatten(name="flat")(inputs)
outputs = tf.keras.layers.Dense(
    512,
    #    activation='relu', #relu will be a problem here
    name = 'dense_1',
    kernel_initializer=tf.keras.initializers.GlorotUniform(seed=123),
    bias_initializer='zeros')(outputs)

outputs = tf.keras.layers.Dropout(0.2, name = 'dropout')(outputs)
mask = Lambda(getMask)(outputs)
#there isn't "input_mask"


#add the missing relu: 
outputs = tf.keras.layers.Activation('relu')(outputs)
outputs = tf.keras.layers.Dense(
    10,
    activation='softmax',
    name='dense_2',
    kernel_initializer=tf.keras.initializers.GlorotUniform(seed=123),
    bias_initializer='zeros')(outputs)

model = Model(inputs, outputs)
model.compile(...)
model.fit(...)

Обучение и прогнозирование

Поскольку вы не можете тренировать маски (это не имеет никакого смысла), это не должно быть выходом модели для тренировки.

Теперь мы можем попробовать это:

trainingModel = Model(inputs, outputs)    
predictingModel = Model(inputs, [output, mask])    

Но маски не существуют в предсказании, потому что отсев применяется только в тренировках.Так что это не приносит нам ничего хорошего в конце.

Единственный способ обучения - использовать фиктивные потери и фиктивные цели:

def dummyLoss(y_true, y_pred):
    return y_true #but this might evoke a "None" gradient problem since it's not trainable, there is no connection to any weights, etc.    

model.compile(loss=[loss_for_main_output, dummyLoss], ....)

model.fit(x_train, [y_train, np.zeros((len(y_Train),) + mask_shape), ...)

Не гарантируется, что они будут работать.

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