Lecture 03准备:本实验的固定材料 · 实现代码
准备:本实验的固定材料 · 实现代码
按问题继续
同源参数的冻结/局部/全量/scratch与BN模式辨析
展开完整实现代码
# 当前项目中的独立材料:已存在则复用,缺失才从本讲原站准备。
from pathlib import Path
import io, zipfile, urllib.request
_base = Path.cwd()
_folder = 'lab09-transfer'
_sentinel = 'data/train-images-idx3-ubyte.gz'
_choices = [_base/_folder, _base/'lecture03-labs'/_folder, _base]
_ready = next((p for p in _choices if (p/_sentinel).is_file()), None)
if _ready is None:
_url = 'https://codingai-lec03.pages.dev/course/materials/' + _folder + '.zip'
_payload = urllib.request.urlopen(_url, timeout=60).read()
with zipfile.ZipFile(io.BytesIO(_payload)) as _archive:
_names = [i.filename for i in _archive.infolist() if not i.is_dir()]
_prefix = _folder + '/'
_prefixed = all(n.startswith(_prefix) for n in _names)
_destination = _base if _prefixed else _base/_folder
for _item in _archive.infolist():
_target = (_destination/_item.filename).resolve()
if not _target.is_relative_to(_destination.resolve()):
raise ValueError('材料包中有越界路径,停止解压。')
if _item.is_dir():
_target.mkdir(parents=True, exist_ok=True)
elif not _target.exists():
_target.parent.mkdir(parents=True, exist_ok=True)
_target.write_bytes(_archive.read(_item))
_ready = next((p for p in _choices if (p/_sentinel).is_file()), None)
assert _ready is not None, '请将本讲完整材料包解压到当前项目的 ' + _folder + '/;保留文件结构。'
LAB_ROOT = _ready
print('材料目录已就绪:', LAB_ROOT)
import copy, gzip, hashlib, io, json, os, time
from pathlib import Path
from collections import OrderedDict
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import torch
from torch import nn
from torch.nn import functional as F
torch.set_num_threads(2)
torch.manual_seed(20260917)
ROOT=LAB_ROOT
if not (ROOT/'data').is_dir() and (ROOT/'lab09-transfer/data').is_dir():ROOT=ROOT/'lab09-transfer'
assert (ROOT/'data').is_dir(), '请解压独立 lab09-transfer 包并保留目录结构。'
OUT=ROOT/'runs/current';OUT.mkdir(parents=True,exist_ok=True)