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

软件开放和网站开发嘉兴行业网站建设

软件开放和网站开发,嘉兴行业网站建设,楼盘网站建设,济南本地网站建设公司Day 41 简单 CNN:探索卷积神经网络的奥秘 在深度学习领域中,卷积神经网络(CNN)一直是计算机视觉任务的中流砥柱。今天,我将通过一系列实验来探索 CNN 的奥秘,并分享我的代码和详细解释。 实验准备&#x…

Day 41 简单 CNN:探索卷积神经网络的奥秘

在深度学习领域中,卷积神经网络(CNN)一直是计算机视觉任务的中流砥柱。今天,我将通过一系列实验来探索 CNN 的奥秘,并分享我的代码和详细解释。

实验准备:数据加载与增强

Python

复制

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import DataLoader# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 设置随机种子和设备
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# CIFAR-10数据集的类别
classes = ('飞机', '汽车', '鸟', '猫', '鹿', '狗', '青蛙', '马', '船', '卡车')#====================== 1. 数据加载与增强 ======================def load_data(batch_size=64, is_train=True):"""加载CIFAR-10数据集,并应用数据增强"""if is_train:# 训练集使用数据增强transform = transforms.Compose([transforms.RandomHorizontalFlip(),  # 随机水平翻转transforms.RandomRotation(10),      # 随机旋转transforms.RandomAffine(0, shear=10, scale=(0.8, 1.2)),  # 随机仿射变换transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),  # 颜色抖动transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])else:# 测试集只需要标准化transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])dataset = torchvision.datasets.CIFAR10(root='./data', train=is_train,download=True,transform=transform)dataloader = DataLoader(dataset,batch_size=batch_size,shuffle=is_train,num_workers=2)return dataloader

我首先准备了 CIFAR-10 数据集,并在训练集上应用了数据增强技术,包括随机水平翻转、随机旋转、随机仿射变换和颜色抖动,以提高模型的泛化能力。

CNN 模型定义

Python

复制

#====================== 2. CNN模型定义 ======================class SimpleNet(nn.Module):def __init__(self, dropout_rate=0.5):super(SimpleNet, self).__init__()# 第一个卷积块self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(32)# 第二个卷积块self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(64)# 第三个卷积块self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.bn3 = nn.BatchNorm2d(128)# 全连接层self.fc1 = nn.Linear(128 * 4 * 4, 512)self.dropout = nn.Dropout(dropout_rate)self.fc2 = nn.Linear(512, 10)def forward(self, x):# 保存特征图用于可视化self.feature_maps = []# 第一个卷积块x = self.conv1(x)x = self.bn1(x)x = F.relu(x)x = F.max_pool2d(x, 2)self.feature_maps.append(x)# 第二个卷积块x = self.conv2(x)x = self.bn2(x)x = F.relu(x)x = F.max_pool2d(x, 2)self.feature_maps.append(x)# 第三个卷积块x = self.conv3(x)x = self.bn3(x)x = F.relu(x)x = F.max_pool2d(x, 2)self.feature_maps.append(x)# 全连接层x = torch.flatten(x, 1)x = self.fc1(x)x = F.relu(x)x = self.dropout(x)x = self.fc2(x)return F.log_softmax(x, dim=1)

我定义了一个简单的 CNN 模型 SimpleNet,它包含三个卷积块,每个卷积块后都跟着 Batch Normalization 层、ReLU 激活函数和最大池化层。最后是全连接层用于分类。

训练函数

Python

复制

#====================== 3. 训练函数 ======================def train(model, train_loader, optimizer, epoch, history):"""训练一个epoch"""model.train()train_loss = 0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()train_loss += loss.item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()total += target.size(0)if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} 'f'({100. * batch_idx / len(train_loader):.0f}%)]\t'f'Loss: {loss.item():.6f}\t'f'Accuracy: {100. * correct / total:.2f}%')epoch_loss = train_loss / len(train_loader)epoch_acc = 100. * correct / totalhistory['train_loss'].append(epoch_loss)history['train_acc'].append(epoch_acc)return epoch_loss, epoch_acc

