Caffe 中 net.layers.blobs 和 net.params 有什么区别
What's the difference between net.layers.blobs and net.params in Caffe
我正在使用 Python Caffe,并与 net.layers[layer_index].blob 和 net.params[layer_type] 混淆。如果我理解得很好, net.params 包含所有网络参数。以LeNet为例,net.params['conv1']表示'conv1'层的网络系数。那么 net.layer[layer_index].blobs 应该表示相同。但是,我发现它们并不完全相同。我使用以下代码对其进行测试:
def _differ_square_sum(self,blobs):
import numpy as np
gradients = np.sum(np.multiply(blobs[0].diff,blobs[0].diff)) + np.sum(np.multiply(blobs[1].diff,blobs[1].diff))
return gradients
def _calculate_objective(self, iteration, solver):
net = solver.net
params = net.params
params_value_list = list(params.keys())
[print(k,v.data.shape) for k,v in net.blobs.items()]
layer_num = len(net.layers)
j = 0
for layer_index in range(layer_num):
if(len(net.layers[layer_index].blobs)>0):
cur_gradient = self._differ_square_sum(net.layers[layer_index].blobs)
key = params_value_list[j]
cur_gradient2 = self._differ_square_sum(params[key])
print([cur_gradient,cur_gradient2])
assert(cur_gradient == cur_gradient2)
关于它们之间的区别有什么想法吗?谢谢。
您正在混合 可训练 网络参数(存储在 net.params
中)和输入 data 到网络(存储在 net.blobs
):
完成模型训练后,net.params
是固定的,不会改变。但是,对于您向网络提供的每个新输入示例,net.blobs
将存储不同层对该特定输入的响应。
我正在使用 Python Caffe,并与 net.layers[layer_index].blob 和 net.params[layer_type] 混淆。如果我理解得很好, net.params 包含所有网络参数。以LeNet为例,net.params['conv1']表示'conv1'层的网络系数。那么 net.layer[layer_index].blobs 应该表示相同。但是,我发现它们并不完全相同。我使用以下代码对其进行测试:
def _differ_square_sum(self,blobs):
import numpy as np
gradients = np.sum(np.multiply(blobs[0].diff,blobs[0].diff)) + np.sum(np.multiply(blobs[1].diff,blobs[1].diff))
return gradients
def _calculate_objective(self, iteration, solver):
net = solver.net
params = net.params
params_value_list = list(params.keys())
[print(k,v.data.shape) for k,v in net.blobs.items()]
layer_num = len(net.layers)
j = 0
for layer_index in range(layer_num):
if(len(net.layers[layer_index].blobs)>0):
cur_gradient = self._differ_square_sum(net.layers[layer_index].blobs)
key = params_value_list[j]
cur_gradient2 = self._differ_square_sum(params[key])
print([cur_gradient,cur_gradient2])
assert(cur_gradient == cur_gradient2)
关于它们之间的区别有什么想法吗?谢谢。
您正在混合 可训练 网络参数(存储在 net.params
中)和输入 data 到网络(存储在 net.blobs
):
完成模型训练后,net.params
是固定的,不会改变。但是,对于您向网络提供的每个新输入示例,net.blobs
将存储不同层对该特定输入的响应。