帮我把下面这段文字换一种表达方式:第一次卷积操作从图像(0, 0) 像素开始,由卷积核中参数与对应位置图像像素逐位相乘后累加作为一次卷积操作结果,即1 × 1 + 2 × 0 + 3 × 1 + 6 × 0 +7 × 1 + 8 × 0 + 9 × 1 + 8 × 0 + 7 × 1 = 1 + 3 + 7 + 9 + 7 = 27,如下图a所示。类似地,在步长为1时,如图b至图d所示,卷积核按照步长大小在输入图像上从左至右自上而下依次将卷积操作进行下去,最终输出3 × 3 大小的卷积特征,同时该结果将作为下一层操作的输入。
时间: 2023-03-09 07:14:23 浏览: 74
从图像 (0, 0) 像素开始,通过将卷积核中参数与对应位置图像像素逐位相乘后累加,按照步长为1在输入图像上从左至右自上而下依次进行卷积操作,最终输出3×3大小的卷积特征,其结果将作为下一层操作的输入。
相关问题
cnn卷积神经网络方法
### 卷积神经网络 (CNN) 的工作原理
卷积神经网络是一种专门设计用于处理具有网格状拓扑结构的数据的深度学习架构,最常见的是二维表格形式的图像数据。通过多层感知器的应用改进而来,CNN 特别擅长于自动提取和学习输入数据的空间层次特征。
#### 输入层
当涉及到像手写数字识别这样的应用时,输入通常是表示灰度或彩色像素强度值的矩阵[^1]。对于MNIST数据库的手写数字图片来说,每张图像是由28×28=784个像素组成的单通道灰度图像。
#### 卷积层
在卷积层中执行的操作是核心所在。这里会应用多个小型滤波器(也称为内核),这些滤波器会在整个输入空间滑动并计算局部区域内的加权求和。这种机制允许检测边缘、纹理和其他视觉模式等低级特性;随着层数增加,则能够捕获更复杂的高级语义信息。此过程有助于保持物体的位置无关性即平移不变性的特性[^2]。
```python
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# 定义第一个卷积层
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
```
#### 激活函数
为了引入非线性因素,在每次卷积之后通常还会加上一个激活函数。这使得模型能更好地拟合复杂的真实世界分布情况。常用的激活函数有ReLU及其变体Leaky ReLU,因为它们相较于sigmoid和tanh拥有更快的速度以及较少发生梯度消失的问题[^3]。
```python
def forward(self, x):
# 应用第一次卷积后的激活函数
x = F.relu(self.conv1(x))
```
#### 池化层
紧接着卷积操作的就是下采样阶段——池化(pooling),它负责减少参数数量从而降低过拟合风险的同时保留最重要的特征。最大池化是最常见的做法之一,即将每个窗口内的最高响应作为该位置的新代表值输出给后续层继续加工。
```python
# 添加最大池化层
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
def forward(self, x):
...
# 经历一次最大池化
x = self.pool(F.relu(self.conv1(x)))
```
利用CNN卷积神经网络识别手写数字
### 如何使用CNN卷积神经网络进行手写数字识别
#### CNN简介
卷积神经网络(Convolutional Neural Network, CNN)是一种专门设计用于处理具有网格结构的数据的深度学习模型,如图像数据。CNN通过局部感知野、共享权重以及池化操作来减少参数数量并提高特征提取能力[^1]。
#### 数据准备
为了训练一个能够对手写数字进行分类的CNN模型,通常会采用MNIST数据库作为输入数据集。该数据集中包含了大量已经标注好的灰度手写数字图片,每张图像是28×28像素大小。在实际应用前,这些原始图像需要经过预处理步骤,比如标准化和归一化等操作。
```python
import torch
from torchvision import datasets, transforms
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
testset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=False, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=True)
```
#### 构建CNN架构
构建适合于解决这个问题的具体CNN架构非常重要。下面给出了一种简单的两层卷积加一层全连接的设计方案:
- 输入层接收尺寸为\(28 \times 28\)的手写数字图像;
- 卷积层1:使用\(5\times5\)滤波器执行第一次卷积运算,并激活函数ReLU;
- 最大池化层1:对上一步的结果做最大池化降采样;
- 卷积层2:再次利用相同大小的滤波器重复上述过程;
- 最大池化层2:继续降低空间维度的同时保留重要信息;
- 展平(Flatten): 将多维数组转换成向量形式以便后续处理;
- 全连接层(Dense Layer):最后接一个线性变换输出各个类别的概率分布;
```python
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
# 定义两个卷积层
self.conv1 = torch.nn.Conv2d(in_channels=1, out_channels=32, kernel_size=(5, 5))
self.pool = torch.nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=(5, 5))
# 定义展平后的全连接层
self.fc1 = torch.nn.Linear(64 * 4 * 4, 512)
self.fc2 = torch.nn.Linear(512, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 64 * 4 * 4)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
model = Net()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters())
```
#### 训练与评估模型
完成以上准备工作之后就可以开始正式训练这个CNN模型了。这里提供了一个基本框架来进行迭代更新权值直到达到满意的性能指标为止。同时,在验证阶段也需要定期测试当前版本的表现情况以防止过拟合现象的发生。
```python
epochs = 5
for e in range(epochs):
running_loss = 0
for images, labels in trainloader:
optimizer.zero_grad()
output = model(images)
loss = criterion(output, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Training Loss: {running_loss/len(trainloader)}")
correct_count, all_count = 0, 0
for images,labels in testloader:
for i in range(len(labels)):
img = images[i].view(1, 1, 28, 28)
with torch.no_grad():
logps = model(img)
ps = torch.exp(logps)
probab = list(ps.numpy()[0])
pred_label = probab.index(max(probab))
true_label = labels.numpy()[i]
if(true_label == pred_label):
correct_count += 1
all_count += 1
print("Number Of Images Tested =", all_count)
print("\nModel Accuracy =", (correct_count/all_count)*100)
```
阅读全文
相关推荐
















