Keras模型中独立存储的bias权重含义及权重获取方法区别
Keras权重参数疑问解答
kernel与bias的区别和作用
你观察到的conv2d/kernel:0和conv2d/bias:0是卷积层两个完全独立的可训练参数,不存在「bias是kernel对应数组的第二个元素」的关系:
kernel就是卷积核本身,负责对输入特征做空间特征提取,形状由卷积核尺寸、输入通道数、输出通道数共同决定,例如3×3大小、输入通道3、输出通道16的卷积层,kernel形状为(3, 3, 3, 16)bias是加在卷积运算输出结果上的偏置项,形状和输出通道数一致,上述例子中bias形状为(16,),作用是给模型增加线性偏移能力,提升拟合效果,卷积层默认开启bias,设置use_bias=False时不会生成该参数。
注意:你之前的认知误区本质是把model.layers[i].get_weights()返回的列表顺序,错当成了kernel数组内部的元素结构。
三个权重获取接口的差异
你提到的三个API返回结果的核心区别如下,刚好对应你整理的三点特征:
model.layers[i].get_weights():返回纯NumPy数组组成的列表,无额外元信息。如果当前层开启了bias,返回列表就包含两个独立元素:[kernel数组, bias数组],所以你之前会误以为bias是kernel的一部分,实际是列表里的两个独立对象。model.get_weights():相当于把模型所有层调用get_weights()返回的数组合并为一个大列表,顺序和层的排列顺序一致,每一层的kernel在前、bias在后(存在bias的前提下),同样只有纯数组没有名称、归属层等标签信息。model.weights:返回的是TensorFlow的Variable对象列表,不是纯NumPy数组,每个对象自带name、shape等元信息,所以你能直接看到conv2d/kernel:0、conv2d/bias:0这样的命名标识,需要获取对应NumPy值时调用.numpy()方法即可。
内容的提问来源于stack exchange,提问作者momo
相关产品推荐
相关产品推荐