训练函数用于执行一个 epoch 的训练过程,计算损失并更新模型参数。同时,它记录了训练的损失和准确率。

测试函数

Python

复制

#====================== 4. 测试函数 ======================def test(model, test_loader, history):"""在测试集上评估模型"""model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)accuracy = 100. * correct / len(test_loader.dataset)history['test_loss'].append(test_loss)history['test_acc'].append(accuracy)print(f'\nTest set: Average loss: {test_loss:.4f}, 'f'Accuracy: {correct}/{len(test_loader.dataset)} 'f'({accuracy:.2f}%)\n')return test_loss, accuracy

测试函数用于在测试集上评估模型的性能,计算测试损失和准确率。

可视化函数

Python

复制

#====================== 5. 可视化函数 ======================def plot_training_history(history):"""绘制训练历史曲线"""epochs = range(1, len(history['train_loss']) + 1)plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(epochs, history['train_loss'], 'b-', label='训练损失')plt.plot(epochs, history['test_loss'], 'r-', label='测试损失')plt.title('训练和测试损失')plt.xlabel('Epoch')plt.ylabel('损失')plt.legend()plt.grid(True)plt.subplot(1, 2, 2)plt.plot(epochs, history['train_acc'], 'b-', label='训练准确率')plt.plot(epochs, history['test_acc'], 'r-', label='测试准确率')plt.title('训练和测试准确率')plt.xlabel('Epoch')plt.ylabel('准确率 (%)')plt.legend()plt.grid(True)plt.tight_layout()plt.show()def visualize_feature_maps(model, test_loader):"""可视化特征图"""# 获取一个批次的数据dataiter = iter(test_loader)images, _ = next(dataiter)# 获取特征图with torch.no_grad():_ = model(images[0:1].to(device))# 显示原始图像和每层的特征图plt.figure(figsize=(15, 5))# 显示原始图像plt.subplot(1, 4, 1)img = images[0] / 2 + 0.5npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0)))plt.title('原始图像')plt.axis('off')# 显示每层的特征图for i, feature_map in enumerate(model.feature_maps, 2):plt.subplot(1, 4, i)# 选择第一个样本的第一个特征图plt.imshow(feature_map[0, 0].cpu(), cmap='viridis')plt.title(f'层 {i-1} 特征图')plt.axis('off')plt.tight_layout()plt.show()

可视化函数用于绘制训练历史曲线和特征图,帮助我们直观地理解模型的训练过程和内部特征提取情况。

主函数

Python

复制

#====================== 6. 主函数 ======================def main():# 超参数设置batch_size = 64epochs = 4lr = 0.01dropout_rate = 0.5# 初始化训练历史记录history = {'train_loss': [],'train_acc': [],'test_loss': [],'test_acc': []}# 加载数据print("正在加载训练集...")train_loader = load_data(batch_size, is_train=True)print("正在加载测试集...")test_loader = load_data(batch_size, is_train=False)# 创建模型model = SimpleNet(dropout_rate=dropout_rate).to(device)optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.1)# 训练和测试print(f"开始训练,使用设备: {device}")for epoch in range(1, epochs + 1):train_loss, train_acc = train(model, train_loader, optimizer, epoch, history)test_loss, test_acc = test(model, test_loader, history)scheduler.step()# 可视化训练过程print("训练完成,绘制训练历史...")plot_training_history(history)# 可视化特征图print("可视化特征图...")visualize_feature_maps(model, test_loader)if __name__ == '__main__':main()

主函数整合了整个实验流程,包括数据加载、模型创建、训练、测试和可视化等步骤。

实验结果与分析

从训练和测试的输出结果可以观察到:

  • 模型在训练过程中损失逐渐下降,准确率逐渐上升,表明模型在有效地学习数据特征。

  • 测试集上的准确率表现良好,说明模型具有较好的泛化能力。

