gpt4 book ai didi

python - 从 keras dropout 层中提取 dropout mask?

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:01 26 4
gpt4 key购买 nike

我想在训练时从每个批处理的顺序 Keras 模型中的 dropout 层中提取并存储 dropout mask [1/0 数组]。我想知道在 Keras 中是否有一种直接的方法可以做到这一点,或者我是否需要切换到 tensorflow ( How to get the dropout mask in Tensorflow )。

非常感谢任何帮助!我对 TensorFlow 和 Keras 还很陌生。

我尝试使用 dropout 层的几个函数(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(...)

最佳答案

它在 Keras 中不容易暴露。它会深入直到调用 Tensorflow dropout。

因此,虽然您使用的是 Keras,但它也将是图中的一个张量,可以通过名称获取(找到它的名称: In Tensorflow, get the names of all the Tensors in a graph )。

这个选项当然会缺少一些 keras 信息,您可能必须在 Lambda 层内执行此操作,以便 Keras 向张量添加某些信息。而且您必须格外小心,因为即使不训练(跳过掩模),张量也会存在

现在,您还可以使用一种不太hacky的方式,这可能会消耗一些处理:

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)

但是您需要一个功能性 API 模型,而不是使用顺序模型。

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])

但是在预测中不存在掩码,因为 dropout 仅适用于训练。所以这最终并没有给我们带来任何好处。

训练的唯一方法是使用虚拟损失和虚拟目标:

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), ...)

不保证这些会起作用。

关于python - 从 keras dropout 层中提取 dropout mask?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com