【PyTorch教程】P1. PyTorch环境配置及安装

温馨提示:为了更好的教程体验,提供视频、阅读地址

Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBcK5PZ-V

BiliBili: https://www.bilibili.com/video/av74281036/

Github: https://github.com/xiaotudui/PyTorch-Tutorial

相关下载:https://pan.baidu.com/s/16koDDDvAFO7rNoi-uR-A_g 提取码:pahi

在学习中,遇到任何问题,可以关注公众号:土堆碎念,直接在对话框中留言,我会不定时解答的~

公众号:土堆碎念,回复:pytorch,即可获得所有的数据集及安装包, 省去找软件、数据集的时间。(同步更新中,请勿急躁)


0. 前言

在计算机领域学习,最烦的一件事,就是安装软件,环境配置。而且,恰恰不如意的是,它还是你学习进程的第一关。第一关就出现大Boss。这样,超级容易打击学习的动力。

所以,在我看来,入门的话,一定要快,要不求甚解,先把握整体。所以,我的教程安排顺序一些方法,不同于其他千篇一律的教程,其中也许有自己的想法。

如果你在学习中,有什么建议,或者遇到什么问题,可以关注公众号:土堆碎念,直接留言,私信我。

1. Anaconda 下载

在机器学习,深度学习中,要用到大量的 package(就是各种工具包)。如果说,函数是一个工具,那么 package 就是一个工具包。一个个安装 package 很麻烦,而且容易出现疏漏。于是,就有了 Anaconda,这是一个集成了常用于科学分析(机器学习,深度学习)的大量package。

也就是说,你只要安装了 Anaconda,就安装了很多我们之后要用的许多packages。(他还有很多功能,对入门帮助超大,后面再说)

