fastai11-Midlevel Data

fastai可以做到5行代码训练一个模型, 这也正是它吸引我的地方

from fastai.text.all import *

dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')

path = untar_data(URLs.IMDB)
dls = DataBlock(
    blocks=(TextBlock.from_folder(path),CategoryBlock),
    get_y = parent_label,
    get_items=partial(get_text_files, folders=['train', 'test']),
    splitter=GrandparentSplitter(valid_name='test')
).dataloaders(path)

但是它有时不够灵活, 这是就需要用到中级API

在看这个之前做了一个小项目, 已经用过中级api来处理音频-->图像, 真的很方便. 这种设计符合常理, 看代码示例就行

编写自己的Transform

class NormalizeMean(Transform):
    def setups(self, items): self.mean = sum(items)/len(items)
    def encodes(self, x): return x-self.mean
    def decodes(self, x): return x+self.mean

tfm = NormalizeMean()
tfm.setup([1,2,3,4,5])
start = 2
y = tfm(start)
z = tfm.decode(y)
tfm.mean,y,z

output: (3.0, -1.0, 2.0)

Pipeline | 管道

用于将多个转换组合在一起

# 分词再编码(数值化)
tfms = Pipeline([tok, num])
t = tfms(txts[0]); t[:20]

tensor([ 2, 8, 76, 10, 23, 3112, 23, 34, 3113, ...])

TfmdLists

TfmdLists可以一次性执行所有的预处理操作, 将原始项目转换为具有输入和目标的元组.

cut = int(len(files)*0.8)
splits = [list(range(cut)), list(range(cut,len(files)))]
tls = TfmdLists(files, [Tokenizer.from_folder(path), Numericalize], 
                splits=splits)

结论

下面的实现和文章开头的实现一致

tfms = [[Tokenizer.from_folder(path), Numericalize], [parent_label, Categorize]]
files = get_text_files(path, folders = ['train', 'test'])
splits = GrandparentSplitter(valid_name='test')(files)
dsets = Datasets(files, tfms, splits=splits)
dls = dsets.dataloaders(dl_type=SortedDL, before_batch=pad_input)

一个计算机视觉的小例子

def label_func(fname):
    return re.match(r'^(.*)_\d+.jpg$', fname.name).groups()[0]

class SiameseTransform(Transform):
    def __init__(self, files, label_func, splits):
        self.labels = files.map(label_func).unique()
        self.lbl2files = {l: L(f for f in files if label_func(f) == l) 
                          for l in self.labels}
        self.label_func = label_func
        self.valid = {f: self._draw(f) for f in files[splits[1]]}
        
    def encodes(self, f):
        f2,t = self.valid.get(f, self._draw(f))
        img1,img2 = PILImage.create(f),PILImage.create(f2)
        return SiameseImage(img1, img2, t)
    
    def _draw(self, f):
        same = random.random() < 0.5
        cls = self.label_func(f)
        if not same: 
            cls = random.choice(L(l for l in self.labels if l != cls))
        return random.choice(self.lbl2files[cls]),same

splits = RandomSplitter()(files)
tfm = SiameseTransform(files, label_func, splits)
tls = TfmdLists(files, tfm, splits=splits)
dls = tls.dataloaders(after_item=[Resize(224), ToTensor], 
    after_batch=[IntToFloatTensor, Normalize.from_stats(*imagenet_stats)])
Google Colaboratory

Read more

fastai14-Resnet

卷积神经网络有这样两个问题 * 我们需要大量的步长为 2 的层来使我们的网格在最后变成 1×1 * 无法在除我们最初训练的尺寸之外的任何尺寸的图像上工作 全卷积网络 | fully convolutional networks def avg_pool(x): return x.mean((2,3)) 前面正常卷积, 剩下的直接求平均 def block(ni, nf): return ConvLayer(ni, nf, stride=2) def get_model(): return nn.Sequential( block(3, 16), block(16, 32), block(32, 64), block(64, 128)

By kamado nezuko

pt命令行做种

发布种子各站点都有教程, 奈何使用的qb下载器为qbittorrent-nox, 没有直接生成torrent文件的选项, google发现可以使用transmission-cli命令行生成torrent 安装 sudo apt install transmission-cli 生成torrent种子 transmission-create -p -o path/to/example.torrent --tracker tracker_announce_url --piecesize 2048 path/to/file_or_directory * -p: 私有种子,不使用 DHT * -o: 生成 torrent 文件路径 * -t: tracker 地址 * -s: 每个文件块大小(参考下表) 文件大小 文件块大小 0 GB - 0.5 GB

By kamado nezuko