cnn训练并用grad-cam可视化

article/2025/6/25 14:17:50

 使用大米图片训练集,包含五个文件,分别是5种品牌的大米,使用cnn进行分类训练。

  • -Arborio/ :代表 Arborio 品种的大米图像数据,根据 Rice_Citation_Request.txt 文件可知,该数据集中包含 Arborio 品种的大米图像。
  •  Basmati/ :代表 Basmati 品种的大米图像数据,同样是数据集中 Basmati 品种大米的图像集合。
  •  Ipsala/ :代表 Ipsala 品种的大米图像数据,该文件夹下存储了大量 Ipsala 品种大米的图像文件。
  •  Jasmine/ :代表 Jasmine 品种的大米图像数据,是 Jasmine 品种大米的图像数据集。
  •  Karacadag/ :代表 Karacadag 品种的大米图像数据,包含该品种大米的相关图像。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import torch.nn.functional as F
from torchvision.models import resnet18
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt# 数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 加载数据集
data_dir = 'e:/2025_python/Rice_Image_Dataset'
train_dataset = datasets.ImageFolder(root=data_dir, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 定义 CNN 模型
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(32 * 56 * 56, 128)self.fc2 = nn.Linear(128, len(train_dataset.classes))def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 32 * 56 * 56)x = F.relu(self.fc1(x))x = self.fc2(x)return x# 初始化模型、损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
for epoch in range(num_epochs):running_loss = 0.0for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_loader)}')# Grad - CAM 实现
def grad_cam(model, img, target_layer):model.eval()img = img.unsqueeze(0)img.requires_grad_()feature_maps = []gradients = []def forward_hook(module, input, output):feature_maps.append(output)def backward_hook(module, grad_input, grad_output):gradients.append(grad_output[0])hook = target_layer.register_forward_hook(forward_hook)hook_backward = target_layer.register_backward_hook(backward_hook)output = model(img)pred = torch.argmax(output, dim=1)output[0, pred].backward()hook.remove()hook_backward.remove()feature_map = feature_maps[0][0]gradient = gradients[0][0]weights = torch.mean(gradient, dim=(1, 2))cam = torch.zeros(feature_map.shape[1:], dtype=torch.float32)for i, w in enumerate(weights):cam += w * feature_map[i, :, :]cam = torch.relu(cam)cam = cam.detach().numpy()cam = cv2.resize(cam, (img.shape[3], img.shape[2]))cam = (cam - np.min(cam)) / (np.max(cam) - np.min(cam))return cam# 选择一张图片进行 Grad - CAM 可视化
sample_img, _ = train_dataset[0]
cam = grad_cam(model, sample_img, model.conv2)# 可视化结果
img_np = sample_img.permute(1, 2, 0).numpy()
img_np = (img_np - np.min(img_np)) / (np.max(img_np) - np.min(img_np))
cam = np.uint8(255 * cam)
heatmap = cv2.applyColorMap(cam, cv2.COLORMAP_JET)
superimposed_img = cv2.addWeighted(np.uint8(255 * img_np), 0.6, heatmap, 0.4, 0)plt.imshow(cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

@浙大疏锦行


http://www.hkcw.cn/article/PmpdDYeIsi.shtml

相关文章

放弃 tsc+nodemon 使用 tsx 构建Node 环境下 TypeScript + ESM 开发环境搭建指南

放弃 tscnodemon 使用 tsx 构建Node 环境下 TypeScript ESM 开发环境搭建指南 目标 在 node 环境下构建 typescript esmodule模块 开发环境,这样可以使用 typescript 提供的类型安全和类型提示便利性。 我们要实现下面的效果 文件目录 src/index.ts 注意是 esmod…

Geogebra中导出3D Graphics窗口

导出没有特别的自定义设置,默认的第一个窗口是Graphics, 还有Graphics 2和3D Graphics ,优先顺序依次递减。如果要想导出的是3D Graphics, 需要确保关闭另外两个窗口。 这个是视频转换: 下面是直接导出: 带渲染效果的,其实是Al…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目:1731. 每位经理的下属员工数量 题解: select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…

韩国大选三强对决 李在明领跑 民众意愿强烈

韩国第21届总统选举于6月3日举行,预计4日凌晨揭晓结果。当选总统将立即就职,任期5年。当地时间2025年5月30日,韩国京畿道果川市中央选举管理委员会选举综合情况室的工作人员正在检查境内提前投票箱的存放地点监控视频。从去年12月3日的风波到今年4月4日前总统尹锡悦被罢免,…

48岁网红“大刚”疑酒精中毒离世 民间艺人突陨落

6月1日,短视频账号“大刚演艺传媒”发布讣告,宣布景旭刚因病于当天上午不幸离世,享年48岁。定于6月4日出殡。许多网友在评论区对景旭刚的离世表达了哀思,并称赞他多才多艺。次日,景旭刚的妻子确认了这一消息,称丈夫因饮酒过量导致酒精中毒去世。景旭刚的儿子也在朋友圈发…

泽连斯基:蛛网行动准备超过一年半 精心策划载入史册

乌克兰在与俄罗斯举行第二轮谈判前夕,发动了“蛛网”行动,袭击了俄罗斯多地。据报道,行动中的无人机通过货柜车偷运进入俄方领土。乌克兰总统泽连斯基表示,这次行动经过了一年半以上的准备,并且精心策划。他称赞此次行动堪称精彩,认为乌军的行动无疑将载入史册。乌克兰安…

女子被逼复婚又屡遭家暴,7岁儿子哭求爸爸别打了!

女子被逼复婚又屡遭家暴。重庆市的谭女士在自家水果店中,公然遭受了丈夫的家庭暴力,导致身上多处受伤。谭女士表示,她一定要站出来,用实际行动,坚决向家庭暴力说“不”!重庆的谭女士告诉记者她又被丈夫家暴打成闭合型颅脑损伤,他打她的原因让人不可思议,竟是因为她带孩…

【深度学习】实验四 卷积神经网络CNN

实验四 卷积神经网络CNN 一、实验学时: 2学时 二、实验目的 掌握卷积神经网络CNN的基本结构;掌握数据预处理、模型构建、训练与调参;探索CNN在MNIST数据集中的性能表现; 三、实验内容 实现深度神经网络CNN。 四、主要实验步…

通俗理解“高内聚,低耦合”

在软件开发中,良好的架构设计能够大幅降低系统的复杂度,提高代码的可维护性。而“高内聚,低耦合”正是指导我们如何合理组织代码的核心原则之一。本文将从通俗的角度解释这一概念,并结合实际案例说明其重要性。 一,高…

Unity + HybirdCLR热更新 入门篇

官方文档 HybridCLR | HybridCLRhttps://hybridclr.doc.code-philosophy.com/docs/intro 什么是HybirdCLR? HybridCLR(原名 huatuo)是一个专为 Unity 项目设计的C#热更新解决方案,它通过扩展 IL2CPP 运行时,使其支持动态加载和…

Python基础:人生重开模拟器(小游戏)

引言 手把手带你速通Python 实现人生重开模拟器(小游戏)的意义:增强对条件语句,循环语句的运用,增加写代码的乐趣。 一、 游戏介绍 网页版的人生重开模拟器: 人生重开模拟器-重来-重启 (aizhancloud.cn) …

【Elasticsearch】ILM(Index Lifecycle Management)策略详解

ILM(Index Lifecycle Management)策略详解 1.什么是 ILM 策略?2.ILM 解决的核心业务问题3.ILM 生命周期阶段3.1 Hot(热阶段)3.2 Warm(温阶段)3.3 Cold(冷阶段)3.4 Delete…

【存储基础】数据存储基础知识

文章目录 1. 概述:数据存储基础知识2. 存储物理介质3. 数据存储的分类3.1按存储架构分类DAS 直连存储SAN 存储区域网络NAS 网络附加存储分布式存储四种架构之间的核心区别 3.2 按数据模型分类块存储文件存储对象存储 4. 数据存储的关键技术方案和核心机制冗余与容错…

【Part 3 Unity VR眼镜端播放器开发与优化】第二节|VR眼镜端的开发适配与交互设计

文章目录 《VR 360全景视频开发》专栏Part 3|Unity VR眼镜端播放器开发与优化第一节|基于Unity的360全景视频播放实现方案第二节|VR眼镜端的开发适配与交互设计一、Unity XR开发环境与设备适配1.1 启用XR Plugin Management1.2 配置OpenXR与平…

小米YU7还有5款颜色即将发布 更多色彩敬请期待

6月1日,小米在5月22日的发布会上公布了YU7的四款颜色:钛金属色、宝石绿、熔岩橙和寒武岩灰。官方透露,除了这四款已发布的颜色外,还有五款新颜色即将推出,每一种都设计得非常经典。回顾之前的小米SU7,在刚推出时就提供了9种颜色选择,涵盖了跑车色系、时尚色系、豪华色系…

老人被甩客执法人员送其回家 温情护送获赠枇杷

日前,重庆交通执法总队轨道交通支队三大队在重庆西站巡查时发现一名老人误乘“黑车”。考虑到她年近九旬行动不便,执法人员开车将其安全护送回家。老人感激地拿出自己种的枇杷送给执法人员以示感谢。5月27日上午,执法人员在巡查过程中发现一辆渝A籍车辆正在下客,随即上前检…

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全 本文面向对 macOS 环境和终端操作尚不熟悉的“小白”用户。我们将从最基础的概念讲起,结合实际操作步骤,帮助你在 2025 年最新 MacBook Pro(搭载苹果 M 系列芯片)的环境…

女子多次上门骚扰邻居 持刀砍门引发恐慌

近日,辽宁大连有网友发布视频称,疑似患有精神疾病的邻居多次持刀上门砍其家门。当事人刘女士向媒体透露,楼下60多岁的邻居自去年10月搬家入住后,就反复上门找事,声称刘女士一家是脑控组织,想要入侵她的大脑。刘女士表示自己是外地人,去年刚搬进来,为方便孩子上学才购买…

遥控器竟牵出10亿元大案 数据篡改揭秘

涉及河南、四川、浙江等16省市,涉案交易金额达10.3亿元的合同诈骗案成功告破。内蒙古自治区鄂尔多斯市杭锦旗警方通过流量计调节流量和篡改数据的方式,将27名犯罪嫌疑人全部抓获。2024年3月,一封匿名举报信揭露了某石油工程有限公司通过更改流量计数据窃取国家能源的行为。杭…

弗朗西斯卡说樊振东加盟像做梦一样 莫大荣耀与期待

6月2日,据外媒报道,队长弗朗西斯卡在接受采访时谈到夺冠以及樊振东加盟表示:“感觉像做梦一样,樊振东加盟是我们莫大的荣耀。”决赛周末俱乐部宣布了轰动消息,奥运冠军兼前世界冠军樊振东将代表球队出战全部三项赛事。对于下赛季谁能击败他们的问题,弗朗西斯卡表示这取决…