CNN 卷積神經網路-- 殘差計算
前言
CNN
cnn每一層會輸出多個feature map, 每個feature map由多個神經元組成,假如某個feature map的shape是m*n, 則該feature map有m*n個神經元
卷積層
卷積計算
設當前層l為卷積層,下一層l+1為子取樣層subsampling.
則卷積層l的輸出feature map為:
殘差計算
設當前層l為卷積層,下一層l+1為子取樣層subsampling.
第l層的第j個feature map的殘差公式為:
其中
其導數
為了之後的推導,先提前講講subsample過程,比較簡單,假設取樣層是對卷積層的均值處理,如卷積層的輸出feature map(
則經過subsample的結果是:
subsample過程如下:
import java.util.Arrays;
/**
* Created by keliz on 7/7/16.
*/
public class test
{
/**
* 卷積核或者取樣層scale的大小,長與寬可以不等.
*/
public static class Size
{
public final int x;
public final int y;
public Size(int x, int y)
{
this.x = x;
this.y = y;
}
}
/**
* 對矩陣進行均值縮小
*
* @param matrix
* @param scale
* @return
*/
public static double[][] scaleMatrix(final double[][] matrix, final Size scale)
{
int m = matrix.length;
int n = matrix[0].length;
final int sm = m / scale.x;
final int sn = n / scale.y;
final double[][] outMatrix = new double[sm][sn];
if (sm * scale.x != m || sn * scale.y != n)
throw new RuntimeException("scale不能整除matrix");
final int size = scale.x * scale.y;
for (int i = 0; i < sm; i++)
{
for (int j = 0; j < sn; j++)
{
double sum = 0.0;
for (int si = i * scale.x; si < (i + 1) * scale.x; si++)
{
for (int sj = j * scale.y; sj < (j + 1) * scale.y; sj++)
{
sum += matrix[si][sj];
}
}
outMatrix[i][j] = sum / size;
}
}
return outMatrix;
}
public static void main(String args[])
{
int row = 4;
int column = 4;
int k = 0;
double[][] matrix = new double[row][column];
Size s = new Size(2, 2);
for (int i = 0; i < row; ++i)
for (int j = 0; j < column; ++j)
matrix[i][j] = ++k;
double[][] result = scaleMatrix(matrix, s);
System.out.println(Arrays.deepToString(matrix).replaceAll("],", "]," + System.getProperty("line.separator")));
System.out.println(Arrays.deepToString(result).replaceAll("],", "]," + System.getProperty("line.separator")));
}
}
其中3.5=(1+2+5+6)/(2*2); 5.5=(3+4+7+8)/(2*2)
由此可知,卷積層輸出的feature map中的值為1的節點,值為2的節點,值為5的節點,值為6的節點(神經元)與subsample層的值為3.5的節點相連線,值為3,值為4,值為7,值為8節點與subsample層的值為5.5節點相連線。由BP演算法章節的推導結論可知
卷積層第j個節點的殘差等於子取樣層與其相連線的所有節點的權值乘以相應的殘差的加權和再乘以該節點的導數
對著公式看比較容易理解這句話。
假設子取樣層的對應文中的卷積層的殘差
按照公式(1),節點1值為0.5的殘差是
因為這是計算單個神經元的殘差,所以需要把
即
同理,對於節點2,
殘差為
對於節點5,
殘差為
對於節點6,
殘差為
因為節點3對應的子取樣層的殘差是0.6,所以節點3的殘差為
即