我使用keras训练了一个网络模型,其中包括多个丢失层。我还实现了一个随机预测函数(使用keras后端),这使得我可以在“开启”的情况下获得预测。
import keras.backend as K
F = K.function([model.layers[0].input, K.learning_phase()], [m.layers[-1].output])
我使用
调用该函数 output = F([x_test[0:1], 1])
其中x_test是样本输入。
目前,此预测器功能中使用的辍学率与用于训练的辍学率相同。 我想在不重新培训网络的情况下设置不同的辍学率。
我写了一个脚本来改变所有辍学率:
for layer in [l for l in m.layers if "dropout" in np.str.lower(l.name)]:
layer.rate = 0.5
但是,当我调用自定义函数时,它不会更改输出。例如,如果我训练的网络使用的速率为0(或K.epsilon()),则重复的函数调用将产生相同的结果。将dropout更改为0.5应该会在每个函数调用中产生唯一的结果。但事实并非如此。更改丢失无效。
的工作原理是提取单个图层,更改速率并调用该单个图层:
L = my_net.model.layers[0]
L.rate = 0.5
L_out1 = K.eval(L.call(x_test[0], training=True))
L.rate = K.epsilon()
L_out2 = K.eval(L.call(x_test[0], training=True))
这里,L_out1和L_out2是唯一的。我不知道如何在整个网络中实现此功能。
后端功能是什么阻止我的模型更改生效?