神经网络结构学习--输入层、卷积层、激活层、池化层和全连接层

作为一只机器学习小白,最近读图像处理方面的论文很是吃力,特此补一下这方面的知识,做一下整理方便日后查阅。神经网络的结构包括输入层、卷积层、激活层、池化层和全连接层,下面逐层进行总结。

1.输入层

即输入要训练的数据,如果是图像的话,图像一般尺寸为【宽x高x深】,深度一般为3,即R,G,B三通道,灰度图就是1吧。

2.卷积层

局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。

卷积计算:https://www.matongxue.com/madocs/32.html 建议看一下 太透彻了

卷积后的大小:(W-F+2P)/S+1

W:输入矩阵的大小,F:过滤器的大小,P:拓展边缘的层数,S:步长

https://www.cnblogs.com/wj-1314/p/9593364.html

通过特征提取我们可以获取到不同维度的矩阵

3.激活层

所谓激励,实际上是对卷积层的输出结果做一次非线性映射。 
  如果不用激励函数(其实就相当于激励函数是f(x)=x),由上面卷积层计算可知,这种情况下,每一层的输出都是上一层输入的线性函数。容易得出,无论有多少神经网络层,输出都是输入的线性组合,与没有隐层的效果是一样的,这就是最原始的感知机了。 
常用的激励函数有:

    • Sigmoid函数
    • Tanh函数
    • ReLU
    • Leaky ReLU
    • ELU
    • Maxout

  激励层建议:首先ReLU,因为迭代速度快,但是有可能效果不加。如果ReLU失效的情况下,考虑使用Leaky ReLU或者Maxout,此时一般情况都可以解决。Tanh函数在文本和音频处理有比较好的效果。

4.池化层

就是对特征图进行压缩,虽然矩阵减小,但仍保留主要特征。

5.全连接层

最后的输出层,连接所有的特征,将输出值送给分类器(如softmax分类器)。

 

很高兴能为您解答问题。关于手写数字识别,我们可以采用经典的LeNet5模型设计。该模型包括两个卷积层、两个池化层和三个全连接层卷积层用于提取特征,池化层用于压缩特征图,全连接层用于分类。具体实现可以参考下述代码: ``` python import torch import torch.nn as nn import torch.nn.functional as F class LeNet5(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5) self.pool1 = nn.MaxPool2d(kernel_size=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5) self.pool2 = nn.MaxPool2d(kernel_size=2) 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.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 其中,第一卷积层输入通道数为1,输出通道数为6,卷积核大小为5×5。第一池化层大小为2×2。第二卷积层输入通道数为6,输出通道数为16,卷积核大小为5×5。第二池化层大小为2×2。最后三个全连接层分别输出大小为120、84和10的张量,其中10表示手写数字0~9的类别数目。 我们可以使用MNIST数据集进行训练和测试,具体代码如下: ``` python import torchvision import torch.optim as optim train_set = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor()) test_set = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor()) train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_set, batch_size=64, shuffle=False) model = LeNet5() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() if batch_idx % 100 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) def test(): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) for epoch in range(1, 11): train(epoch) test() ``` 上述代码中,我们首先加载MNIST数据集,然后定义LeNet5模型、损失函数(交叉熵)和优化器(Adam)。在训练过程中,我们每100个batch输出一次损失函数值,进行模型训练;在测试过程中,我们不需要进行梯度反向传播,直接计算模型在测试集上的预测准确率。 最终输出的测试结果为:Test set: Average loss: 0.0263, Accuracy: 9911/10000 (99%),说明LeNet5模型在手写数字识别任务上表现较为出色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值