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

神经网络实战:ResNet 医学影像分类全流程解析

前言在医学影像领域处理高分辨率图像往往耗时耗力。本次项目采用 MedMNIST 风格的简化数据集即28×28像素的小尺寸医学图像重点完成医学影像的多分类任务并拆解深度学习中非常经典的网络结构——ResNet也就是深度残差网络。一、环境准备与数据加载医学数据集通常包含多种类别例如结肠癌切片、皮肤病变、肺部 X 光等。由于不同数据集的类别数、通道数和样本数量可能不同因此项目中通过一个 JSON 配置文件来统一管理数据集的基本信息。1.1 数据预处理代码在dataset.py中我们需要定义数据的读取方式以及标准化操作。import torch from torch.utils.data import Dataset from torchvision import transforms class MedicalDataset(Dataset): def __init__(self, data_array, labels, transformNone): self.data data_array self.labels labels self.transform transform def __getitem__(self, index): # 1. 提取图像和标签 img, target self.data[index], self.labels[index] # 2. 预处理ToTensor 转为 TensorNormalize 进行标准化 if self.transform is not None: img self.transform(img) return img, target def __len__(self): return len(self.data) # 定义预处理流程 data_transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize( mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5] ) ])这里需要注意如果当前数据集是三通道 RGB 图像可以使用mean[0.5, 0.5, 0.5] std[0.5, 0.5, 0.5]如果是单通道灰度图像则应改为mean[0.5] std[0.5]二、核心原理残差块 BasicBlockResNet 的核心思想是解决深层网络的退化问题。普通网络层数不断加深后训练效果不一定变好甚至可能变差。ResNet 通过 Shortcut Connection也就是短路连接让输入信息可以直接传到后面从而缓解这个问题。简单来说残差结构可以表示为out F(x) x其中F(x)表示卷积层学习到的特征x表示原始输入。这样一来如果新增层学得好就能提升效果如果新增层学得不好shortcut 也能保留原始信息避免模型效果明显下降。2.1 BasicBlock 代码实现下面是 ResNet 的最小构建单元 BasicBlock。import torch.nn as nn class BasicBlock(nn.Module): def __init__(self, in_channels, out_channels, stride1): super(BasicBlock, self).__init__() # 第一层卷积负责特征提取或降采样 self.conv1 nn.Conv2d( in_channels, out_channels, kernel_size3, stridestride, padding1, biasFalse ) self.bn1 nn.BatchNorm2d(out_channels) self.relu nn.ReLU(inplaceTrue) # 第二层卷积 self.conv2 nn.Conv2d( out_channels, out_channels, kernel_size3, stride1, padding1, biasFalse ) self.bn2 nn.BatchNorm2d(out_channels) # Shortcut 路径 self.shortcut nn.Sequential() # 如果维度不匹配需要用 1×1 卷积调整 if stride ! 1 or in_channels ! out_channels: self.shortcut nn.Sequential( nn.Conv2d( in_channels, out_channels, kernel_size1, stridestride, biasFalse ), nn.BatchNorm2d(out_channels) ) def forward(self, x): identity x out self.conv1(x) out self.bn1(out) out self.relu(out) out self.conv2(out) out self.bn2(out) # 核心步骤主分支输出与 shortcut 分支相加 out self.shortcut(identity) out self.relu(out) return out这里最关键的是 shortcut 路径。如果输入和输出维度一致shortcut 不需要做任何操作直接相加即可如果输入和输出维度不一致例如通道数变化或特征图尺寸变化就需要使用1×1卷积进行调整。可以简单理解为shape 一样直接相加shape 不一样先用1×1卷积调整后再相加。三、搭建 ResNet 网络架构通过_make_layer函数我们可以像搭积木一样重复使用 BasicBlock从而搭建完整的 ResNet 网络。3.1 完整网络代码class ResNet(nn.Module): def __init__(self, block, num_blocks, num_classes9, input_channels3): super(ResNet, self).__init__() self.in_channels 64 # 第一步初始卷积层 self.conv1 nn.Conv2d( input_channels, 64, kernel_size3, stride1, padding1, biasFalse ) self.bn1 nn.BatchNorm2d(64) self.relu nn.ReLU(inplaceTrue) # 第二步堆叠 4 个 layer self.layer1 self._make_layer(block, 64, num_blocks[0], stride1) self.layer2 self._make_layer(block, 128, num_blocks[1], stride2) self.layer3 self._make_layer(block, 256, num_blocks[2], stride2) self.layer4 self._make_layer(block, 512, num_blocks[3], stride2) # 第三步平均池化 全连接分类 self.avgpool nn.AdaptiveAvgPool2d((1, 1)) self.fc nn.Linear(512, num_classes) def _make_layer(self, block, out_channels, num_blocks, stride): # 第一个 block 可能需要降采样其余 block 保持 stride1 strides [stride] [1] * (num_blocks - 1) layers [] for s in strides: layers.append(block(self.in_channels, out_channels, s)) self.in_channels out_channels return nn.Sequential(*layers) def forward(self, x): # 初始输入[Batch, 3, 28, 28] out self.relu(self.bn1(self.conv1(x))) out self.layer1(out) # [Batch, 64, 28, 28] out self.layer2(out) # [Batch, 128, 14, 14] out self.layer3(out) # [Batch, 256, 7, 7] out self.layer4(out) # [Batch, 512, 4, 4] out self.avgpool(out) # [Batch, 512, 1, 1] out out.view(out.size(0), -1) # [Batch, 512] out self.fc(out) # [Batch, num_classes] return out def resnet18(num_classes, input_channels): return ResNet(BasicBlock, [2, 2, 2, 2], num_classes, input_channels)这里的[2, 2, 2, 2]表示 ResNet-18 中四个 layer 分别包含 2 个 BasicBlock。整体 shape 变化可以理解为[Batch, 3, 28, 28] → [Batch, 64, 28, 28] → [Batch, 128, 14, 14] → [Batch, 256, 7, 7] → [Batch, 512, 4, 4] → [Batch, 512] → [Batch, num_classes]随着网络逐渐加深特征图的通道数不断增加高和宽逐渐减小模型提取到的特征也越来越抽象。四、训练与评估最后将数据喂入模型完成前向传播、损失计算和反向传播。4.1 训练循环代码# 初始化模型、优化器和损失函数 model resnet18(num_classes9, input_channels3).to(device) optimizer torch.optim.Adam(model.parameters(), lr0.001) criterion nn.CrossEntropyLoss() def train(model, train_loader, optimizer, criterion, epoch): model.train() for batch_idx, (inputs, targets) in enumerate(train_loader): inputs, targets inputs.to(device), targets.to(device).long() # 1. 梯度清零 optimizer.zero_grad() # 2. 前向传播 outputs model(inputs) # 3. 计算损失 loss criterion(outputs, targets) # 4. 反向传播 loss.backward() # 5. 更新参数 optimizer.step() if batch_idx % 10 0: print( fEpoch: {epoch} | fBatch: {batch_idx} | fLoss: {loss.item():.4f} ) # 训练启动 for epoch in range(1, 101): train(model, train_loader, optimizer, criterion, epoch)训练流程可以概括为读取 batch 数据 → 输入模型 → 得到预测结果 → 计算交叉熵损失 → 反向传播 → 更新参数验证阶段和训练阶段类似但不需要反向传播和参数更新只需要计算 loss、accuracy、AUC 等指标。五、文章总结本项目基于简化版医学影像数据集完成了一个 ResNet-18 图像分类流程。通过将医学图像统一处理为28×28可以降低训练成本方便快速跑通整个深度学习实验。ResNet 的核心在于残差连接。它通过 shortcut 保留原始输入信息从而缓解深层网络退化问题。尤其是在 layer 切换时如果输入输出维度不一致代码中会通过stride2进行下采样同时利用1×1卷积在 shortcut 路径上调整通道数和特征图尺寸保证两条分支可以正常相加。在实际调试时建议在forward()中打印每一层的out.shape观察张量从[Batch, 3, 28, 28]逐步变为[Batch, 512]特征向量再变为[Batch, num_classes]分类结果的过程。通过以上流程我们完成了从医学图像输入、ResNet 特征提取到最终分类输出的完整实战项目。这个项目的重点不在于追求最高准确率而在于理解 ResNet 的网络结构、shortcut 的作用以及深度学习分类任务的完整训练流程。

