提交 939a873b 编写于 作者: A Aston Zhang

add kaggle dog, revise other kaggles

上级 7c249f28
......@@ -48,7 +48,7 @@ apply(img, transforms.RandomFlipTopBottom())
```{.python .input n=5}
shape_aug = transforms.RandomResizedCrop(
(200, 200), scale=(.1, 1), ratio=(.5, 2))
(200, 200), scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)
```
......@@ -57,20 +57,20 @@ apply(img, shape_aug)
形状变化外的一个另一大类是变化颜色。颜色一般有四个可以调的参数:亮度、对比、饱和度和色相。下面例子里我们随机将亮度在当前值上增加或减小一个在0到50%之前的量。
```{.python .input n=6}
apply(img, transforms.RandomLighting(.5))
apply(img, transforms.RandomBrightness(0.5))
```
同样的修改色相。
```{.python .input n=7}
apply(img, transforms.RandomHue(.5))
apply(img, transforms.RandomHue(0.5))
```
或者用使用`RandomColorJitter`来一起使用。
```{.python .input n=8}
color_aug = transforms.RandomColorJitter(
brightness=.5, contrast=.5, saturation=.5, hue=.5)
brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)
```
......@@ -89,7 +89,8 @@ apply(img, augs)
接下来我们来看一个将图片增广应用在实际训练的例子,并比较其与不使用时的区别。这里我们使用CIFAR-10数据集,而不是之前我们一直使用的FashionMNIST。原因在于FashionMNIST中物体位置和尺寸都已经统一化了,而CIFAR-10中物体颜色和大小区别更加显著。下面我们展示CIFAR-10中的前32张训练图片。
```{.python .input n=10}
gb.show_images(gluon.data.vision.CIFAR10(train=True)[0:32][0], 4, 8, scale=0.8)
gb.show_images(gluon.data.vision.CIFAR10(train=True)[0:32][0], 4, 8,
scale=0.8);
```
在训练时,我们通常将图片增广作用在训练图片上,使得模型能识别出各种变化过后的版本。这里我们仅仅使用最简单的随机水平翻转。此外我们使用`ToTensor`变换来图片转成MXNet需要的格式,即格式为(批量,通道,高,宽)以及类型为32位浮点数。
......@@ -119,7 +120,7 @@ def load_cifar10(is_train, augs, batch_size):
我们使用ResNet 18来训练CIFAR-10。训练的的代码跟[“残差网络:ResNet”](..//chapter_convolutional-neural-networks/resnet.md)一致,除了使用所有可用的GPU和不同的学习率外。
```{.python .input n=13}
def train(train_augs, test_augs, lr=.1):
def train(train_augs, test_augs, lr=0.1):
batch_size = 256
ctx = gb.try_all_gpus()
net = gb.resnet18(10)
......
......@@ -29,7 +29,7 @@ import shutil
## 获取数据集
比赛数据分为训练数据集和测试数据集。训练集包含5万张图片。测试集包含30万张图片:其中有1万张图片用来计分,其他29万张不计分的图片是为了防止人工标注测试集。两个数据集中的图片格式都是png,高和宽均为32,并含有RGB三个通道(彩色)。图片的类别数为10,类别分别为飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车,如图9.X所示。
比赛数据分为训练数据集和测试数据集。训练集包含5万张图片。测试集包含30万张图片:其中有1万张图片用来计分,其他29万张不计分的图片是为了防止人工标注测试集。两个数据集中的图片格式都是png,高和宽均为32像素,并含有RGB三个通道(彩色)。图片的类别数为10,类别分别为飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车,如图9.X所示。
![CIFAR-10图像的类别分别为飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。](../img/cifar10.png)
......@@ -47,7 +47,7 @@ import shutil
* ../data/kaggle_cifar10/test/[1-300000].png
* ../data/kaggle_cifar10/trainLabels.csv
为方便快速上手,我们提供了上述数据集的小规模采样,例如仅含100个训练样本的“train_tiny.zip”和1个测试样本的“test_tiny.zip”。它们解压后的文件夹名称分别为“train_tiny”和“test_tiny”。此外,训练数据集标签的压缩文件解压后得到“trainLabels.csv”。如果你将使用上述的Kaggle比赛完整数据集,还需要把下面`demo`变量改为`False`
为方便快速上手,我们提供了上述数据集的小规模采样,例如仅含100个训练样本的“train_tiny.zip”和1个测试样本的“test_tiny.zip”。它们解压后的文件夹名称分别为“train_tiny”和“test_tiny”。此外,训练数据集标签的压缩文件解压后得到“trainLabels.csv”。如果你将使用上述Kaggle比赛的完整数据集,还需要把下面`demo`变量改为`False`
```{.python .input}
# 如果使用下载的 Kaggle 比赛的完整数据集,把下面改为 False。
......@@ -61,7 +61,7 @@ if demo:
### 整理数据集
我们定义下面的`reorg_cifar10_data`函数来整理数据集。整理后,同一类图片将被放在同一个文件夹下,便于我们稍后读取。该函数中的参数`valid_ratio`是验证集占原始训练集的比重。以`valid_ratio=0.1`为例,由于原始训练数据有50,000张图片,调参时将有45,000张图片用于训练并存放在路径“`input_dir`/train”,而另外5,000张图片为验证集并存放在路径“`input_dir`/valid”。
我们定义下面的`reorg_cifar10_data`函数来整理数据集。整理后,同一类图片将被放在同一个文件夹下,便于我们稍后读取。该函数中的参数`valid_ratio`是验证集样本数与原始训练集样本数之比。以`valid_ratio=0.1`为例,由于原始训练数据集有50,000张图片,调参时将有45,000张图片用于训练并存放在路径“`input_dir`/train”,而另外5,000张图片为验证集并存放在路径“`input_dir`/valid”。
```{.python .input n=2}
def reorg_cifar10_data(data_dir, label_file, train_dir, test_dir, input_dir,
......@@ -112,11 +112,11 @@ def reorg_cifar10_data(data_dir, label_file, train_dir, test_dir, input_dir,
```{.python .input n=3}
if demo:
# 注意:此处使用小训练集。Kaggle 比赛的完整数据集应包括 5 万训练样本。
# 注意:此处使用小训练集。
train_dir = 'train_tiny'
# 注意:此处使用小测试集。Kaggle 比赛的完整数据集应包括 30 万测试样本。
# 注意:此处使用小测试集。
test_dir = 'test_tiny'
# 注意:此处相应使用小批量。使用 Kaggle 比赛的完整数据集时可设较大的整数。
# 注意:此处将批量大小相应设小。使用 Kaggle 比赛的完整数据集时可设较大整数。
batch_size = 1
else:
train_dir = 'train'
......@@ -131,18 +131,20 @@ reorg_cifar10_data(data_dir, label_file, train_dir, test_dir, input_dir,
valid_ratio)
```
## 增广数据
## 图片增广
为应对过拟合,我们在这里使用`transforms`来增广数据。例如,加入`transforms.RandomFlipLeftRight()`即可随机对图片做镜面反转。我们也通过`transforms.Normalize()`对彩色图像RGB三个通道分别做标准化。以下列举了部分操作。这些操作可以根据需求来决定是否使用,它们的超参数也都是可调的
为应对过拟合,我们在这里使用`transforms`来增广数据。例如,加入`transforms.RandomFlipLeftRight()`即可随机对图片做镜面反转。我们也通过`transforms.Normalize()`对彩色图像RGB三个通道分别做标准化。以下列举了部分操作。这些操作可以根据需求来决定是否使用或修改
```{.python .input n=4}
transform_train = transforms.Compose([
# 随机按照 scale 和 ratio 裁剪,并放缩为 32 x 32 的正方形。
transforms.RandomResizedCrop(32, scale=(0.08, 1.0),
ratio=(3.0/4.0, 4.0/3.0)),
# 将图片放大成高和宽各为 40 像素的正方形。
transforms.Resize(40),
# 随机对高和宽各为 40 像素的正方形图片裁剪出面积为原图片面积 0.64 到 1 倍之间的小正方
# 形,再放缩为高和宽各为 32 像素的正方形。
transforms.RandomResizedCrop(32, scale=(0.64, 1.0), ratio=(1.0, 1.0)),
# 随机左右翻转图片。
transforms.RandomFlipLeftRight(),
# 将图片像素值缩小到(0, 1)内,并将数据格式从“高*宽*通道”改为“通道*高*宽”。
# 将图片像素值按比例缩小到 0 和 1 之间,并将数据格式从“高*宽*通道”改为“通道*高*宽”。
transforms.ToTensor(),
# 对图片的每个通道做标准化。
transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])
......@@ -344,10 +346,9 @@ df.to_csv('submission.csv', index=False)
## 练习
* 使用Kaggle比赛的完整CIFAR-10数据集。把`batch_size``num_epochs`分别改为128和100。看看你可以在这个比赛中拿到什么样的准确率和名次?
* 使用Kaggle比赛的完整CIFAR-10数据集。把批量大小`batch_size`和迭代周期数`num_epochs`分别改为128和100。看看你可以在这个比赛中拿到什么样的准确率和名次?
* 如果不使用增强数据的方法能拿到什么样的准确率?
*`transforms.RandomResizedCrop`前依次添加以下数据增广操作(使用逗号隔开):transforms.CenterCrop(32)、transforms.RandomFlipTopBottom()、transforms.RandomColorJitter(brightness=0.0, contrast=0.0, saturation=0.0, hue=0.0)、transforms.RandomLighting(0.0)、transforms.Cast('float32')和transforms.Resize(32)。调一调它们的超参数。对结果有什么影响?
* 扫码直达讨论区,在社区交流方法和结果。相信你一定会有收获。
* 扫码直达讨论区,在社区交流方法和结果。你能发掘出其他更好的技巧吗?
## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/1545/)
......
......@@ -259,7 +259,7 @@ train_and_pred(num_epochs, verbose_epoch, train_features, test_features,
* 在Kaggle提交本教程的预测结果。观察一下,这个结果能在Kaggle上拿到什么样的分数?
* 对照$K$折交叉验证结果,不断修改模型(例如添加隐藏层)和调参,你能提高Kaggle上的分数吗?
* 如果不使用本节中对连续数值特征的标准化处理,结果会有什么变化?
* 扫码直达讨论区,在社区交流方法和结果。相信你一定会有收获。
* 扫码直达讨论区,在社区交流方法和结果。你能发掘出其他更好的技巧吗?
## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/1039)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册