2017-02-09 4 views
0

私はconvnetjsを使ってインタラクティブなチュートリアルを作成しています。私は単純な9x9イメージの 'X'と畳み込みレイヤーを3x3 '\'として使用しています... enter image description here畳み込みの結果はどうなるべきですか?

私は結果が異なると予想しました。私は7.1の代わりに(-1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1)/ 9 = 0.77となるように、円で囲んだ結果を期待しました。

7.1の結果はどうなっていますか?これはバイアスに起因するのでしょうか?フィルターは 'X'の '\'部分に一致する形状なので、全体の結果に '\'対角に沿って最も高い数字が表示されることも期待しました。

更新:私は次のような結果が期待されます。バイアスは配列[0.1,0.1,0.1]であるように見える。下の代わりに、上の結果を(少なくとも左上のピクセルについて)計算する計算は何ですか?

enter image description here

<html> 
 

 
<head> 
 
    <script src="http://cs.stanford.edu/people/karpathy/convnetjs/build/convnet-min.js"></script> 
 
</head> 
 

 
<body> 
 
    <script> 
 
    // Initialize an input that is 9x9 and initialized with zeroes. 
 
    let inputVol = new convnetjs.Vol(9, 9, 1, 0.0); 
 

 
    // Manually set the input weights from zeroes to a 'X'... 
 
    inputVol.w = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; 
 

 
    // Define the layers 
 
    let layers = []; 
 
    layers.push({ 
 
     type: 'input', 
 
     out_sx: 9, 
 
     out_sy: 9, 
 
     out_depth: 1 
 
    }); 
 
    layers.push({ 
 
     type: 'conv', 
 
     sx: 3, 
 
     pad: 0, 
 
     filters: 3, 
 
     stride: 1, 
 
     activation: 'relu' 
 
    }); 
 
    let net = new convnetjs.Net(); 
 
    net.makeLayers(layers); 
 

 
    let convLayer = net.layers[1]; 
 
    let convLayerFilters = convLayer.filters; 
 

 
    // Set filters manually 
 
    // looks like a '\' 
 
    convLayerFilters[0].w = [1, -1, -1, -1, 1, -1, -1, -1, 1]; 
 
    // looks like a 'X' 
 
    convLayerFilters[1].w = [1, -1, 1, -1, 1, -1, 1, -1, 1]; 
 
    // looks like a '/' 
 
    convLayerFilters[2].w = [-1, -1, 1, -1, 1, -1, 1, -1, -1]; 
 

 
    // Run the net 
 
    net.forward(inputVol); 
 

 
    // Prints '7.1' instead of '0.77'. Why??? 
 
    console.log(net.layers[1].out_act.w[0]); 
 
    </script> 
 
</body> 
 

 
</html>

+0

コードを含める必要があります。現在、これらの結果を生成したコードを推測することができます。 –

+0

@MatiasValdenegroそれは私のコードではなく、convnetがどのように動作するかという問題です。しかし、トラブルシューティングに役立つように、最小限のコードを含めるように投稿を編集しました。 – user3567174

+0

問題は、一般的にconvnetがどのように動作するか、特定のコードと結果を持っているかどうかということではなく、それらが異なる理由を尋ねています。畳み込みレイヤーは、畳み込みとバイアスとアクティブ化だけを行います。あなたが持っているコードは、何か特別なことをしているかもしれないし、そのコードを見なければなりません。 –

答えて

0

はいそれがので、それが定義された範囲内に留まるようにバイアスする起こっています。

バイアスは、畳み込み結果の各要素に追加して隣接ピクセルからの影響を追加できる値です。特定の畳み込みでは、負の数(0-255形式では表現できません)を得ることができるため、バイアスは信号が範囲外にドリフトするのを防ぎます。いくつかの負の数を表現できるように127または128のバイアスを追加することができます(その値には暗黙の+127または+128が付いています)。

関連する問題