fast.ai-深度学习笔记-Part1-lesson2

数据集文件结构

以「猫狗识别」为例

训练结果

epoch(训练次数)
training loss(训练集损失值)
validation loss(测试集损失值)
accuracy(准确率)

[epoch , training loss, validation loss, accuracy]
[ 0.       0.04955  0.02605  0.98975]

学习率寻找器(Learning rate finder)

  • 学习率的核心目的:训练过程,迭代的步伐


    image.png
  • 学习率太低,寻找到碗状图形底部,耗时过长
  • 学习率太高,最低点容易震荡
  • 学习率寻找器learn.lr_find会在训练完一批批尺寸(mini_batch) 之后,持续提高学习率,最终,学习率升高后,会导致损失值(loss)增大。通过观看学习率与损失值关系的折线图,我们可以选定最低损失值(loss)对应的学习率,选择上一个指数级别的学习率。(下图的例子,选择的是1e-2,也就是0.01为学习率)。
  • 问题:为何不选损失值最小的底部的学习率。
  • 回答:红箭头所指的是最底部的学习率,但其实它的数值较大,不太可能收拢,而更小一级别的学习率是更好的选择,它有更多的提升空间,更容易收拢。一般而言,学习率尽量小一些。


    image.png
  • 批尺寸(mini_batch)是我们的模型一次“学习观看”的一组图片,一般而已,mini_batch的数值会设置为64或128,意味着GPU 可以高效地利用它并行计算的优势来加速计算学习的过程。
  • Python 代码写法:


  • 选对学习率,fast.ai的模块会自动选择其他的超参数。
  • learn.lr_find比其他优化器(optimizer,比如 momentum、Adam 等等)性能更佳

Overfitting 过拟合

过拟合 overfitting是指我们的模型过于拘泥与训练集图片的独特细节特征,而不是适合迁移至其他验证数据的通用特征。

例子

数据增强

提升深度学习模型表现,最直接的办法就是——训练更多的数据。在不收集更多的数据时,可以通过数据增强(Data Rugmentation)的技术来制造更多的数据。

  • 每一次训练,我们会随机的转变图片一点点。也就说,每一次训练,模型学习的图片外观,都稍有不同。
  • 不同类型的图片,可以使用不同的数据增强形式。
    • 水平/垂直翻转图片
    • 放大/缩小
    • 更改对比度/亮度...

代码示例

tfms = tfms_from_model(resnet34, sz, aug_tfms=transforms_side_on, max_zoom=1.1)
  • transform_side_on是侧面图的默认转换方式。
  • 它实质上并没有创造新数据,而是让卷积神经网络从不同角度来学习图片。

训练模型

data = ImageClassifierData.from_paths(PATH, tfms=tfms)
learn = ConvLearner.pretrained(arch, data, precompute=True)
learn.fit(1e-2, 1)
  • 创建 data 对象,使用数据增强,但因为 precompute 设置为True,因此数据增强没有做任何事情。
  • 卷积神经网络中包含了Activation,一个Activation的含义是在此处这个特征的概率置信值(概率)的数字。
  • 我们使用的是预训练的模型,它已经学习过如何识别特征了,所以在隐藏层(hidden layer),我们用的是预训练的 Activation,只训练末尾的线性部分。


    image.png
  • 因此,第一次训练耗时较长,它预先计算这些 Activations
  • 为了使用数据增强,learn.precompute=False
learn.precompute=False
learn.fit(1e-2, 3, cycle_len=1)
[ 0.       0.03597  0.01879  0.99365]                         
[ 1.       0.02605  0.01836  0.99365]                         
[ 2.       0.02189  0.0196   0.99316]

SDGR(stochastic gradient descent with restarts )

(文字待更新)


image.png
image.png

微调(Fine-Tuning)& Differential Learning Rate

learn.unfreeze()
  • 冻结层是未训练的神经层,unfreeze解冻它们,在下一次 epoch 训练时,会更新它们的参数值。
  • 浅层(比如第一层,侦测对角边缘或渐变的神经层。或是是第二层,侦测曲线或者边角)的神经层,相对而言需要迭代更新的幅度较小。
  • 深层的神经层需要更大幅度的更新迭代。
    因此,不同深浅的神经层,我们采用不同的学习率。
lr=np.array([1e-4,1e-3,1e-2])

卷积神经基本理论

图片滤波器Image Kernels

卷积:在深度学习里,卷积一般是一个33的矩阵(Matrix),与图片的每一块33的区域相乘,并求和得到卷积的一个点。

image.png

