今日目标
优化并理解项目目录结构。 在本地部署pytorch并使用mps。 运行quickstart的代码。 看完tutorials并理解代码。
已运行
cd repytorch
conda create -n repytorch python=3.12
conda activate repytorch
conda update -n base -c conda-forge conda
which python
python --version
python -m pip install torch==2.12.1 torchvision==0.27.1
python scripts/check_mps.py
python tutorials/official_basics/01_tensors/walkthrough.py
python tutorials/official_basics/00_quickstart/quickstart.py
实测结果
Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28])
Shape of y: torch.Size([64]) torch.int64
Using device: mps
NeuralNetwork(
(flatten): Flatten(start_dim=1, end_dim=-1)
(linear_relu_stack): Sequential(
(0): Linear(in_features=784, out_features=512, bias=True)
(1): ReLU()
(2): Linear(in_features=512, out_features=512, bias=True)
(3): ReLU()
(4): Linear(in_features=512, out_features=10, bias=True)
)
)
Epoch 1
-------------------------------
loss: 2.302204 [ 64/60000]
loss: 2.285267 [ 6464/60000]
loss: 2.267090 [12864/60000]
loss: 2.258653 [19264/60000]
loss: 2.252688 [25664/60000]
loss: 2.221283 [32064/60000]
loss: 2.229805 [38464/60000]
loss: 2.200109 [44864/60000]
loss: 2.192344 [51264/60000]
loss: 2.163999 [57664/60000]
Test Error:
Accuracy: 47.1%, Avg loss: 2.154489
Epoch 2
-------------------------------
loss: 2.166452 [ 64/60000]
loss: 2.152205 [ 6464/60000]
loss: 2.092613 [12864/60000]
loss: 2.109233 [19264/60000]
loss: 2.074476 [25664/60000]
loss: 2.007340 [32064/60000]
loss: 2.040023 [38464/60000]
loss: 1.962362 [44864/60000]
loss: 1.962743 [51264/60000]
loss: 1.895885 [57664/60000]
Test Error:
Accuracy: 57.3%, Avg loss: 1.886986
Epoch 3
-------------------------------
loss: 1.919514 [ 64/60000]
loss: 1.887475 [ 6464/60000]
loss: 1.766038 [12864/60000]
loss: 1.808597 [19264/60000]
loss: 1.711801 [25664/60000]
loss: 1.659078 [32064/60000]
loss: 1.686532 [38464/60000]
loss: 1.588109 [44864/60000]
loss: 1.610264 [51264/60000]
loss: 1.507222 [57664/60000]
Test Error:
Accuracy: 63.2%, Avg loss: 1.514880
Epoch 4
-------------------------------
loss: 1.580536 [ 64/60000]
loss: 1.545995 [ 6464/60000]
loss: 1.392159 [12864/60000]
loss: 1.462081 [19264/60000]
loss: 1.349674 [25664/60000]
loss: 1.347308 [32064/60000]
loss: 1.362663 [38464/60000]
loss: 1.290665 [44864/60000]
loss: 1.321513 [51264/60000]
loss: 1.223431 [57664/60000]
Test Error:
Accuracy: 64.7%, Avg loss: 1.241825
Epoch 5
-------------------------------
loss: 1.315513 [ 64/60000]
loss: 1.303404 [ 6464/60000]
loss: 1.132927 [12864/60000]
loss: 1.234672 [19264/60000]
loss: 1.116155 [25664/60000]
loss: 1.143451 [32064/60000]
loss: 1.163112 [38464/60000]
loss: 1.107189 [44864/60000]
loss: 1.139695 [51264/60000]
loss: 1.058778 [57664/60000]
Test Error:
Accuracy: 65.3%, Avg loss: 1.073788
Done!
Saved PyTorch Model State to (local path, I have hided it)
小记
01: 设备选择
import torch
def select_device() -> torch.device:
if torch.cuda.is_available():
return torch.device("cuda")
if torch.backends.mps.is_available():
return torch.device("mps")
return torch.device("cpu")
device = select_device()
print(f"Using device: {device}")
设备选择逻辑 NVIDIA CUDA → Apple MPS → CPU
02:基本顺序
数据处理(Download datasets; Create dataloaders;)
创建模型(Define model;)
优化模型参数(loss_fn; optimizer;)
保存模型()
03: Path基本用法
Path 是 Python 标准库 pathlib 中用于处理文件和文件夹路径的类。相比字符串拼接,它更直观,并且兼容 Windows、macOS 和 Linux。
from pathlib import Path
1. 创建路径
data_dir = Path("data")
file_path = Path("data/images/cat.jpg")
这里只是创建路径对象,不会真的创建文件或文件夹。
2. 拼接路径
使用 / 拼接路径:
data_dir = Path("data")
image_path = data_dir / "images" / "cat.jpg"
print(image_path)
# data/images/cat.jpg
这比 "data" + "/images/" + "cat.jpg" 更方便。
3. 判断路径是否存在
path = Path("data")
print(path.exists()) # 是否存在
print(path.is_file()) # 是否是文件
print(path.is_dir()) # 是否是文件夹
4. 创建文件夹
output_dir = Path("outputs/images")
output_dir.mkdir(parents=True, exist_ok=True)
parents=True:自动创建缺少的上级文件夹。exist_ok=True:文件夹已存在时不报错。
5. 获取路径的各个部分
path = Path("data/images/cat.jpg")
print(path.name) # cat.jpg
print(path.stem) # cat
print(path.suffix) # .jpg
print(path.parent) # data/images
6. 查找文件
查找当前文件夹中的所有 JPG 文件:
image_dir = Path("data/images")
for path in image_dir.glob("*.jpg"):
print(path)
递归查找所有子文件夹:
for path in image_dir.rglob("*.jpg"):
print(path)
7. 读取和写入文本
file_path = Path("note.txt")
file_path.write_text("Hello, PyTorch!", encoding="utf-8")
content = file_path.read_text(encoding="utf-8")
print(content)
在 PyTorch 项目中,经常这样组织路径:
project_dir = Path("my_project")
data_dir = project_dir / "data"
model_path = project_dir / "models" / "model.pth"
04: 包
Path → 管理数据文件路径 datasets → 创建或读取数据集 v2 → 预处理和增强图像 DataLoader → 分批加载数据 nn → 定义神经网络和损失函数 torch → 提供张量、自动求导和模型训练能力
产出文件
本地mac部署:local-mac.md
模型文件:model.pth(本地运行生成,未上传)
下一步
继续从01_tensors开始继续往后复现
Conversation
评论
欢迎交流这篇文章。评论公开保存在 GitHub Discussions,发表前需要登录 GitHub。