学习CNN mnist代码 TensorFlow实现
https://zhuanlan.zhihu.com/p/27870208
bug最终解决!!! OneHot问题
https://stackoverflow.com/questions/49065312/valueerror-cannot-feed-value-of-shape-50-for-tensor-placeholder-10-which
LeNet-5实现mnist分类识别的代码解释 Tensorflow
https://www.codetd.com/article/2732227 保存模型并加载
======================================================================================================================================
LeNet-5详解
局部连接是相对于普通神经网络的全连接而言的,是指这一层的某个节点只与上一层的部分节点相连。
一个典型的神经网络的结构是全连接的,即某一层的某个节点与上一层的每个节点相连,且每个节点各自使用一套参数,这样的结构就是经典的全连接结构。
LenNet-5共有7层(不包括输入层)(2个卷积层,2个下抽样层,3个全连接层)
LeNet-5中主要的有卷积层、下抽样层、全连接层 三种连接方式。
卷积层
卷积层采用的都是5x5大小的卷积核。每个上层节点的值乘以连接上的参数,把这些乘积及一个偏置参数相加得到一个和,把该和输入激活函数,激活函数的输出即是下一层节点的值。
下抽样层
采用的是2x2的输入域,即上一层的4个节点作为下一层1个节点的输入,且输入域不重叠,即每次滑动2个像素。每个下抽样节点的4个输入节点求和后取平均,均值乘以一个参数加上一个偏置参数作为激活函数的输入,激活函数的输出即是下一层节点的值。
https://blog.youkuaiyun.com/strint/article/details/44163869
Pytorch手撕经典网络之LeNet5
class LeNet5(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, 5, padding=2) # 有padding?
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
https://zhuanlan.zhihu.com/p/29716516
详解
https://www.cnblogs.com/cathy-mu/p/7760570.html
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
https://blog.youkuaiyun.com/qq_34243930/article/details/107231539
PyTorch的nn.Linear()是用于设置网络中的全连接层的,需要注意在二维图像处理的任务中,全连接层的输入与输出一般都设置为二维张量,形状通常为[batch_size, size],不同于卷积层要求输入输出是四维张量。
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
https://pytorch.org/docs/stable/generated/torch.nn.Linear.html
其实1x1卷积,可以看成一种全连接(full connection)。
改变的只是 height × width × channels 中的 channels 这一个维度的大小
https://zhuanlan.zhihu.com/p/40050371
1*1的卷积核和全连接层有什么异同?
https://www.zhihu.com/question/274256206
CLASStorch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
stride – the stride of the window. Default value is kernel_size
https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d
======================================================================================================================================
CNN中的1D、2D、3D卷积方式
https://zhuanlan.zhihu.com/p/38782616
卷积神经网络的基本架构由3部分组成:卷积,池化 和 全连接。
卷积是用一个滑动窗口从输入图像中提取特征。
池化操作为了降低维度。
池化操作的输出图像的大小:
(输入图像宽度 - 内核宽度 + 2*padding) / 步长 + 1
https://blog.youkuaiyun.com/cicibabe/article/details/73075222
pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling三种。
特征提取的误差主要来自两个方面:
(1)邻域大小受限造成的估计值方差增大;
(2)卷积层参数误差造成估计均值的偏移。
一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。
https://blog.youkuaiyun.com/u014516389/article/details/72729946
池化目的:
为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。
https://blog.youkuaiyun.com/danieljianfeng/article/details/42433475
随机池化:
对feature map中的元素按照其概率值大小随机选择,即元素值大的被选中的概率也大。
用01均匀分布来采样,将单位长度1按照那9个概率值分成9个区间(概率越大,覆盖的区域越长,每个区间对应一个位置),然随机生成一个数后看它落在哪个区间。
https://blog.youkuaiyun.com/Losteng/article/details/51525833
深度调参是门手艺
卷积核(又叫filter,neuron)
几个小的卷积核(例如3*3)叠加(stack)在一起,相比一个大的卷积核(例如7*7),与原图的连通性不变,但是却大大降低了参数的个数以及计算复杂度!!!
深度学习喜欢小而深,厌恶大而短。
这里指的是卷积核大小,和层数。
深度学习工程师50%的时间在调参数,49%的时间在对抗过/欠拟合,剩下1%时间在修改网上down下来的程序
https://www.zhihu.com/question/38098038
全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。
在 CNN 中,全连接常出现在最后几层,用于对前面设计的特征做加权和。
在 RNN 中,全连接用来把 embedding 空间拉到隐层空间,把隐层空间转回 label 空间等。
https://www.zhihu.com/question/41037974
softmax的输入层和输出层的维度是一样的,如果不一样,就在输入至 softmax 层之前通过一层全连接层。
https://www.jianshu.com/p/88bb976ccbd9
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类
https://www.jianshu.com/p/ffa51250ba2e