2017-10-27 12 views
2

私はPython Caffeを使い、net.layers [layer_index] .blobsとnet.params [layer_type]と混同しています。私がうまく理解すれば、net.paramsにはすべてのネットワークパラメータが含まれています。 LeNetを例にとると、net.params ['conv1']は 'conv1'層のネットワーク係数を表します。次に、net.layer [layer_index] .blobsは同じものを表す必要があります。しかし、私が見つけたのは、まったく同じではないということです。私はそれをテストするために次のコードを使用します:Caffeのnet.layers.blobsとnet.paramsの違い

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) 

それらの違いに関するアイデア?ありがとう。

答えて

2

あなたはデータは(net .blobsに格納されている)ネットに(net.paramsに格納されている)トレーニング可能ネットパラメータと入力を混合されています
あなたは、モデルのトレーニングが完了したら、net.paramsが固定され、変更されません。ただし、新しい入力例ごとにネットに入力する場合、net.blobsは、その特定の入力に対する異なるレイヤの応答を格納します。

関連する問題