我使用带有张量流后端的Keras
Will Keras还会计算我设置trainable = False
的图层的渐变吗?
当我修复大部分图层时,我还没有观察到深度网络(如Resnet-50)的加速。它看起来仍然是为固定层计算的渐变,但是它们的值乘以0.任何人都可以肯定地告诉我它是真的吗?
以下是小型网络的示例,我修复了第一层。
import numpy as np
import keras
import keras.applications.resnet50
x = keras.layers.Input(shape=(5,))
y = keras.layers.Dense(5)(x)
z = keras.layers.Dense(5)(y)
model = keras.models.Model(x, z)
for layer in model.layers[:2]:
layer.trainable = False
model.compile(optimizer='rmsprop', loss='mse')
print model.summary()
X = np.random.rand(100, 5)
model.fit(X, X, epochs=100)
答案 0 :(得分:5)
如果查看源代码,可以看到渐变仅根据_trainable_weights
计算。
但请注意,要计算任何渐变,您无论如何都需要通过网络进行完全正向传递。 Уou然后需要反向传播回到第一个可训练层的输入。因此,增益可能确实没有你想象的那么大(如果你将一半的权重设置为不可训练的那么你将获得2倍的加速速度)。
在你的情况下,具有不可训练的最后一个重量将为你节省四个矩阵乘法(2个前进,2个后退)。如果我使用或不使用可训练的第一层测量代码的运行时间,我会看到1.4s vs 1.15s的差异(Tensorflow CPU)或13 vs 11s(Theano CPU pure-Python),这看起来很合理。
如果你比较一个较长的网络(例如,在你的例子中添加10层),根据我对(Theano pure-Python)的测量结果,将所有层训练和只有最后一层之间的区别变为10s vs 50s。
请注意,通常情况下,您通常不会期望性能提升超过50%,因为您只能保存一部分反向传递。最重要的5倍胜利很可能是由于Theano的优化而实现的,该优化将所有不可训练的密集层无需激活组合成单个矩阵乘法。事实上,在Tensorflow上,我只看到1.5s与2.0s之间的差异。