Keras会计算冻结层的梯度吗?

Tem*_*mak 3 keras tensorflow keras-layer

我使用Keras和tensorflow后端.
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)
Run Code Online (Sandbox Code Playgroud)

KT.*_*KT. 6

如果查看源代码,可以看到渐变只是相对于计算的_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之间的差异.