Keras中的“ trainable_weights”是什么意思?

时间:2019-10-06 14:38:07

标签: python keras deep-learning conv-neural-network transfer-learning

如果我用export interface ResponsePromise extends Promise<Response> { arrayBuffer(): Promise<ArrayBuffer>; blob(): Promise<Blob>; formData(): Promise<FormData>; json<T>(): Promise<T>; text(): Promise<string>; } class Api { public get(url: string, params = {}): ResponsePromise { const body = new URLSearchParams(params).toString(); return fetch(url, {method: 'GET', body}); } } const foo = async () => { const api = new Api(); await api.get('http://www.example.com').json<any>(); } 冻结base_model,则我用trainable=false会得到奇怪的数字。

在冻结之前,我的模型有162个trainable_weights。冻结后,模型只有2个。我将2层绑定到预训练的网络。 trainable_weights是否向我显示要训练的层?当我看到2,253,335可训练的参数时,我发现这个数字很奇怪。

2 个答案:

答案 0 :(得分:0)

可训练权重是在训练过程中将学习的权重。如果您执行trainable=False,则这些权重将保持不变,并且不会被更改,因为不会学习它们。您可能会看到一些“奇怪的数字”,因为您正在使用已经学习了权重的预训练网络,或者在定义模型时可能正在使用随机初始化。在预先训练的模型上使用转移学习时,一种常见的做法是冻结基础模型(预先训练的)的权重,只训练最后添加的额外层。

答案 1 :(得分:0)

可训练权重与可训练参数相同。 可训练层通常具有多个可训练权重。

让我们看一下这个例子:

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, None, 501)         0         
_________________________________________________________________
lstm_1 (LSTM)                (None, None, 40)          86720     
_________________________________________________________________
SoftDense (TimeDistributed)  (None, None, 501)         20541     
=================================================================
Total params: 107,261
Trainable params: 107,261
Non-trainable params: 0
__________________________

第一层只是输入层;它按原样接收数据,因此没有任何可训练的权重。

下一层具有542 * 4 * 40 = 86720可训练权重。 40个由于其输出暗淡,4个因为作为LSTM实际上在其内部具有4个可训练层,而542为501 + 40 + 1……由于可能不在此答案范围之内的原因。

最后一层具有41 * 501 = 20451可训练权重 (输入层为40,偏置为+1,输出为乘以501)。

总可训练参数-107,261

如果要冻结最后一层,我将只有86,720个可训练的权重。