要理解卷积,首先你要理解什么是全连接和局部连接,全连接是什么?举个例子,100*100大小的图像,假设有100个隐含神经元,那么就有100*100*100个连接,
太可怕,局部连接是什么,假设每个隐含神经元只局部连接10*10,那么就有10*10*100个连接。
那么什么是卷积,什么又是权值共享?
说道权值共享,就需要提到感受野,感受野其实就是一个隐含神经元的局部连接大小,权值共享就是感受野的权值一样,也就是说,假设这层的感受野是2*2,这层隐含神经元就会有100*(2*2+1)的连接,这里代表偏置。
卷积呢?这里的卷积和信号里面的卷积还是有一定区别的,这里的目的是,用小样本来学习大样本的特征,假如小样本是8*8,那么每个神经元就可以得到(100-8+1)*(100-8+1)个特征,这一层就一共有100*93*93个卷积特征。
什么是池化呢?
上面卷积不是获得了特征吗?可是还是有很多的维数啊,100*93*93维的卷积特征,太庞大了,为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。
也就是说,池化就是特征的聚合统计,依据于图像的静态性属性。
做完以上工作,再进行全连接层的建立,训练,并加上分类器,分类器可有有很多,KNN,softmax,SVM等等,再进行常规的训练,也可以用wake-sleep的训练。
h_relu = self.input_linear(x).clamp(min=0)
for _ in range(random.randint(0, 3)):
h_relu = self.middle_linear(h_relu).clamp(min=0)
y_pred = self.output_linear(h_relu)
return y_pred
CNN中权值共享理解
第一步,针对一个神经元,一幅640*360图像,一个神经元要对应640*360个像素点,即一个神经元对应全局图像,全连接的话一个神经元就有640*360个参数;
第二步,然而,图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些不同局部的神经元综合起来就可以得到全局信息。假如每个局部感受野10*10,每个局部感受野只需要和10*10的局部图像连接,这样一个神经元就只需要10*10个参数;
第三步,全局图像是640*360,但局部图像只有10*10大小,10*10个参数只针对局部图像,如果全局图像中各个局部图像之间权值共享的话,即10*10个参数在不同局部图像上参数应用相同的话,则在全局图像上通过全局共享则只需要10*10个参数;
第四步,10*10个参数只针对一个神经元,要是有100万个神经元,则需要100万*10*10个参数,神经元多后,参数还是太大,如果每个神经元的这10*10个参数相同呢,这样就还是只需要10*10参数,因而经过局部感受野到权值共享再到每个神经元的10*10个参数相同,不管图像多大,不管每层神经元个数多少,而两层间连接还是只需要求解10*10个参数;
第五步,由于只有一个滤波器,只提取了一种特征,特征也太少了。一种滤波器也就是一种卷积核就是提取图像一种特征,例如某个方向的边缘。那么我们需要提取不同特征怎么办,多加几个滤波器不就行了。假设我们加到100种滤波器,每种滤波器的参数不一样,表示提取输入图像不同特征,例如不同边缘。这样不同滤波器去卷积图像就得到不同特征的放映,我们称之为Feature Map,所以100中卷积核就有100个Feature Map,这100个Feature Map就组成了一层神经元。我们这一层有多少个参数到这时候就明了吧,100种卷积核 * 每种卷积核100个参数 = 100 * 100 = 10000个参数。
最后,刚才说每一个隐藏层的参数个数和隐藏层的神经元个数无关,只和滤波器大小和滤波器种类数有关,那么隐藏层的神经元个数怎么确定呢?它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!假如我的图像是1000*1000像素的,而滤波器大小是10*10,假设步长为10,即滤波器没有重叠,这样隐藏层的神经元个数就是 1000 * 1000 / (10*10) = 100*100个神经元(如果步长为8,卷积核会重叠2个像素)。这只是一种滤波器,也就是一个Feature Map的神经元个数哦,如果100个Feature Map就是100倍了,
需要注意一点,上面的讨论都没有考虑每个神经元的偏置部分,所以权值个数需要加1,这也是同一种滤波器共享。如滤波器10*10,卷积核个数6,则参数个数为:
(10*10 +1) * 6 = 606.
要理解卷积,首先你要理解什么是全连接和局部连接,全连接是什么?举个例子,100*100大小的图像,假设有100个隐含神经元,那么就有100*100*100个连接,
太可怕,局部连接是什么,假设每个隐含神经元只局部连接10*10,那么就有10*10*100个连接。
那么什么是卷积,什么又是权值共享?
说道权值共享,就需要提到感受野,感受野其实就是一个隐含神经元的局部连接大小,权值共享就是感受野的权值一样,也就是说,假设这层的感受野是2*2,这层隐含神经元就会有100*(2*2+1)的连接,这里代表偏置。
卷积呢?这里的卷积和信号里面的卷积还是有一定区别的,这里的目的是,用小样本来学习大样本的特征,假如小样本是8*8,那么每个神经元就可以得到(100-8+1)*(100-8+1)个特征,这一层就一共有100*93*93个卷积特征。
什么是池化呢?
上面卷积不是获得了特征吗?可是还是有很多的维数啊,100*93*93维的卷积特征,太庞大了,为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。
也就是说,池化就是特征的聚合统计,依据于图像的静态性属性。
做完以上工作,再进行全连接层的建立,训练,并加上分类器,分类器可有有很多,KNN,softmax,SVM等等,再进行常规的训练,也可以用wake-sleep的训练。
h_relu = self.input_linear(x).clamp(min=0)
for _ in range(random.randint(0, 3)):
h_relu = self.middle_linear(h_relu).clamp(min=0)
y_pred = self.output_linear(h_relu)
return y_pred
CNN中权值共享理解
第一步,针对一个神经元,一幅640*360图像,一个神经元要对应640*360个像素点,即一个神经元对应全局图像,全连接的话一个神经元就有640*360个参数;
第二步,然而,图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些不同局部的神经元综合起来就可以得到全局信息。假如每个局部感受野10*10,每个局部感受野只需要和10*10的局部图像连接,这样一个神经元就只需要10*10个参数;
第三步,全局图像是640*360,但局部图像只有10*10大小,10*10个参数只针对局部图像,如果全局图像中各个局部图像之间权值共享的话,即10*10个参数在不同局部图像上参数应用相同的话,则在全局图像上通过全局共享则只需要10*10个参数;
第四步,10*10个参数只针对一个神经元,要是有100万个神经元,则需要100万*10*10个参数,神经元多后,参数还是太大,如果每个神经元的这10*10个参数相同呢,这样就还是只需要10*10参数,因而经过局部感受野到权值共享再到每个神经元的10*10个参数相同,不管图像多大,不管每层神经元个数多少,而两层间连接还是只需要求解10*10个参数;
第五步,由于只有一个滤波器,只提取了一种特征,特征也太少了。一种滤波器也就是一种卷积核就是提取图像一种特征,例如某个方向的边缘。那么我们需要提取不同特征怎么办,多加几个滤波器不就行了。假设我们加到100种滤波器,每种滤波器的参数不一样,表示提取输入图像不同特征,例如不同边缘。这样不同滤波器去卷积图像就得到不同特征的放映,我们称之为Feature Map,所以100中卷积核就有100个Feature Map,这100个Feature Map就组成了一层神经元。我们这一层有多少个参数到这时候就明了吧,100种卷积核 * 每种卷积核100个参数 = 100 * 100 = 10000个参数。
最后,刚才说每一个隐藏层的参数个数和隐藏层的神经元个数无关,只和滤波器大小和滤波器种类数有关,那么隐藏层的神经元个数怎么确定呢?它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!假如我的图像是1000*1000像素的,而滤波器大小是10*10,假设步长为10,即滤波器没有重叠,这样隐藏层的神经元个数就是 1000 * 1000 / (10*10) = 100*100个神经元(如果步长为8,卷积核会重叠2个像素)。这只是一种滤波器,也就是一个Feature Map的神经元个数哦,如果100个Feature Map就是100倍了,
需要注意一点,上面的讨论都没有考虑每个神经元的偏置部分,所以权值个数需要加1,这也是同一种滤波器共享。如滤波器10*10,卷积核个数6,则参数个数为:
(10*10 +1) * 6 = 606.
输入层:对于一幅1000x1000大小的图像(假设为灰度图,不考虑3通道),我们把这个图像作为神经网络的输入层,那么输入层的神经元的个数就是每个像素点,个数为1000x1000个。
隐层:我们再规定和这个输入层连接的隐层的神经元个数为1000,000个。
输入层和隐层之间肯定是通过权值(重)W连接起来的,即X*W=Y(W为权值,X为输入,Y为隐层),如果不是权值共享,而是最基本的全连接,那么W的维数就是1000x1000x1000,000,这样的话,W有点太多了。于是想法减少W的维数。
方法:让隐层的1000,000个神经元里的每个神经元“只”和输入层的10x10个神经元进行连接,而不是和输入层的1000x1000个神经元进行连接。这就是感受野。
上面提到的方法还不是权值共享,因为还有提升,如下:
权值共享:在上述方法中我们得到的输入层和隐层之间连接的W的维度变成了:1000,000 x 10 x 10,假定这些W中的每个元素都是不同的,那么我们需要把所有的W元素都保存下来以备之后使用,但是如果这些W全都是10 x 10个权重的复制呢?也就是说隐层的每个神经元跟图像上不同区域的10 x 10个神经元的连接都是相同的,那么我们最后得到的W只有10x10大小了,只需要保存100个参数就可以了。当然,这样做也太粗糙了,肯定提取的特征太少,没关系啊,我们多加几个10 x 10大小的W不就可以了,比如100个,那 就可以提取100次特征了,而总的W的维度(输入与隐藏的连接个数)就变成了100 x 10x10=10,000个。
这就是权值共享的全部。