Anaconda 的下载地址:这儿(目前,页面上是 Python3.7 的版本,我用的是3.6版本,推荐3.6版本

之前使用过3.7版本,也许会遇到一些问题。

推荐: Anaconda历史版本链接:这儿,选择这个版本: Anaconda 3-5.2.0

2. Anaconda 安装

双击进行安装,需要注意以下几点:

(1)记住安装路径,之后会用到

(2)跳过安装 Microsoft VSCode

为了检验是否安装成功,在开始菜单出,左击 Anaconda Prompt

如果可以成功打开,且左边有 (base),即安装成功。

3. 显卡配置(无 Nvidia 显卡的略过)

只要你打开任务管理器,在 GPU 那里看到了你的 NVIDIA 显卡,即可。说明你的硬件驱动,已安装。

如果你的 NVIDIA 显卡未显示,可以使用驱动人生,或者去官网下载驱动。

绝大多数的NVIDIA的显卡,都是支持深度学习的。你可以去 这里 查阅,如果这里面有你的显卡的话,那么说明你的显卡是支持深度学习的。

如果你的显卡支持深度学习,请在命令行处,输入 nvidia-smi ,查看自己驱动的版本。

!!!务必,保证自己的驱动版本数大于 396.26,像我这里的驱动版本数为430.86,满足要求。

如果发现自己的版本数不满足要求,可以使用 驱动管家 或 软件管家更新,当然最推荐的是 官网下载

在官网选择相应的选项后,红色框部分,默认即可。产品系列中的 Notebooks 指的笔记本。将下载后的驱动,正常安装即可。

4. 有序的管理环境

也许,你之后会遇到不同的项目,需要使用到不同版本的环境。比如这个项目要用到 pytorch 0.4,另一个项目要用到 pytorch 1.0,如果你卸载了0.4版本,安装了1.0版本。那么下一次,你再碰到0.4版本,你就需要卸载1.0版本,安装0.4版本。很折腾。

Anaconda 集成的 conda 包就能够解决这个问题。它可以创造出两个屋子,相互隔离。一个屋子放 0.4 版本,一个屋子放 1.0 版本。你需要哪个版本,就进哪个屋子工作。

我们首先使用 conda 指令创建一个屋子,叫做 pytorch。

指令如下:

conda create -n pytorch python=3.6

conda 是指调用 conda 包,create 是创建的意思,-n 是指后面的名字是屋子的名字, pytorch是屋子的名字(可以更改成自己喜欢的),python=3.6 是指创建的屋子,是 python3.6 版本。

之后,弹出提示,输入 y,即可安装。

安装成功后,输入以下指令:

conda info --envs

即可看到 conda 环境中,有新建的 pytorch 环境,右边的 * 号表示,当前你处于哪个环境。

接下来,我们要在 pytorch 环境中,安装 PyTorch,(有点绕),使用如下指令,进入 pytorch 环境。

conda activate pytorch

你可以看到左边的 base 变成了 pytorch,代表成功进入 pytorch 环境。

5. 安装 PyTorch 准备

终于到重头戏了,安装 PyTorch了。激动的打开官网,下拉到下面的页面。

(不得不说,PyTorch 在这方面做的真的好,不需要再人工安装 CUDA、cuDNN 之类的,全部都给你解决了。真的良心~以前安装真的繁琐。(吐槽一句,以前超麻烦的)

PyTorch Build 选择 Stable;选择系统;Package,Windows下推荐 conda,Linux 下推荐 pip;Python版本按照Anaconda的版本选择,我这里选择3.6,CUDA 推荐9.2。如果没有显卡的话,选择 None。我的选择如图所示:

复制下面的代码,之后,在开始菜单中,打开 Anaconda Prompt,查看最左边括号中是 base 还是 pytorch。

如果是 base,使用 conda activate pytorch 进入 pytorch 环境中。之后粘贴即可。

果断输入y,之后就是漫长的等待。或者去休息吧,慢慢等着。看看剧啥的,等着它慢慢下吧。如果你的并不慢,恭喜恭喜。

6. 加速(可选)

有的时候,下载速度太慢了,可以利用我已经下载好的文件。(白天的话,好像速度较好,推荐大家白天下载)

链接:https://pan.baidu.com/s/1cyEjHdluc4ufCkvtbgziqA 
提取码:bzfx 
复制这段内容后打开百度网盘手机App,操作更方便哦

将其中的 pytorch-1.3.0-py3.6_cuda92_cudnn7_0.tarcudatoolkit-9.2-0.tar两个文件,复制到刚才 Anaconda 安装的目录下的 pkgs 文件夹中。

这两个文件,只能安装 pytorch1.3.0 和 cuda 9.2,仅限Windows。

之后,在 Anaconda Prompt 命令行窗口,多按几次 Ctrl + C 结束程序。

之后,输入以下指令:conda install --use-local pytorch-1.3.0-py3.6_cuda92_cudnn7_0.tar.bz2conda install --use-local cudatoolkit-9.2-0.tar.bz2,即可使用下载的包进行安装。

然后,重新复制 PyTorch 安装命令,粘贴到命令行上,进行安装。

7. 验证是否安装成功

(1)在命令行左边为 pytorch 环境中,输入 python

(2)之后,输入 import torch,如果没有报错,意味着 PyTorch 已经顺利安装了

(3)接下来,输入 torch.cuda.is_available,如果是 True,意味着你可以使用 GPU,如果是 False,意味着只能使用CPU。

我的大本营

学会这三个排版原则,你就能超过80%人的排版

你想过将你的人生游戏化吗?

用游戏的思路激励自己

寻找有趣或更有效率的事、工具和教程

<think>嗯,用户之前让我介绍了语义分割,现在他们想了解如何开始用PyTorch实现U-Net。我需要一步步引导他们,从环境配置到数据准备,再到模型构建、训练和测试。可能用户是刚开始学习深度学习,所以需要详细但不过于复杂。 首先,我应该确认用户的环境是否已经安装PyTorch和相关库。如果没有,需要给出安装命令。然后,数据准备部分要说明数据集的结构,比如CamVid的例子,这样用户有具体参考。可能需要提醒他们下载数据集并组织目录结构。 接下来是数据预处理和数据加载器的构建。这里要解释transforms的作用,比如归一化和调整大小。可能需要提到自定义Dataset类,尤其是如何处理图像和对应的掩码。 模型构建部分,U-Net的结构比较复杂,用户可能需要详细的代码示例。要分块讲解,比如双卷积块、下采样、上采样和输出层。需要注意代码的注释清晰,变量名易懂,这样用户容易理解每个部分的功能。 训练循环部分,需要解释损失函数和优化器的选择,比如CrossEntropyLoss和Adam。还要提到训练循环的基本步骤,包括前向传播、损失计算、反向传播和优化。可能用户对GPU的使用不太熟悉,所以需要提醒如何将数据和模型移动到GPU上。 验证和测试部分,要说明如何计算mIoU,并给出示例代码。可视化结果也很重要,用户可能想看到实际分割效果,所以需要演示如何显示图像和掩码。 最后,优化建议部分可以提到数据增强、学习率调整和模型融合等进阶方法,帮助用户进一步提升模型性能。同时推荐扩展阅读,让他们有进一步学习的方向。 要确保整个流程逻辑清晰,步骤明确,代码可运行。避免使用过于专业的术语,保持口语化,让新手也能跟上。可能还需要检查代码是否有错误,比如是否正确处理了张量维度,是否正确实现了上采样和跳跃连接。此外,提醒用户注意数据路径是否正确,以及是否有足够的计算资源(如GPU)来训练模型。</think>以下是使用PyTorch实现U-Net进行语义分割的**分步指南**,包含可直接运行的代码示例: --- ### 一、环境准备 ```bash # 安装依赖 pip install torch torchvision matplotlib numpy opencv-python ``` --- ### 二、数据准备(以CamVid数据集为例) #### 1. 数据集结构 ``` CamVid/ ├── train/ │ ├── images/ # 原始图像 │ └── masks/ # 标注掩码(单通道,像素值为类别索引) ├── val/ └── test/ ``` #### 2. 自定义Dataset类 ```python import os from torch.utils.data import Dataset from PIL import Image import torchvision.transforms as T class CamVidDataset(Dataset): def __init__(self, root, split=&#39;train&#39;, size=(256,256)): self.images_dir = os.path.join(root, split, &#39;images&#39;) self.masks_dir = os.path.join(root, split, &#39;masks&#39;) self.filenames = [f.split(&#39;.&#39;)[0] for f in os.listdir(self.images_dir)] self.transforms = T.Compose([ T.Resize(size), T.ToTensor(), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) def __getitem__(self, idx): img_path = os.path.join(self.images_dir, self.filenames[idx]+&#39;.png&#39;) mask_path = os.path.join(self.masks_dir, self.filenames[idx]+&#39;_mask.png&#39;) image = Image.open(img_path).convert(&#39;RGB&#39;) mask = Image.open(mask_path) image = self.transforms(image) mask = T.Resize((256,256))(mask) # 保持与图像相同尺寸 mask = T.PILToTensor()(mask).squeeze().long() # [H,W] return image, mask def __len__(self): return len(self.filenames) ``` --- ### 三、构建U-Net模型 ```python import torch import torch.nn as nn class DoubleConv(nn.Module): """(卷积 => BN => ReLU) * 2""" def __init__(self, in_channels, out_channels): super().__init__() self.double_conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.double_conv(x) class UNet(nn.Module): def __init__(self, n_classes=32): super(UNet, self).__init__() # 下采样 self.down1 = DoubleConv(3, 64) self.down2 = DoubleConv(64, 128) self.down3 = DoubleConv(128, 256) self.down4 = DoubleConv(256, 512) self.pool = nn.MaxPool2d(2) # 底部 self.bottleneck = DoubleConv(512, 1024) # 上采样 self.up1 = nn.ConvTranspose2d(1024, 512, kernel_size=2, stride=2) self.up_conv1 = DoubleConv(1024, 512) self.up2 = nn.ConvTranspose2d(512, 256, kernel_size=2, stride=2) self.up_conv2 = DoubleConv(512, 256) self.up3 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2) self.up_conv3 = DoubleConv(256, 128) self.up4 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2) self.up_conv4 = DoubleConv(128, 64) # 输出层 self.out = nn.Conv2d(64, n_classes, kernel_size=1) def forward(self, x): # 编码器 c1 = self.down1(x) # [B,64,256,256] p1 = self.pool(c1) # [B,64,128,128] c2 = self.down2(p1) # [B,128,128,128] p2 = self.pool(c2) # [B,128,64,64] c3 = self.down3(p2) # [B,256,64,64] p3 = self.pool(c3) # [B,256,32,32] c4 = self.down4(p3) # [B,512,32,32] p4 = self.pool(c4) # [B,512,16,16] # 瓶颈层 bn = self.bottleneck(p4) # [B,1024,16,16] # 解码器 u1 = self.up1(bn) # [B,512,32,32] u1 = torch.cat([u1, c4], dim=1) # 跳跃连接 u1 = self.up_conv1(u1) # [B,512,32,32] u2 = self.up2(u1) # [B,256,64,64] u2 = torch.cat([u2, c3], dim=1) u2 = self.up_conv2(u2) # [B,256,64,64] u3 = self.up3(u2) # [B,128,128,128] u3 = torch.cat([u3, c2], dim=1) u3 = self.up_conv3(u3) # [B,128,128,128] u4 = self.up4(u3) # [B,64,256,256] u4 = torch.cat([u4, c1], dim=1) u4 = self.up_conv4(u4) # [B,64,256,256] return self.out(u4) # [B,n_classes,256,256] ``` --- ### 四、训练流程 ```python from torch.utils.data import DataLoader # 超参数设置 BATCH_SIZE = 8 EPOCHS = 50 LR = 0.001 DEVICE = torch.device(&#39;cuda&#39; if torch.cuda.is_available() else &#39;cpu&#39;) # 数据加载 train_set = CamVidDataset(&#39;CamVid&#39;, split=&#39;train&#39;) train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True) # 初始化模型 model = UNet(n_classes=32).to(DEVICE) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=LR) # 训练循环 for epoch in range(EPOCHS): model.train() running_loss = 0.0 for images, masks in train_loader: images = images.to(DEVICE) masks = masks.to(DEVICE) # 前向传播 outputs = model(images) loss = criterion(outputs, masks) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() running_loss += loss.item() print(f&#39;Epoch [{epoch+1}/{EPOCHS}] Loss: {running_loss/len(train_loader):.4f}&#39;) ``` --- ### 五、验证与测试 ```python # 计算mIoU def compute_miou(pred, target, n_classes): ious = [] pred = torch.argmax(pred, dim=1) for cls in range(n_classes): pred_inds = (pred == cls) target_inds = (target == cls) intersection = (pred_inds & target_inds).sum().float() union = (pred_inds | target_inds).sum().float() if union == 0: ious.append(float(&#39;nan&#39;)) else: ious.append((intersection / union).item()) return torch.tensor(ious).nanmean().item() # 可视化结果 import matplotlib.pyplot as plt def show_prediction(image, mask, pred): plt.figure(figsize=(12,4)) plt.subplot(1,3,1) plt.imshow(image.permute(1,2,0).cpu().numpy()) plt.title(&#39;Input Image&#39;) plt.subplot(1,3,2) plt.imshow(mask.cpu().numpy(), cmap=&#39;jet&#39;) plt.title(&#39;Ground Truth&#39;) plt.subplot(1,3,3) plt.imshow(torch.argmax(pred, dim=0).cpu().numpy(), cmap=&#39;jet&#39;) plt.title(&#39;Prediction&#39;) plt.show() ``` --- ### 六、优化建议 1. **数据增强**:添加随机翻转、旋转、颜色抖动 2. **学习率调度**:使用`ReduceLROnPlateau`自动调整学习率 3. **混合精度训练**:使用`torch.cuda.amp`加速训练 4. **模型融合**:集成多个U-Net模型的预测结果 --- ### 扩展学习 1. **改进架构**:尝试U-Net++、Attention U-Net等变体 2. **迁移学习**:使用预训练的ResNet作为编码器 3. **部署优化**:使用ONNX或TorchScript导出模型 完整代码需配合数据集使用,建议从Kaggle下载CamVid数据集进行实践。可以通过添加Dice Loss等改进损失函数,进一步提升分割效果。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值