卷积神经网络初识

Posted 骐程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络初识相关的知识,希望对你有一定的参考价值。

    卷积神经网络是基本的一种运算,多用于来处理和矩阵有关的对象,如二维数组形式储存的图片等!

1.卷积运算初识
    卷积运算是两个矩阵运算所得,主要是相乘(和真正线性代数中的乘不一样,如下图所示)

图1 卷积图运算图示

图中浅蓝色九宫格和被覆盖的无色格子矩阵相乘(每个格子里面有一个数字),乘后数字和为深蓝色格子中值。依次覆盖,让浅蓝色格子覆盖完空白格子,可以得到:

卷积神经网络初识

图2 卷积计算后


    卷积运算主要适应于图片处理(含视频处理),处理后有高斯模糊、梦境效果等诸多效果。

    

2.演示:
主要运算演示如下:

卷积神经网络初识

图3 卷积运算演示图

顺便可以看下代码的具体卷积操作:

//卷积运算实例(运算后结果为一个2*2矩阵)

public class jjstraight {
    public static void main(String[] args) {
        //测试数组
        int[][] img = new int[][] {{6,1,3,5},{4,6,8,2},{4,8,8,6},{5,6,8,2}};
        //卷积核
        int[][] kArray = {{-1,-1,-8},{-1,25,-1},{-1,1,-1}};
        //卷积之后数组
        int width =img.length-kArray.length+1;
        int height = img[0].length-kArray[0].length+1;
        int[][] ima = new int[width][height];
        for(int i=0;i<width;i++) {
            for(int j = 0;j<height;j++) {
                for(int m =0;m < kArray.length;m++) {
                    for(int n = 0;n<kArray.length;n++) {
                        ima[i][j] =  (int)((img[i+m][j+n])*kArray[m][n]);
                    }
                }
            }
        }
        for(int i=0; i<ima.length; i++) {
            System.out.println(Arrays.toString(ima[i]));
        }
    }
}

图4 运算后结果

3.问题处理:
    从上面的演示能够看出会有边缘最后一圈的像素点没有卷积运算中的值,那么就会有几种常见的办法处理图像边缘

     ① 不管边缘:就是如果边缘占比足够小而且对输出结果没啥影响时的操作)

     对图像而言,像素特别多,最外一圈没有特殊要求不做处理也可以,对图片几乎没有视觉观看影响,但对机器的显示和处理是有影响的。
      ②直接舍掉边缘未处理区域:也就是说输出的只有绿色部分,当然这种办法无法输出全部图像,因而很少使用
     ③填充周围:使用一些假像素(通常是0)来填充边缘,从而产生与输入相同大小的输出。
    ④步幅增大:使用更大的滑动步幅,常见于图像缩小时(池化)的操作,这里不再赘述
  
    通过边缘的处理,我们最终会得到处理后的图像数据,特征提取完成,输出即可完成特征映射,如演示中所示!

    二维卷积常见于灰度图的操作!


以上是关于卷积神经网络初识的主要内容,如果未能解决你的问题,请参考以下文章

初识——卷积神经网络

机器学习 | 卷积神经网络初识

1. CNN卷积网络初识

卷积神经网络之卷积层理解(持续更新)

啊哈~花一天快速上手Pytorch(可能是全网最全流程从0到部署)

34-卷积神经网络(Conv)