Excel表格&可视化

  • Activation:对输入值进行线性计算,得到的数值
  • Relu 函数:负值归零,正值依旧。
  • 滤波器(Filter/Kernel):三维张量中的 一块 3X3 矩阵
  • 张量(Tensor): 多维数组
  • 最大池化(Max Pooling):一个(2,2)大小的最大池化会对分辨率进行平分切割,分别从高/宽维度。
  • 全连接层(Fully Connected Layer):给每一次激活赋予权重并计算总和乘积。权重的矩阵与整个输入一样大。
  • 注意:最大池化层之后,可以有许多操作。过度使用全连接层,容易造成过拟合以及减缓速度。ResNet和 ResNext 没有使用很大的全连接层。

端到端&猫狗识别

image.png

代码解析:

data = ImageClassifierData.from_paths(PATH, tfms= tfms, bs=bs, test_name='test')
  • from_paths表明子文件夹的名称便是标签。如果你的train或者valid 文件夹有其他名称,你可以传入trn_nameval_name参数。
  • test_name:如果你要上传结果到 Kaggle 比赛,你需要填写测试集的文件夹名称。
learn = ConvLearner.pretrained(resnet50, data)
  • 注意:我们没有设置pre_compute=True.这是一条捷径,隐藏掉不需要重新计算的中间步骤。如果你感到迷惑,就先不管它。
  • 谨记:当pre_compute=True,数据增强不起效。
learn.unfreeze() 
learn.bn_freeze(True) 
%time learn.fit([1e-5, 1e-4,1e-2], 1, cycle_len=1)
  • bn_freeze如果你用更大更深的模型,像 ResNet50或者 ResNet101(任何后缀数字大于34)的模型,应用在于 ImageNet 类似的图片集(侧面图&标准物体&在200-500像素之间),你要加上这一行代码。这一知识点,会在课程第二部分讲解,“but it is causing the batch normalization moving averages to not be updated.”

如何在其他库里实现类似的模型-Keras

  1. 定义数据生成器
train_data_dir = f'{PATH}train' 
validation_data_dir = f'{PATH}valid'
train_datagen = ImageDataGenerator(rescale=1. / 255,
    shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(train_data_dir,
    target_size=(sz, sz),
    batch_size=batch_size, class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    shuffle=False,
    target_size=(sz, sz),
    batch_size=batch_size, class_mode='binary')
  • Keras 代码更多,需要设置的参数更多。
  • Keras 要定义DataGenerator,详细指明需要用什么样的数据增强形式及标准化。相比而言,fastai 只需要说:“ResNets50需要设置什么,就帮我搞定吧。”
base_model = ResNet50(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(1, activation='sigmoid')(x)
  • 在Keras 使用 ResNets50的原因是,Keras 不提供 ResNets34
  • Keras里,建模需要手动设置
  • 首先,你得创建一个基本的模型,然后在此基础上搭积木
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers: layer.trainable = False
model.compile(optimizer='rmsprop', loss='binary_crossentropy', 
    metrics=['accuracy'])
  • 你还得编译模型
  • 你还得历遍神经层,使用layer.trainable=False手动冻结它们
  • 你还得定义选择优化器、损失函数和评估指标
model.fit_generator(train_generator, train_generator.n//batch_size,
    epochs=3, workers=4, validation_data=validation_generator,
    validation_steps=validation_generator.n // batch_size)
  • worker:使用多少处理器
  • Keras需要知道一次 epoch 有多少 batch
split_at = 140
for layer in model.layers[:split_at]: layer.trainable = False
for layer in model.layers[split_at:]: layer.trainable = True
model.compile(optimizer='rmsprop', loss='binary_crossentropy',
    metrics=['accuracy'])
%%time model.fit_generator(train_generator, 
    train_generator.n // batch_size, epochs=1, workers=3,
    validation_data=validation_generator,
    validation_steps=validation_generator.n // batch_size)
  • Pytorch如果你想部署模型到移动端,Pytorch 还不成熟
  • Tensorflow如果你想把本课程所学,迁移到这个框架,在 Keras 上工作量更大,未来可能会开发 TensorFlow 框架的 fastai

Jupyter NoteBook 函数技巧

image.png
image.png
image.png
image.png

F-Score

Instead of accuacy, we used F-beta for this notebook — it is a way of weighing false negatives and false positives. The reason we are using it is because this particular Kaggle competition wants to use it. Take a look at planet.py to see how you can create your own metrics function. This is what gets printed out at the end [ 0\. 0.08932 0.08218 **0.9324**]

The F-beta score is the weighted harmonic mean of precision and recall, reaching its optimal value at 1 and its worst value at 0.

To be continue......未完待续

参考资料

Deep Learning 2: Part 1 Lesson 2

TimeLog

2019.1.11 0.5h

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342