Я использую convnetjs для создания интерактивного учебника (как я его сам узнаю). У меня есть простое изображение 9x9 «X» и сверточный слой с одним из фильтров как 3x3 '\' ... Каковы должны быть результаты свертки?
Я ожидал, что результаты будут разными. Я ожидал, что кружившийся результат будет справа (-1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1)/9 = 0.77 вместо 7.1.
Что еще происходит, что приводит к 7.1? Это связано с предубеждениями? Я также ожидал, что весь результат будет показывать наибольшие числа по диагонали '\', так как фильтр - это форма, которая будет соответствовать «\» части «X».
ОБНОВЛЕНИЕ: Я ожидал, что результаты будут следующими. Предвзятости представляют собой массив [0,1,0,1,0,1]. Каков расчет, который вычисляет приведенные выше результаты (по крайней мере, для верхнего левого пикселя), а не ниже?
<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>
Вы должны включить код, прямо сейчас вы хотите, чтобы мы догадались, какой код дал эти результаты. –
@MatiasValdenegro Это больше вопрос о том, как работает конвейн, а не мой код. Но чтобы помочь устранить неполадки, я редактировал сообщение, чтобы включить минимальный код. – user3567174
Вопрос не в том, как работает конвейн в целом, у вас есть конкретный код и результаты, и вы спрашиваете, почему они разные. Сверточный слой просто сверлит плюс смещение и активацию. Код, который у вас есть, может просто сделать что-то дополнительное, и вы должны посмотреть на код для этого. –