我正在使用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>
答案 0 :(得分:0)
是的,因为偏差而发生这种情况,因此它会保持在定义的范围内。
偏差是您可以添加到卷积结果中的每个元素的值,以添加来自相邻像素的其他影响。由于某些卷积可能会得到负数(在0-255格式中无法表示),因此偏差可防止信号偏离范围。您可以选择添加127或128的偏差以允许某些负数表示(其值中隐含+127或+128)。