相关文章:

神经网络实战:ResNet 医学影像分类全流程解析

前言在医学影像领域,处理高分辨率图像往往耗时耗力。本次项目采用 MedMNIST 风格的简化数据集,即 2828 像素的小尺寸医学图像,重点完成医学影像的多分类任务,并拆解深度学习中非常经典的网络结构——ResNet,也就是深度…...

ros2 humble gazebo+rviz+maprviz

Use GPU to accelerate 先确认 NVIDIA 驱动已安装且正常 nvidia-smi 检查当前渲染显卡(关键): sudo apt install -y mesa-utils glxinfo -B | grep -i “opengl renderer” 强制 Gazebo 使用 NVIDIA GPU(双显卡笔记本必做&#xf…...

ThinkPad风扇控制技术深度解析:TPFanCtrl2开源工具完全指南

ThinkPad风扇控制技术深度解析:TPFanCtrl2开源工具完全指南 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是一款专为ThinkPad笔记本电脑设计的…...

通过环境变量统一管理多项目下的 Taotoken API 密钥

通过环境变量统一管理多项目下的 Taotoken API 密钥 1. 环境变量管理的必要性 在同时开发多个项目的场景中,直接硬编码 API Key 会带来密钥泄露和版本管理混乱的风险。环境变量允许开发者将敏感信息与代码分离,通过操作系统或容器运行时动态注入配置。…...

【flutter for open harmony】第三方库Flutter 鸿蒙版 颜色提取器 实战指南(适配 1.0.0)✨

【flutter for open harmony】第三方库Flutter 鸿蒙版 颜色提取器 实战指南(适配 1.0.0)✨ Flutter 三方库 cached_network_image 的鸿蒙化适配与实战指南 欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net 本文详细…...

如何在Keil5环境中配置Taotoken的OpenAI兼容API调用

如何在Keil5环境中配置Taotoken的OpenAI兼容API调用 1. 准备工作 在Keil5中集成Taotoken的OpenAI兼容API前,需要确保开发环境具备网络通信能力。对于大多数嵌入式项目,建议使用轻量级HTTP客户端库,如cURL的嵌入式版本或lwIP等协议栈。若项目…...

使用 Taotoken 后 API 延迟与稳定性在实际项目中的体感观察

使用 Taotoken 后 API 延迟与稳定性在实际项目中的体感观察 1. 项目背景与接入动机 我们的开发团队在过去六个月中,将多个内部工具与自动化流程迁移到了 Taotoken 平台。这些工具日均发起约 3000-5000 次 API 调用,主要用于文档摘要生成、代码辅助审查…...

HDINO:开集目标检测的两阶段训练策略解析

1. 项目背景与核心价值在计算机视觉领域,开集目标检测一直是极具挑战性的研究方向。传统目标检测器通常在闭集场景下表现良好,但在面对真实世界中层出不穷的新类别时,性能往往会大幅下降。HDINO项目正是针对这一痛点提出的创新解决方案。我曾…...

5分钟掌握GlosSI:解锁Steam控制器的终极系统级解决方案

5分钟掌握GlosSI:解锁Steam控制器的终极系统级解决方案 【免费下载链接】GlosSI Tool for using Steam-Input controller rebinding at a system level alongside a global overlay 项目地址: https://gitcode.com/gh_mirrors/gl/GlosSI 你是否曾遇到过这样的…...

SharpKeys终极指南:5分钟掌握Windows键盘重映射的免费神器

SharpKeys终极指南:5分钟掌握Windows键盘重映射的免费神器 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys …...

强化学习在癌症早期筛查中的创新应用与优化

1. 项目背景与核心价值 癌症早期筛查一直是医疗领域的重大挑战。传统筛查方法往往存在成本高、覆盖面窄、假阳性率高等问题。GF-Screen这个框架的提出,本质上是要用强化学习技术重构癌症筛查的决策流程。 我在医疗AI领域做过多个肿瘤筛查项目,最深切的体…...

3分钟搞定微博备份:Speechless终极免费PDF导出工具完全指南

3分钟搞定微博备份:Speechless终极免费PDF导出工具完全指南 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在数字时代,微博承…...

你的电脑风扇还在“过山车“吗?FanControl三大核心功能彻底告别噪音烦恼

你的电脑风扇还在"过山车"吗?FanControl三大核心功能彻底告别噪音烦恼 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitco…...

AI智能体技能蒸馏:从大模型到可部署自动化模块的工程实践

1. 项目概述:从“黑盒”到“白盒”的智能体技能蒸馏最近在折腾AI智能体(AI Agent)的自动化技能构建,发现了一个挺有意思的项目:genpark-visual-designer。这玩意儿本质上是一个“视觉设计师”智能体技能,但…...

llama-cpp-python:企业级本地大语言模型部署的Python高性能绑定解决方案

llama-cpp-python:企业级本地大语言模型部署的Python高性能绑定解决方案 【免费下载链接】llama-cpp-python Python bindings for llama.cpp 项目地址: https://gitcode.com/gh_mirrors/ll/llama-cpp-python 在当今AI应用快速发展的时代,如何高效…...

Kilo:基于WireGuard的轻量级跨云Kubernetes网络覆盖方案

1. 项目概述与核心价值最近在梳理一些轻量级、高性能的网络工具时,又翻出了Kilo-Org/kilo这个项目。它不是一个新面孔,但在追求极致简洁和跨平台组网的场景下,依然是我工具箱里的常备选项。简单来说,Kilo 是一个用 Go 语言编写的、…...

Visual C++运行库全家桶:一劳永逸解决Windows软件兼容性问题

Visual C运行库全家桶:一劳永逸解决Windows软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法启动"、&qu…...

企业级应用如何利用Taotoken统一管理多个AI模型调用

企业级应用如何利用Taotoken统一管理多个AI模型调用 1. 多模型统一接入的工程挑战 企业级AI应用常面临模型来源分散的痛点。不同业务线可能同时需要对话、代码生成、文本摘要等能力,而单一厂商的模型往往难以满足所有场景。传统方案要求技术团队为每个供应商单独维…...

2026年4月:AI史上最疯狂的30天——从GPT-6到DeepSeek V4,大模型竞争进入“干活“时代

4月AI圈连发9款旗舰模型:GPT-6参数破5万亿,DeekSeek V4成本仅GPT的1/700 摘要: 2026年4月的大模型发布密度创历史之最。OpenAI连发GPT-6和GPT-5.5,Anthropic祭出Claude Opus 4.7,但最大的变数来自中国——DeepSeek V4以…...

AutoResearch:基于LLM的自动化研究流水线架构与实战指南

1. 项目概述:当AI成为你的全职研究助理如果你是一名研究生、分析师,或者任何需要深度挖掘信息、撰写综述报告的人,那么你肯定对“信息过载”和“时间黑洞”这两个词深有体会。面对一个全新的课题,光是“开题”阶段就足以让人脱一层…...

告别AssetStudio!用AssetRipper搞定Unity 2022.3的AssetBundle拆解(附详细步骤)

从AssetStudio迁移到AssetRipper:Unity 2022.3资源拆解全指南 当Unity 2022.3 LTS版本成为项目升级的主流选择时,许多开发者突然发现,曾经信赖的AssetStudio工具链已经无法处理新版引擎生成的AssetBundle文件。这种技术断层不仅影响了资源检查…...

手把手移植:将PC端的C语言随机数生成代码无缝迁移到STM32F103(含USB打印调试)

从PC到嵌入式:STM32F103伪随机数生成实战指南 当开发者从PC环境转向嵌入式系统时,最常遇到的挑战之一就是如何将熟悉的代码逻辑适配到资源受限的硬件平台。随机数生成就是一个典型案例——在PC上我们习惯使用stdlib.h的rand()和srand(),但在S…...

小微团队如何利用 Taotoken 统一管理多个 AI 项目成本

小微团队如何利用 Taotoken 统一管理多个 AI 项目成本 1. 多项目场景下的成本管理挑战 小微团队在同时推进多个 AI 项目时,往往会遇到模型调用成本分散的问题。每个项目可能使用不同的大模型服务,导致账单分散在各处,难以进行整体成本核算。…...

RedBench:大语言模型安全评估新标准

1. RedBench:大语言模型安全评估的新标杆在医疗诊断、法律咨询等安全关键领域,大语言模型(LLMs)的应用正迅速扩展。但一个令人不安的事实是:最新研究表明,即使最先进的模型在面对精心设计的对抗性提示时&am…...

Horizon-LM:单GPU训练大模型的内存优化架构

1. Horizon-LM 架构概述 Horizon-LM 是一种突破性的训练架构设计,它让大模型训练在单块消费级GPU上成为可能。这个架构的核心创新点在于巧妙利用主机内存(RAM)作为显存的扩展存储空间,通过精细的内存调度算法实现训练过程中张量的…...

专业激活解决方案:KMS_VL_ALL_AIO的完整使用指南与最佳实践

专业激活解决方案:KMS_VL_ALL_AIO的完整使用指南与最佳实践 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在Windows和Office软件管理领域,激活问题一直是技术管理员和高…...

别再手动算系数了!用MATLAB Filter Designer一键生成Xilinx FPGA的.coe文件(附定点数设置避坑指南)

别再手动算系数了!用MATLAB Filter Designer一键生成Xilinx FPGA的.coe文件(附定点数设置避坑指南) 数字信号处理工程师们,是否还在为FPGA滤波器设计中的系数转换而头疼?手动计算不仅耗时费力,还容易引入难…...

通过 curl 命令快速测试 Taotoken 大模型 API 连通性与返回

通过 curl 命令快速测试 Taotoken 大模型 API 连通性与返回 1. 准备工作 在开始测试之前,请确保您已经拥有有效的 Taotoken API Key。登录 Taotoken 控制台,在「API 密钥」页面可以创建和管理您的密钥。同时建议在「模型广场」查看当前支持的模型列表&…...

KV缓存技术原理与工程优化实践

1. KV缓存技术原理与工程价值KV缓存(Key-Value Cache)是Transformer架构中提升推理效率的核心机制。其本质是通过缓存历史时间步的键(Key)和值(Value)矩阵计算结果,避免在生成每个新token时重复…...

LongCodeZip:大语言模型代码压缩技术解析

1. 项目背景与核心价值在代码生成和补全领域,大语言模型(LLM)正面临一个关键瓶颈:随着代码库规模扩大,模型处理长上下文的能力成为制约开发效率的致命短板。传统方法要么截断输入导致关键信息丢失,要么因超…...