当前位置: 首页 > news >正文

卷积神经网络(CNN)简单原理与简单代码实现

卷积神经网络(CNN)简单原理与简单代码实现

  • 卷积神经网络(CNN)简单原理
    • 基本原理
      • 卷积层(Convolutional Layer):
      • 激活层(Activation Layer):
      • 池化层(Pooling Layer):
      • 全连接层(Fully Connected Layer):
        • 主要特点
      • 简单代码实现

卷积神经网络(CNN)简单原理

卷积神经网络(Convolutional Neural Network, CNN)是深度学习领域中一种重要的网络结构,特别适用于处理具有网格结构的数据,如图像。其基本原理和主要特点如下:

基本原理

卷积层(Convolutional Layer):

卷积层是CNN的核心,它通过卷积操作从输入数据中提取特征。
卷积操作是使用一个或多个可学习的滤波器(或称卷积核)在输入数据上滑动,计算滤波器与输入数据对应区域的点积,生成特征图(Feature Map)。
每个滤波器都可以提取输入数据的一种特征,因此,使用多个滤波器可以提取多种特征。

激活层(Activation Layer):

激活层通常紧跟在卷积层之后,用于增加模型的非线性。
常用的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid、Tanh等。其中,ReLU函数因其简单有效而被广泛使用。

池化层(Pooling Layer):

池化层用于降低特征图的维度,减少计算量,并增强模型的鲁棒性。
常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化取池化区域内的最大值作为输出,而平均池化则取平均值。

全连接层(Fully Connected Layer):

全连接层通常位于CNN的末端,用于将前面提取到的特征映射到样本的类别上。
在全连接层中,每个神经元都与前一层的所有神经元相连。

主要特点

局部连接:卷积层中的每个神经元仅与输入数据的一个局部区域相连,这有助于捕捉图像的局部特征。
参数共享:同一个卷积核在输入数据的不同位置共享相同的参数,这大大减少了模型的参数数量。
平移不变性:由于池化层的存在,CNN对输入数据的平移变换具有一定的不变性。

简单代码实现

以下是一个使用PyTorch框架实现的简单CNN模型,用于手写数字识别(MNIST数据集):

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
import torchvision  
import torchvision.transforms as transforms  # 数据预处理  
transform = transforms.Compose([  transforms.ToTensor(),  transforms.Normalize((0.5,), (0.5,))  
])  trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)  
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)  testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)  
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)  # 定义CNN模型  
class ConvNet(nn.Module):  def __init__(self):  super(ConvNet, self).__init__()  self.conv1 = nn.Conv2d(1, 10, 5)  # 输入通道数为1,输出通道数为10,卷积核大小为5x5  self.pool = nn.MaxPool2d(2, 2)    # 池化窗口大小为2x2,步长为2  self.conv2 = nn.Conv2d(10, 20, 5) # 输入通道数为10,输出通道数为20,卷积核大小为5x5  self.fc = nn.Linear(320, 10)      # 全连接层,输入特征维度为320,输出类别数为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, 320)  # 展平操作  x = self.fc(x)  return x  # 初始化模型、损失函数和优化器  
model = ConvNet()  
criterion = nn.CrossEntropyLoss()  
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)  # 训练模型  
for epoch in range(10):  # 假设训练10个epoch  running_loss = 0.0  for i, data in enumerate(trainloader, 0):  inputs, labels = data  optimizer.zero_grad()  outputs = model(inputs)  loss = criterion(outputs, labels)  loss.backward()  optimizer.step()  running_loss += loss.item()  print(f'Epoch {epoch+1}, Loss: {running_loss/len(trainloader)}')  # 测试模型(代码略,通常包括关闭梯度计算、遍历测试集、计算准确率等步骤)

这段代码首先定义了数据预处理步骤,然后定义了一个简单的CNN模型,该模型包含两个卷积层、两个池化层和一个全连接层。接着,初始化了模型、损失函数和优化器,并展示了训练模型的基本流程。需要注意的是,测试模型的代码部分在这里被省略了,但通常包括关闭梯度计算、遍历测试集、计算模型输出与真实标签之间的损失或准确率等步骤。

在TensorFlow中实现一个简单的卷积神经网络(CNN)通常涉及以下几个步骤:定义模型结构、编译模型、训练模型以及评估模型。以下是一个使用TensorFlow 2(及其高级API Keras)实现的简单CNN示例,该示例用于手写数字识别(MNIST数据集)。

import tensorflow as tf  
from tensorflow.keras import datasets, layers, models  
import numpy as np  # 加载并预处理数据  
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()  # 将图像从整数转换为浮点数,并归一化到0到1的范围内  
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255  
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255  # 定义模型结构  
model = models.Sequential()  
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))  
model.add(layers.MaxPooling2D((2, 2)))  
model.add(layers.Conv2D(64, (3, 3), activation='relu'))  
model.add(layers.MaxPooling2D((2, 2)))  
model.add(layers.Conv2D(64, (3, 3), activation='relu'))  
model.add(layers.Flatten())  
model.add(layers.Dense(64, activation='relu'))  
model.add(layers.Dense(10))  # 编译模型  
model.compile(optimizer='adam',  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),  metrics=['accuracy'])  # 训练模型  
history = model.fit(train_images, train_labels, epochs=10,   validation_data=(test_images, test_labels))  # 评估模型  
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)  
print('\nTest accuracy:', test_acc)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 人工智能自动驾驶三维车道线检测—PersFormer模型代码详解
  • 【算法模板】图论:Tarjan算法求割边割点
  • datawind可视化查询-计数count(xxx)函数
  • Brave浏览器:开启隐私保护新时代
  • 按照指定格式打印pprint()
  • 自动化测试面试题
  • LeetCode459 重复的子字符串
  • 按xls标签替换docx及xls内容
  • docker-compose笔记
  • Scrapy入门篇
  • 小米账号移除工具箱 | 移除MXTGT工具箱
  • IO流学习总结
  • 定时任务-xxl-job
  • Rabbitmq的死信队列与如何利用死信队列实现延迟队列
  • gitlab-runner /var/run/docker.sock connect permission denied
  • [PHP内核探索]PHP中的哈希表
  • 【译】JS基础算法脚本:字符串结尾
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 4个实用的微服务测试策略
  • CSS相对定位
  • ERLANG 网工修炼笔记 ---- UDP
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • node-glob通配符
  • October CMS - 快速入门 9 Images And Galleries
  • Python 基础起步 (十) 什么叫函数?
  • RxJS: 简单入门
  • Twitter赢在开放,三年创造奇迹
  • webpack+react项目初体验——记录我的webpack环境配置
  • 记录一下第一次使用npm
  • 力扣(LeetCode)357
  • 听说你叫Java(二)–Servlet请求
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 06-01 点餐小程序前台界面搭建
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (09)Hive——CTE 公共表达式
  • (3)(3.5) 遥测无线电区域条例
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四)进入MySQL 【事务】
  • (五)Python 垃圾回收机制
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)负载均衡,回话保持,cookie
  • .NET Core 项目指定SDK版本
  • .Net IOC框架入门之一 Unity
  • .net 简单实现MD5
  • .NET 药厂业务系统 CPU爆高分析
  • .Net转Java自学之路—基础巩固篇十三(集合)