1

我正在開發項目,需要識別給定人臉部的臉部特徵。我將其制定爲迴歸問題,並希望從簡單的conv網絡開始並定義下面的網絡。日誌記錄權重和caffe中的偏差

我注意到輸出預測總是相同的,稍後再調試一些,我發現評分層的權重和梯度在迭代過程中不會改變。我使用固定的學習率〜5e-2來生成下面的示例。隨着迭代的進行,訓練損失似乎減少,但我無法理解爲什麼。我還記錄了其他圖層:'conv1','conv2', 'fc1',並看到在迭代過程中保持不變的相同行爲。由於損失似乎減少了,所以有些事情必須改變,我的猜測是,記錄我在下面的做法可能是不正確的。

你能否給我一些指點檢查?請讓我知道如果你需要更多的信息

修改lenet:

# Modified LeNet. Added relu1, relu2 and, dropout. 
# Loss function is an Euclidean distance 
def lenet(hdf5_list, batch_size=64, dropout_ratio=0.5, train=True): 
    # our version of LeNet: a series of linear and simple nonlinear transformations 
    n = caffe.NetSpec() 

    n.data, n.label = L.HDF5Data(batch_size=batch_size, source=hdf5_list, ntop=2) 

    n.conv1 = L.Convolution(n.data, kernel_size=5, num_output=20, weight_filler=dict(type='xavier'), bias_filler=dict(type='constant', value=0.1)) 
    n.relu1 = L.ReLU(n.conv1, in_place=False, relu_param=dict(negative_slope=0.1)) 
    n.pool1 = L.Pooling(n.relu1, kernel_size=2, stride=2, pool=P.Pooling.MAX) 

    n.conv2 = L.Convolution(n.pool1, kernel_size=5, num_output=50, weight_filler=dict(type='xavier'), bias_filler=dict(type='constant', value=0.1)) 
    n.relu2 = L.ReLU(n.conv2, in_place=False, relu_param=dict(negative_slope=0.1)) 
    n.pool2 = L.Pooling(n.relu2, kernel_size=2, stride=2, pool=P.Pooling.MAX) 

    if train: 
     n.drop3 = fc1_input = L.Dropout(n.pool2, in_place=True, dropout_param = dict(dropout_ratio=dropout_ratio)) 
    else: 
     fc1_input = n.pool2 

    n.fc1 = L.InnerProduct(fc1_input, num_output=500, weight_filler=dict(type='xavier'), bias_filler=dict(type='constant', value=0.1)) 
    n.relu3 = L.ReLU(n.fc1, in_place=True, relu_param=dict(negative_slope=0.1)) 
    n.score = L.InnerProduct(n.relu3, num_output=30, weight_filler=dict(type='xavier')) 
    n.loss = L.EuclideanLoss(n.score, n.label) 

    return n.to_proto() 

求解循環:

#custom solver loop 
for it in range(niter): 
    solver.step(1) 

    train_loss[it] = solver.net.blobs['loss'].data 

    score_weights.append(solver.net.params['score'][0].data) 
    score_biases.append(solver.net.params['score'][1].data) 
    score_weights_diff.append(solver.net.params['score'][0].diff) 
    score_biases_diff.append(solver.net.params['score'][1].diff) 


    if (it % val_interval) == 0 or (it == niter - 1): 

     val_error_this = 0 
     for test_it in range(niter_val_error): 
      solver.test_nets[0].forward() 
      val_error_this += euclidean_loss(solver.test_nets[0].blobs['score'].data , 
              solver.test_nets[0].blobs['label'].data)/niter_val_error 
     val_error[it // val_interval] = val_error_this 

打印成績:

print score_weights_diff[0].shape 
for i in range(10): 
    score_weights_i = score_weights_diff[i] 
    print score_weights_i[0:30:10,0] 


print score_biases_diff[0].shape 
for i in range(5): 
    score_biases_i = score_biases_diff[i] 
    print score_biases_i[0:30:6] 

輸出:

(30, 500) 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
[ -3.71852257e-05 7.34565838e-05 2.61445384e-04] 
131 
(30,) 
[ 3.22921231e-04 5.66378840e-05 -5.15143370e-07 -1.51118627e-04 
    2.30352176e-04] 
[ 3.22921231e-04 5.66378840e-05 -5.15143370e-07 -1.51118627e-04 
    2.30352176e-04] 
[ 3.22921231e-04 5.66378840e-05 -5.15143370e-07 -1.51118627e-04 
    2.30352176e-04] 
[ 3.22921231e-04 5.66378840e-05 -5.15143370e-07 -1.51118627e-04 
    2.30352176e-04] 
[ 3.22921231e-04 5.66378840e-05 -5.15143370e-07 -1.51118627e-04 
    2.30352176e-04] 

回答

1

這是一個有點難以從代碼中看到的,但它有可能score_weights_diffscore_biases_diff和其他列表中的存儲引用solver.net.params['score'][0].diff,因此所有條目列表實際上是相同的,並在每次迭代一起變化。

  1. 盡力挽救一個副本

    score_weights_diff.append(solver.net.params['score'][0].diff[...].copy()) 
    
  2. 嘗試和打印的權重/每次迭代之後,看看偏見,如果他們改變。
+1

謝謝@Shai。那樣做了。 – r3t2