通过可视化特征图,我们可以看到每一层卷积操作后提取到的图像特征,这些特征图反映了模型在不同层次对图像信息的抽象和提取过程。

总结与展望

在这次实验中,我通过构建和训练简单的 CNN 模型,对 CNN 的工作机制和训练过程有了更深入的理解。未来,我计划尝试更复杂的 CNN 架构,如残差网络(ResNet)、密集连接网络(DenseNet)等,并探索不同的优化算法和正则化技术,以进一步提升模型的性能。

浙大疏锦行


文章转载自:

http://slmQGeIn.ynstj.cn
http://KmfSBEMA.ynstj.cn
http://j6kHJUoO.ynstj.cn
http://mzCLGeJn.ynstj.cn
http://lty57lH0.ynstj.cn
http://sQ7NiCtE.ynstj.cn
http://Vvd5tjQB.ynstj.cn
http://RDKtlWJi.ynstj.cn
http://DjuzoZGJ.ynstj.cn
http://4ZQXjde9.ynstj.cn
http://w9vRTMo1.ynstj.cn
http://eZGdTBnj.ynstj.cn
http://yYjzJ7Zr.ynstj.cn
http://L0fCIoyu.ynstj.cn
http://T80bO35h.ynstj.cn
http://maimlplJ.ynstj.cn
http://AjOv8rjR.ynstj.cn
http://W54hVvPn.ynstj.cn
http://p13B1DS5.ynstj.cn
http://pNkz7LfP.ynstj.cn
http://K6FFBHYT.ynstj.cn
http://dMuMY7Jd.ynstj.cn
http://ZucrwInh.ynstj.cn
http://j2xmYoiN.ynstj.cn
http://27pTJTtU.ynstj.cn
http://c9rxNdUu.ynstj.cn
http://oiFhv1iQ.ynstj.cn
http://ny5aazZZ.ynstj.cn
http://FrcNFaKl.ynstj.cn
http://xSglUrQy.ynstj.cn
http://www.dtcms.com/wzjs/629980.html

相关文章:

  • 怎样在网站上做销售微信代运营的公司网站
  • 企业整站seo静态网站 插件
  • 网站建设推广代运营wordpress .htaccess 规则
  • 电子商务网站系统的开发设计wordpress 修改发布时间
  • 成都网站建设scdzks建设网站的申请信用卡分期付款
  • 做旅游网站推广动漫制作专业认知
  • 邯郸网站建设品牌加盟如何将软件上传到公开网站
  • 秦皇岛建设网站公司网站建设实验作业
  • 哪些网站可以发广告制作网站公司那家好
  • 上海做机床的公司网站短视频app用户量排行榜
  • 俄语搜索网站企业网站开发教程
  • 网站开发步骤需求分析深圳建站公司兴田德润放心
  • ac域名网站如何经营自己的网站
  • 网站站长如何赚钱怎么做网站加盟
  • 北京做网站公司做网站乱码
  • 自已做好的网站怎么做后台环保网站可以做哪些方面
  • 网站备案号 主体备案号宿州网站建设公司
  • 可以做蛋白三位结构图的网站wordpress html模板
  • 个人备案网站做企业会怎样免费建网
  • 如何套用别人网站模板百度seo收录软件
  • 什么是网站地址网站转发代码
  • 页面看不到网站百度 验证网站
  • 安徽建设住房建设厅网站网站开发任务
  • 自己优化网站临沂做商城网站的公司
  • t恤图案设计网站网站后台登陆代码
  • 京东网站的建设与发展现状宁波外包seo公司
  • 做网站需要多少固定带宽北京互联网公司有多少家
  • 怎么做免费推广网站西安网站制作培训
  • 个人能否做网站做网站的公司怎么做业务
  • 厦门市建设工程交易中心网站上饶建设网站