2017-02-09 11 views
0

Я использую convnetjs для создания интерактивного учебника (как я его сам узнаю). У меня есть простое изображение 9x9 «X» и сверточный слой с одним из фильтров как 3x3 '\' ... enter image description hereКаковы должны быть результаты свертки?

Я ожидал, что результаты будут разными. Я ожидал, что кружившийся результат будет справа (-1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1)/9 = 0.77 вместо 7.1.

Что еще происходит, что приводит к 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 Это больше вопрос о том, как работает конвейн, а не мой код. Но чтобы помочь устранить неполадки, я редактировал сообщение, чтобы включить минимальный код. – user3567174

+0

Вопрос не в том, как работает конвейн в целом, у вас есть конкретный код и результаты, и вы спрашиваете, почему они разные. Сверточный слой просто сверлит плюс смещение и активацию. Код, который у вас есть, может просто сделать что-то дополнительное, и вы должны посмотреть на код для этого. –

ответ

0

Да, это происходит из-за смещения так, что он остается в пределах определенной.

Bias - это значение, которое вы можете добавить к каждому элементу в результате свертки, чтобы добавить дополнительное влияние от соседних пикселей. Поскольку с некоторыми свертками можно получить отрицательные числа (которые не представляются в формате 0-255), смещение препятствует выходу сигнала из диапазона. Вы можете добавить смещение 127 или 128, чтобы можно было представить некоторые отрицательные числа (с неявным +127 или +128 в их значении).