如果我用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可训练的参数时,我发现这个数字很奇怪。
答案 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
个可训练的权重。