PyTorch中使用迁移训练(Transfer Learning)进行图像分类

PyTorch使用方便,易于学习,开发效率很高。在这篇文章中,我们描述了如何在PyTorch中进行图像分类。我们将使用CalTech256数据集的子集对10种不同种类动物的图像进行分类。我们将介绍数据集准备,数据增强,然后逐步来构建分类器。预训练模型ResNet50已经学习了低层次的图像特征,如边缘、纹理等,我们使用迁移学习来复用这些低层次特征,然后训练我们的分类器来学习我们的数据集中图像中的更高层次的细节,如眼睛、腿等。ResNet50已经使用ImageNet数据集的数百万张图像进行了训练。 文章末尾有该实验的完整的代码,并且在文章中分析重要的片段,这样读者就可以理解它是如何工作的。

1、数据集准备

Caltech-256数据集有30607幅图像,分为256个不同的标记类和另一个“杂乱”类。 训练整个数据集需要几个小时,所以我们将研究包含10种动物的数据集的子集-熊、黑猩猩、长颈鹿、大猩猩、骆驼、鸵鸟、豪猪、臭鼬、三角龙和斑马。这样我们就能更快地进行实验。当然,代码也可以用来训练整个数据集。 这些文件夹中的图像数量从81(对于臭鼬)到212(对于大猩猩)不等。我们在每个类别中使用前60幅图像进行训练,使用后面的10幅图像进行验证,其余的用于测试。 因此,最后我们有600个训练图像,100个验证图像,409个测试图像和10类动物。

如果你想自己做这些实验,请按照下面的步骤进行

1、下载CalTech256数据集,下载种子地址: http://shujujishi.com/dataset/4f9027a7-79c9-4612-9e02-044b679106fb 或者 https://hyper.ai/datasets/5261

2、创建三个目录,名称分别是train,valid和test。

3、在train,valid和test目录中各创建10个子目录。这些子目录应该被命名为bear, chimp, giraffe, gorilla, llama, ostrich, porcupine, skunk, triceratops and zebra

4、将Caltech256数据集中的bear的前60幅图像移动到目录train/bear,并对每只动物重复这一点。

5、将Caltech256数据集中的bear的接下来10张图像移动到目录valid/bear,并对每只动物重复这一点。

6、将Caltech256数据集中的bear剩下的图片复制给目录test/bear。每只动物都重复这个。

最终结果如下:

caltech_10
├── test
│   ├── bear
│   │   ├── 009_0071.jpg
│   │   ├── 009_0072.jpg
│   │   ├── 009_0073.jpg
│   │   ├── 009_0074.jpg
│   │   ├── 009_0075.jpg
│   │   ├── 009_0076.jpg
│   │   ├── 009_0077.jpg
│   │   ├── 009_0078.jpg
│   │   ├── 009_0079.jpg
│   │   ├── 009_0080.jpg
│   │   ├── 009_0081.jpg
│   │   ├── 009_0082.jpg
│   │   ├── 009_0083.jpg
│   │   ├── 009_0084.jpg
│   │   ├── 009_0085.jpg
│   │   ├── 009_0086.jpg
│   │   ├── 009_0087.jpg
│   │   ├── 009_0088.jpg
│   │   ├── 009_0089.jpg
│   │   ├── 009_0090.jpg
│   │   ├── 009_0091.jpg
│   │   ├── 009_0092.jpg
│   │   ├── 009_0093.jpg
│   │   ├── 009_0094.jpg
│   │   ├── 009_0095.jpg
│   │   ├── 009_0096.jpg
│   │   ├── 009_0097.jpg
│   │   ├── 009_0098.jpg
│   │   ├── 009_0099.jpg
│   │   ├── 009_0100.jpg
│   │   ├── 009_0101.jpg
│   │   └── 009_0102.jpg
│   ├── chimp
│   │   ├── 038_0071.jpg
│   │   ├── 038_0072.jpg
│   │   ├── 038_0073.jpg
│   │   ├── 038_0074.jpg
│   │   ├── 038_0075.jpg
│   │   ├── 038_0076.jpg
│   │   ├── 038_0077.jpg
│   │   ├── 038_0078.jpg
│   │   ├── 038_0079.jpg
│   │   ├── 038_0080.jpg
│   │   ├── 038_0081.jpg
│   │   ├── 038_0082.jpg
│   │   ├── 038_0083.jpg
│   │   ├── 038_0084.jpg
│   │   ├── 038_0085.jpg
│   │   ├── 038_0086.jpg
│   │   ├── 038_0087.jpg
│   │   ├── 038_0088.jpg
│   │   ├── 038_0089.jpg
│   │   ├── 038_0090.jpg
│   │   ├── 038_0091.jpg
│   │   ├── 038_0092.jpg
│   │   ├── 038_0093.jpg
│   │   ├── 038_0094.jpg
│   │   ├── 038_0095.jpg
│   │   ├── 038_0096.jpg
│   │   ├── 038_0097.jpg
│   │   ├── 038_0098.jpg
│   │   ├── 038_0099.jpg
│   │   ├── 038_0100.jpg
│   │   ├── 038_0101.jpg
│   │   ├── 038_0102.jpg
│   │   ├── 038_0103.jpg
│   │   ├── 038_0104.jpg
│   │   ├── 038_0105.jpg
│   │   ├── 038_0106.jpg
│   │   ├── 038_0107.jpg
│   │   ├── 038_0108.jpg
│   │   ├── 038_0109.jpg
│   │   └── 038_0110.jpg
│   ├── giraffe
│   │   ├── 084_0071.jpg
│   │   ├── 084_0072.jpg
│   │   ├── 084_0073.jpg
│   │   ├── 084_0074.jpg
│   │   ├── 084_0075.jpg
│   │   ├── 084_0076.jpg
│   │   ├── 084_0077.jpg
│   │   ├── 084_0078.jpg
│   │   ├── 084_0079.jpg
│   │   ├── 084_0080.jpg
│   │   ├── 084_0081.jpg
│   │   ├── 084_0082.jpg
│   │   ├── 084_0083.jpg
│   │   └── 084_0084.jpg
│   ├── gorilla
│   │   ├── 090_0071.jpg
│   │   ├── 090_0072.jpg
│   │   ├── 090_0073.jpg
│   │   ├── 090_0074.jpg
│   │   ├── 090_0075.jpg
│   │   ├── 090_0076.jpg
│   │   ├── 090_0077.jpg
│   │   ├── 090_0078.jpg
│   │   ├── 090_0079.jpg
│   │   ├── 090_0080.jpg
│   │   ├── 090_0081.jpg
│   │   ├── 090_0082.jpg
│   │   ├── 090_0083.jpg
│   │   ├── 090_0084.jpg
│   │   ├── 090_0085.jpg
│   │   ├── 090_0086.jpg
│   │   ├── 090_0087.jpg
│   │   ├── 090_0088.jpg
│   │   ├── 090_0089.jpg
│   │   ├── 090_0090.jpg
│   │   ├── 090_0091.jpg
│   │   ├── 090_0092.jpg
│   │   ├── 090_0093.jpg
│   │   ├── 090_0094.jpg
│   │   ├── 090_0095.jpg
│   │   ├── 090_0096.jpg
│   │   ├── 090_0097.jpg
│   │   ├── 090_0098.jpg
│   │   ├── 090_0099.jpg
│   │   ├── 090_0100.jpg
│   │   ├── 090_0101.jpg
│   │   ├── 090_0102.jpg
│   │   ├── 090_0103.jpg
│   │   ├── 090_0104.jpg
│   │   ├── 090_0105.jpg
│   │   ├── 090_0106.jpg
│   │   ├── 090_0107.jpg
│   │   ├── 090_0108.jpg
│   │   ├── 090_0109.jpg
│   │   ├── 090_0110.jpg
│   │   ├── 090_0111.jpg
│   │   ├── 090_0112.jpg
│   │   ├── 090_0113.jpg
│   │   ├── 090_0114.jpg
│   │   ├── 090_0115.jpg
│   │   ├── 090_0116.jpg
│   │   ├── 090_0117.jpg
│   │   ├── 090_0118.jpg
│   │   ├── 090_0119.jpg
│   │   ├── 090_0120.jpg
│   │   ├── 090_0121.jpg
│   │   ├── 090_0122.jpg
│   │   ├── 090_0123.jpg
│   │   ├── 090_0124.jpg
│   │   ├── 090_0125.jpg
│   │   ├── 090_0126.jpg
│   │   ├── 090_0127.jpg
│   │   ├── 090_0128.jpg
│   │   ├── 090_0129.jpg
│   │   ├── 090_0130.jpg
│   │   ├── 090_0131.jpg
│   │   ├── 090_0132.jpg
│   │   ├── 090_0133.jpg
│   │   ├── 090_0134.jpg
│   │   ├── 090_0135.jpg
│   │   ├── 090_0136.jpg
│   │   ├── 090_0137.jpg
│   │   ├── 090_0138.jpg
│   │   ├── 090_0139.jpg
│   │   ├── 090_0140.jpg
│   │   ├── 090_0141.jpg
│   │   ├── 090_0142.jpg
│   │   ├── 090_0143.jpg
│   │   ├── 090_0144.jpg
│   │   ├── 090_0145.jpg
│   │   ├── 090_0146.jpg
│   │   ├── 090_0147.jpg
│   │   ├── 090_0148.jpg
│   │   ├── 090_0149.jpg
│   │   ├── 090_0150.jpg
│   │   ├── 090_0151.jpg
│   │   ├── 090_0152.jpg
│   │   ├── 090_0153.jpg
│   │   ├── 090_0154.jpg
│   │   ├── 090_0155.jpg
│   │   ├── 090_0156.jpg
│   │   ├── 090_0157.jpg
│   │   ├── 090_0158.jpg
│   │   ├── 090_0159.jpg
│   │   ├── 090_0160.jpg
│   │   ├── 090_0161.jpg
│   │   ├── 090_0162.jpg
│   │   ├── 090_0163.jpg
│   │   ├── 090_0164.jpg
│   │   ├── 090_0165.jpg
│   │   ├── 090_0166.jpg
│   │   ├── 090_0167.jpg
│   │   ├── 090_0168.jpg
│   │   ├── 090_0169.jpg
│   │   ├── 090_0170.jpg
│   │   ├── 090_0171.jpg
│   │   ├── 090_0172.jpg
│   │   ├── 090_0173.jpg
│   │   ├── 090_0174.jpg
│   │   ├── 090_0175.jpg
│   │   ├── 090_0176.jpg
│   │   ├── 090_0177.jpg
│   │   ├── 090_0178.jpg
│   │   ├── 090_0179.jpg
│   │   ├── 090_0180.jpg
│   │   ├── 090_0181.jpg
│   │   ├── 090_0182.jpg
│   │   ├── 090_0183.jpg
│   │   ├── 090_0184.jpg
│   │   ├── 090_0185.jpg
│   │   ├── 090_0186.jpg
│   │   ├── 090_0187.jpg
│   │   ├── 090_0188.jpg
│   │   ├── 090_0189.jpg
│   │   ├── 090_0190.jpg
│   │   ├── 090_0191.jpg
│   │   ├── 090_0192.jpg
│   │   ├── 090_0193.jpg
│   │   ├── 090_0194.jpg
│   │   ├── 090_0195.jpg
│   │   ├── 090_0196.jpg
│   │   ├── 090_0197.jpg
│   │   ├── 090_0198.jpg
│   │   ├── 090_0199.jpg
│   │   ├── 090_0200.jpg
│   │   ├── 090_0201.jpg
│   │   ├── 090_0202.jpg
│   │   ├── 090_0203.jpg
│   │   ├── 090_0204.jpg
│   │   ├── 090_0205.jpg
│   │   ├── 090_0206.jpg
│   │   ├── 090_0207.jpg
│   │   ├── 090_0208.jpg
│   │   ├── 090_0209.jpg
│   │   ├── 090_0210.jpg
│   │   ├── 090_0211.jpg
│   │   └── 090_0212.jpg
│   ├── llama
│   │   ├── 134_0071.jpg
│   │   ├── 134_0072.jpg
│   │   ├── 134_0073.jpg
│   │   ├── 134_0074.jpg
│   │   ├── 134_0075.jpg
│   │   ├── 134_0076.jpg
│   │   ├── 134_0077.jpg
│   │   ├── 134_0078.jpg
│   │   ├── 134_0079.jpg
│   │   ├── 134_0080.jpg
│   │   ├── 134_0081.jpg
│   │   ├── 134_0082.jpg
│   │   ├── 134_0083.jpg
│   │   ├── 134_0084.jpg
│   │   ├── 134_0085.jpg
│   │   ├── 134_0086.jpg
│   │   ├── 134_0087.jpg
│   │   ├── 134_0088.jpg
│   │   ├── 134_0089.jpg
│   │   ├── 134_0090.jpg
│   │   ├── 134_0091.jpg
│   │   ├── 134_0092.jpg
│   │   ├── 134_0093.jpg
│   │   ├── 134_0094.jpg
│   │   ├── 134_0095.jpg
│   │   ├── 134_0096.jpg
│   │   ├── 134_0097.jpg
│   │   ├── 134_0098.jpg
│   │   ├── 134_0099.jpg
│   │   ├── 134_0100.jpg
│   │   ├── 134_0101.jpg
│   │   ├── 134_0102.jpg
│   │   ├── 134_0103.jpg
│   │   ├── 134_0104.jpg
│   │   ├── 134_0105.jpg
│   │   ├── 134_0106.jpg
│   │   ├── 134_0107.jpg
│   │   ├── 134_0108.jpg
│   │   ├── 134_0109.jpg
│   │   ├── 134_0110.jpg
│   │   ├── 134_0111.jpg
│   │   ├── 134_0112.jpg
│   │   ├── 134_0113.jpg
│   │   ├── 134_0114.jpg
│   │   ├── 134_0115.jpg
│   │   ├── 134_0116.jpg
│   │   ├── 134_0117.jpg
│   │   ├── 134_0118.jpg
│   │   └── 134_0119.jpg
│   ├── ostrich
│   │   ├── 151_0071.jpg
│   │   ├── 151_0072.jpg
│   │   ├── 151_0073.jpg
│   │   ├── 151_0074.jpg
│   │   ├── 151_0075.jpg
│   │   ├── 151_0076.jpg
│   │   ├── 151_0077.jpg
│   │   ├── 151_0078.jpg
│   │   ├── 151_0079.jpg
│   │   ├── 151_0080.jpg
│   │   ├── 151_0081.jpg
│   │   ├── 151_0082.jpg
│   │   ├── 151_0083.jpg
│   │   ├── 151_0084.jpg
│   │   ├── 151_0085.jpg
│   │   ├── 151_0086.jpg
│   │   ├── 151_0087.jpg
│   │   ├── 151_0088.jpg
│   │   ├── 151_0089.jpg
│   │   ├── 151_0090.jpg
│   │   ├── 151_0091.jpg
│   │   ├── 151_0092.jpg
│   │   ├── 151_0093.jpg
│   │   ├── 151_0094.jpg
│   │   ├── 151_0095.jpg
│   │   ├── 151_0096.jpg
│   │   ├── 151_0097.jpg
│   │   ├── 151_0098.jpg
│   │   ├── 151_0099.jpg
│   │   ├── 151_0100.jpg
│   │   ├── 151_0101.jpg
│   │   ├── 151_0102.jpg
│   │   ├── 151_0103.jpg
│   │   ├── 151_0104.jpg
│   │   ├── 151_0105.jpg
│   │   ├── 151_0106.jpg
│   │   ├── 151_0107.jpg
│   │   ├── 151_0108.jpg
│   │   └── 151_0109.jpg
│   ├── porcupine
│   │   ├── 164_0071.jpg
│   │   ├── 164_0072.jpg
│   │   ├── 164_0073.jpg
│   │   ├── 164_0074.jpg
│   │   ├── 164_0075.jpg
│   │   ├── 164_0076.jpg
│   │   ├── 164_0077.jpg
│   │   ├── 164_0078.jpg
│   │   ├── 164_0079.jpg
│   │   ├── 164_0080.jpg
│   │   ├── 164_0081.jpg
│   │   ├── 164_0082.jpg
│   │   ├── 164_0083.jpg
│   │   ├── 164_0084.jpg
│   │   ├── 164_0085.jpg
│   │   ├── 164_0086.jpg
│   │   ├── 164_0087.jpg
│   │   ├── 164_0088.jpg
│   │   ├── 164_0089.jpg
│   │   ├── 164_0090.jpg
│   │   ├── 164_0091.jpg
│   │   ├── 164_0092.jpg
│   │   ├── 164_0093.jpg
│   │   ├── 164_0094.jpg
│   │   ├── 164_0095.jpg
│   │   ├── 164_0096.jpg
│   │   ├── 164_0097.jpg
│   │   ├── 164_0098.jpg
│   │   ├── 164_0099.jpg
│   │   ├── 164_0100.jpg
│   │   └── 164_0101.jpg
│   ├── skunk
│   │   ├── 186_0071.jpg
│   │   ├── 186_0072.jpg
│   │   ├── 186_0073.jpg
│   │   ├── 186_0074.jpg
│   │   ├── 186_0075.jpg
│   │   ├── 186_0076.jpg
│   │   ├── 186_0077.jpg
│   │   ├── 186_0078.jpg
│   │   ├── 186_0079.jpg
│   │   ├── 186_0080.jpg
│   │   └── 186_0081.jpg
│   ├── triceratops
│   │   ├── 228_0071.jpg
│   │   ├── 228_0072.jpg
│   │   ├── 228_0073.jpg
│   │   ├── 228_0074.jpg
│   │   ├── 228_0075.jpg
│   │   ├── 228_0076.jpg
│   │   ├── 228_0077.jpg
│   │   ├── 228_0078.jpg
│   │   ├── 228_0079.jpg
│   │   ├── 228_0080.jpg
│   │   ├── 228_0081.jpg
│   │   ├── 228_0082.jpg
│   │   ├── 228_0083.jpg
│   │   ├── 228_0084.jpg
│   │   ├── 228_0085.jpg
│   │   ├── 228_0086.jpg
│   │   ├── 228_0087.jpg
│   │   ├── 228_0088.jpg
│   │   ├── 228_0089.jpg
│   │   ├── 228_0090.jpg
│   │   ├── 228_0091.jpg
│   │   ├── 228_0092.jpg
│   │   ├── 228_0093.jpg
│   │   ├── 228_0094.jpg
│   │   └── 228_0095.jpg
│   └── zebra
│       ├── 250_0071.jpg
│       ├── 250_0072.jpg
│       ├── 250_0073.jpg
│       ├── 250_0074.jpg
│       ├── 250_0075.jpg
│       ├── 250_0076.jpg
│       ├── 250_0077.jpg
│       ├── 250_0078.jpg
│       ├── 250_0079.jpg
│       ├── 250_0080.jpg
│       ├── 250_0081.jpg
│       ├── 250_0082.jpg
│       ├── 250_0083.jpg
│       ├── 250_0084.jpg
│       ├── 250_0085.jpg
│       ├── 250_0086.jpg
│       ├── 250_0087.jpg
│       ├── 250_0088.jpg
│       ├── 250_0089.jpg
│       ├── 250_0090.jpg
│       ├── 250_0091.jpg
│       ├── 250_0092.jpg
│       ├── 250_0093.jpg
│       ├── 250_0094.jpg
│       ├── 250_0095.jpg
│       └── 250_0096.jpg
├── train
│   ├── bear
│   │   ├── 009_0001.jpg
│   │   ├── 009_0002.jpg
│   │   ├── 009_0003.jpg
│   │   ├── 009_0004.jpg
│   │   ├── 009_0005.jpg
│   │   ├── 009_0006.jpg
│   │   ├── 009_0007.jpg
│   │   ├── 009_0008.jpg
│   │   ├── 009_0009.jpg
│   │   ├── 009_0010.jpg
│   │   ├── 009_0011.jpg
│   │   ├── 009_0012.jpg
│   │   ├── 009_0013.jpg
│   │   ├── 009_0014.jpg
│   │   ├── 009_0015.jpg
│   │   ├── 009_0016.jpg
│   │   ├── 009_0017.jpg
│   │   ├── 009_0018.jpg
│   │   ├── 009_0019.jpg
│   │   ├── 009_0020.jpg
│   │   ├── 009_0021.jpg
│   │   ├── 009_0022.jpg
│   │   ├── 009_0023.jpg
│   │   ├── 009_0024.jpg
│   │   ├── 009_0025.jpg
│   │   ├── 009_0026.jpg
│   │   ├── 009_0027.jpg
│   │   ├── 009_0028.jpg
│   │   ├── 009_0029.jpg
│   │   ├── 009_0030.jpg
│   │   ├── 009_0031.jpg
│   │   ├── 009_0032.jpg
│   │   ├── 009_0033.jpg
│   │   ├── 009_0034.jpg
│   │   ├── 009_0035.jpg
│   │   ├── 009_0036.jpg
│   │   ├── 009_0037.jpg
│   │   ├── 009_0038.jpg
│   │   ├── 009_0039.jpg
│   │   ├── 009_0040.jpg
│   │   ├── 009_0041.jpg
│   │   ├── 009_0042.jpg
│   │   ├── 009_0043.jpg
│   │   ├── 009_0044.jpg
│   │   ├── 009_0045.jpg
│   │   ├── 009_0046.jpg
│   │   ├── 009_0047.jpg
│   │   ├── 009_0048.jpg
│   │   ├── 009_0049.jpg
│   │   ├── 009_0050.jpg
│   │   ├── 009_0051.jpg
│   │   ├── 009_0052.jpg
│   │   ├── 009_0053.jpg
│   │   ├── 009_0054.jpg
│   │   ├── 009_0055.jpg
│   │   ├── 009_0056.jpg
│   │   ├── 009_0057.jpg
│   │   ├── 009_0058.jpg
│   │   ├── 009_0059.jpg
│   │   └── 009_0060.jpg
│   ├── chimp
│   │   ├── 038_0001.jpg
│   │   ├── 038_0002.jpg
│   │   ├── 038_0003.jpg
│   │   ├── 038_0004.jpg
│   │   ├── 038_0005.jpg
│   │   ├── 038_0006.jpg
│   │   ├── 038_0007.jpg
│   │   ├── 038_0008.jpg
│   │   ├── 038_0009.jpg
│   │   ├── 038_0010.jpg
│   │   ├── 038_0011.jpg
│   │   ├── 038_0012.jpg
│   │   ├── 038_0013.jpg
│   │   ├── 038_0014.jpg
│   │   ├── 038_0015.jpg
│   │   ├── 038_0016.jpg
│   │   ├── 038_0017.jpg
│   │   ├── 038_0018.jpg
│   │   ├── 038_0019.jpg
│   │   ├── 038_0020.jpg
│   │   ├── 038_0021.jpg
│   │   ├── 038_0022.jpg
│   │   ├── 038_0023.jpg
│   │   ├── 038_0024.jpg
│   │   ├── 038_0025.jpg
│   │   ├── 038_0026.jpg
│   │   ├── 038_0027.jpg
│   │   ├── 038_0028.jpg
│   │   ├── 038_0029.jpg
│   │   ├── 038_0030.jpg
│   │   ├── 038_0031.jpg
│   │   ├── 038_0032.jpg
│   │   ├── 038_0033.jpg
│   │   ├── 038_0034.jpg
│   │   ├── 038_0035.jpg
│   │   ├── 038_0036.jpg
│   │   ├── 038_0037.jpg
│   │   ├── 038_0038.jpg
│   │   ├── 038_0039.jpg
│   │   ├── 038_0040.jpg
│   │   ├── 038_0041.jpg
│   │   ├── 038_0042.jpg
│   │   ├── 038_0043.jpg
│   │   ├── 038_0044.jpg
│   │   ├── 038_0045.jpg
│   │   ├── 038_0046.jpg
│   │   ├── 038_0047.jpg
│   │   ├── 038_0048.jpg
│   │   ├── 038_0049.jpg
│   │   ├── 038_0050.jpg
│   │   ├── 038_0051.jpg
│   │   ├── 038_0052.jpg
│   │   ├── 038_0053.jpg
│   │   ├── 038_0054.jpg
│   │   ├── 038_0055.jpg
│   │   ├── 038_0056.jpg
│   │   ├── 038_0057.jpg
│   │   ├── 038_0058.jpg
│   │   ├── 038_0059.jpg
│   │   └── 038_0060.jpg
│   ├── giraffe
│   │   ├── 084_0001.jpg
│   │   ├── 084_0002.jpg
│   │   ├── 084_0003.jpg
│   │   ├── 084_0004.jpg
│   │   ├── 084_0005.jpg
│   │   ├── 084_0006.jpg
│   │   ├── 084_0007.jpg
│   │   ├── 084_0008.jpg
│   │   ├── 084_0009.jpg
│   │   ├── 084_0010.jpg
│   │   ├── 084_0011.jpg
│   │   ├── 084_0012.jpg
│   │   ├── 084_0013.jpg
│   │   ├── 084_0014.jpg
│   │   ├── 084_0015.jpg
│   │   ├── 084_0016.jpg
│   │   ├── 084_0017.jpg
│   │   ├── 084_0018.jpg
│   │   ├── 084_0019.jpg
│   │   ├── 084_0020.jpg
│   │   ├── 084_0021.jpg
│   │   ├── 084_0022.jpg
│   │   ├── 084_0023.jpg
│   │   ├── 084_0024.jpg
│   │   ├── 084_0025.jpg
│   │   ├── 084_0026.jpg
│   │   ├── 084_0027.jpg
│   │   ├── 084_0028.jpg
│   │   ├── 084_0029.jpg
│   │   ├── 084_0030.jpg
│   │   ├── 084_0031.jpg
│   │   ├── 084_0032.jpg
│   │   ├── 084_0033.jpg
│   │   ├── 084_0034.jpg
│   │   ├── 084_0035.jpg
│   │   ├── 084_0036.jpg
│   │   ├── 084_0037.jpg
│   │   ├── 084_0038.jpg
│   │   ├── 084_0039.jpg
│   │   ├── 084_0040.jpg
│   │   ├── 084_0041.jpg
│   │   ├── 084_0042.jpg
│   │   ├── 084_0043.jpg
│   │   ├── 084_0044.jpg
│   │   ├── 084_0045.jpg
│   │   ├── 084_0046.jpg
│   │   ├── 084_0047.jpg
│   │   ├── 084_0048.jpg
│   │   ├── 084_0049.jpg
│   │   ├── 084_0050.jpg
│   │   ├── 084_0051.jpg
│   │   ├── 084_0052.jpg
│   │   ├── 084_0053.jpg
│   │   ├── 084_0054.jpg
│   │   ├── 084_0055.jpg
│   │   ├── 084_0056.jpg
│   │   ├── 084_0057.jpg
│   │   ├── 084_0058.jpg
│   │   ├── 084_0059.jpg
│   │   └── 084_0060.jpg
│   ├── gorilla
│   │   ├── 090_0001.jpg
│   │   ├── 090_0002.jpg
│   │   ├── 090_0003.jpg
│   │   ├── 090_0004.jpg
│   │   ├── 090_0005.jpg
│   │   ├── 090_0006.jpg
│   │   ├── 090_0007.jpg
│   │   ├── 090_0008.jpg
│   │   ├── 090_0009.jpg
│   │   ├── 090_0010.jpg
│   │   ├── 090_0011.jpg
│   │   ├── 090_0012.jpg
│   │   ├── 090_0013.jpg
│   │   ├── 090_0014.jpg
│   │   ├── 090_0015.jpg
│   │   ├── 090_0016.jpg
│   │   ├── 090_0017.jpg
│   │   ├── 090_0018.jpg
│   │   ├── 090_0019.jpg
│   │   ├── 090_0020.jpg
│   │   ├── 090_0021.jpg
│   │   ├── 090_0022.jpg
│   │   ├── 090_0023.jpg
│   │   ├── 090_0024.jpg
│   │   ├── 090_0025.jpg
│   │   ├── 090_0026.jpg
│   │   ├── 090_0027.jpg
│   │   ├── 090_0028.jpg
│   │   ├── 090_0029.jpg
│   │   ├── 090_0030.jpg
│   │   ├── 090_0031.jpg
│   │   ├── 090_0032.jpg
│   │   ├── 090_0033.jpg
│   │   ├── 090_0034.jpg
│   │   ├── 090_0035.jpg
│   │   ├── 090_0036.jpg
│   │   ├── 090_0037.jpg
│   │   ├── 090_0038.jpg
│   │   ├── 090_0039.jpg
│   │   ├── 090_0040.jpg
│   │   ├── 090_0041.jpg
│   │   ├── 090_0042.jpg
│   │   ├── 090_0043.jpg
│   │   ├── 090_0044.jpg
│   │   ├── 090_0045.jpg
│   │   ├── 090_0046.jpg
│   │   ├── 090_0047.jpg
│   │   ├── 090_0048.jpg
│   │   ├── 090_0049.jpg
│   │   ├── 090_0050.jpg
│   │   ├── 090_0051.jpg
│   │   ├── 090_0052.jpg
│   │   ├── 090_0053.jpg
│   │   ├── 090_0054.jpg
│   │   ├── 090_0055.jpg
│   │   ├── 090_0056.jpg
│   │   ├── 090_0057.jpg
│   │   ├── 090_0058.jpg
│   │   ├── 090_0059.jpg
│   │   └── 090_0060.jpg
│   ├── llama
│   │   ├── 134_0001.jpg
│   │   ├── 134_0002.jpg
│   │   ├── 134_0003.jpg
│   │   ├── 134_0004.jpg
│   │   ├── 134_0005.jpg
│   │   ├── 134_0006.jpg
│   │   ├── 134_0007.jpg
│   │   ├── 134_0008.jpg
│   │   ├── 134_0009.jpg
│   │   ├── 134_0010.jpg
│   │   ├── 134_0011.jpg
│   │   ├── 134_0012.jpg
│   │   ├── 134_0013.jpg
│   │   ├── 134_0014.jpg
│   │   ├── 134_0015.jpg
│   │   ├── 134_0016.jpg
│   │   ├── 134_0017.jpg
│   │   ├── 134_0018.jpg
│   │   ├── 134_0019.jpg
│   │   ├── 134_0020.jpg
│   │   ├── 134_0021.jpg
│   │   ├── 134_0022.jpg
│   │   ├── 134_0023.jpg
│   │   ├── 134_0024.jpg
│   │   ├── 134_0025.jpg
│   │   ├── 134_0026.jpg
│   │   ├── 134_0027.jpg
│   │   ├── 134_0028.jpg
│   │   ├── 134_0029.jpg
│   │   ├── 134_0030.jpg
│   │   ├── 134_0031.jpg
│   │   ├── 134_0032.jpg
│   │   ├── 134_0033.jpg
│   │   ├── 134_0034.jpg
│   │   ├── 134_0035.jpg
│   │   ├── 134_0036.jpg
│   │   ├── 134_0037.jpg
│   │   ├── 134_0038.jpg
│   │   ├── 134_0039.jpg
│   │   ├── 134_0040.jpg
│   │   ├── 134_0041.jpg
│   │   ├── 134_0042.jpg
│   │   ├── 134_0043.jpg
│   │   ├── 134_0044.jpg
│   │   ├── 134_0045.jpg
│   │   ├── 134_0046.jpg
│   │   ├── 134_0047.jpg
│   │   ├── 134_0048.jpg
│   │   ├── 134_0049.jpg
│   │   ├── 134_0050.jpg
│   │   ├── 134_0051.jpg
│   │   ├── 134_0052.jpg
│   │   ├── 134_0053.jpg
│   │   ├── 134_0054.jpg
│   │   ├── 134_0055.jpg
│   │   ├── 134_0056.jpg
│   │   ├── 134_0057.jpg
│   │   ├── 134_0058.jpg
│   │   ├── 134_0059.jpg
│   │   └── 134_0060.jpg
│   ├── ostrich
│   │   ├── 151_0001.jpg
│   │   ├── 151_0002.jpg
│   │   ├── 151_0003.jpg
│   │   ├── 151_0004.jpg
│   │   ├── 151_0005.jpg
│   │   ├── 151_0006.jpg
│   │   ├── 151_0007.jpg
│   │   ├── 151_0008.jpg
│   │   ├── 151_0009.jpg
│   │   ├── 151_0010.jpg
│   │   ├── 151_0011.jpg
│   │   ├── 151_0012.jpg
│   │   ├── 151_0013.jpg
│   │   ├── 151_0014.jpg
│   │   ├── 151_0015.jpg
│   │   ├── 151_0016.jpg
│   │   ├── 151_0017.jpg
│   │   ├── 151_0018.jpg
│   │   ├── 151_0019.jpg
│   │   ├── 151_0020.jpg
│   │   ├── 151_0021.jpg
│   │   ├── 151_0022.jpg
│   │   ├── 151_0023.jpg
│   │   ├── 151_0024.jpg
│   │   ├── 151_0025.jpg
│   │   ├── 151_0026.jpg
│   │   ├── 151_0027.jpg
│   │   ├── 151_0028.jpg
│   │   ├── 151_0029.jpg
│   │   ├── 151_0030.jpg
│   │   ├── 151_0031.jpg
│   │   ├── 151_0032.jpg
│   │   ├── 151_0033.jpg
│   │   ├── 151_0034.jpg
│   │   ├── 151_0035.jpg
│   │   ├── 151_0036.jpg
│   │   ├── 151_0037.jpg
│   │   ├── 151_0038.jpg
│   │   ├── 151_0039.jpg
│   │   ├── 151_0040.jpg
│   │   ├── 151_0041.jpg
│   │   ├── 151_0042.jpg
│   │   ├── 151_0043.jpg
│   │   ├── 151_0044.jpg
│   │   ├── 151_0045.jpg
│   │   ├── 151_0046.jpg
│   │   ├── 151_0047.jpg
│   │   ├── 151_0048.jpg
│   │   ├── 151_0049.jpg
│   │   ├── 151_0050.jpg
│   │   ├── 151_0051.jpg
│   │   ├── 151_0052.jpg
│   │   ├── 151_0053.jpg
│   │   ├── 151_0054.jpg
│   │   ├── 151_0055.jpg
│   │   ├── 151_0056.jpg
│   │   ├── 151_0057.jpg
│   │   ├── 151_0058.jpg
│   │   ├── 151_0059.jpg
│   │   └── 151_0060.jpg
│   ├── porcupine
│   │   ├── 164_0001.jpg
│   │   ├── 164_0002.jpg
│   │   ├── 164_0003.jpg
│   │   ├── 164_0004.jpg
│   │   ├── 164_0005.jpg
│   │   ├── 164_0006.jpg
│   │   ├── 164_0007.jpg
│   │   ├── 164_0008.jpg
│   │   ├── 164_0009.jpg
│   │   ├── 164_0010.jpg
│   │   ├── 164_0011.jpg
│   │   ├── 164_0012.jpg
│   │   ├── 164_0013.jpg
│   │   ├── 164_0014.jpg
│   │   ├── 164_0015.jpg
│   │   ├── 164_0016.jpg
│   │   ├── 164_0017.jpg
│   │   ├── 164_0018.jpg
│   │   ├── 164_0019.jpg
│   │   ├── 164_0020.jpg
│   │   ├── 164_0021.jpg
│   │   ├── 164_0022.jpg
│   │   ├── 164_0023.jpg
│   │   ├── 164_0024.jpg
│   │   ├── 164_0025.jpg
│   │   ├── 164_0026.jpg
│   │   ├── 164_0027.jpg
│   │   ├── 164_0028.jpg
│   │   ├── 164_0029.jpg
│   │   ├── 164_0030.jpg
│   │   ├── 164_0031.jpg
│   │   ├── 164_0032.jpg
│   │   ├── 164_0033.jpg
│   │   ├── 164_0034.jpg
│   │   ├── 164_0035.jpg
│   │   ├── 164_0036.jpg
│   │   ├── 164_0037.jpg
│   │   ├── 164_0038.jpg
│   │   ├── 164_0039.jpg
│   │   ├── 164_0040.jpg
│   │   ├── 164_0041.jpg
│   │   ├── 164_0042.jpg
│   │   ├── 164_0043.jpg
│   │   ├── 164_0044.jpg
│   │   ├── 164_0045.jpg
│   │   ├── 164_0046.jpg
│   │   ├── 164_0047.jpg
│   │   ├── 164_0048.jpg
│   │   ├── 164_0049.jpg
│   │   ├── 164_0050.jpg
│   │   ├── 164_0051.jpg
│   │   ├── 164_0052.jpg
│   │   ├── 164_0053.jpg
│   │   ├── 164_0054.jpg
│   │   ├── 164_0055.jpg
│   │   ├── 164_0056.jpg
│   │   ├── 164_0057.jpg
│   │   ├── 164_0058.jpg
│   │   ├── 164_0059.jpg
│   │   └── 164_0060.jpg
│   ├── skunk
│   │   ├── 186_0001.jpg
│   │   ├── 186_0002.jpg
│   │   ├── 186_0003.jpg
│   │   ├── 186_0004.jpg
│   │   ├── 186_0005.jpg
│   │   ├── 186_0006.jpg
│   │   ├── 186_0007.jpg
│   │   ├── 186_0008.jpg
│   │   ├── 186_0009.jpg
│   │   ├── 186_0010.jpg
│   │   ├── 186_0011.jpg
│   │   ├── 186_0012.jpg
│   │   ├── 186_0013.jpg
│   │   ├── 186_0014.jpg
│   │   ├── 186_0015.jpg
│   │   ├── 186_0016.jpg
│   │   ├── 186_0017.jpg
│   │   ├── 186_0018.jpg
│   │   ├── 186_0019.jpg
│   │   ├── 186_0020.jpg
│   │   ├── 186_0021.jpg
│   │   ├── 186_0022.jpg
│   │   ├── 186_0023.jpg
│   │   ├── 186_0024.jpg
│   │   ├── 186_0025.jpg
│   │   ├── 186_0026.jpg
│   │   ├── 186_0027.jpg
│   │   ├── 186_0028.jpg
│   │   ├── 186_0029.jpg
│   │   ├── 186_0030.jpg
│   │   ├── 186_0031.jpg
│   │   ├── 186_0032.jpg
│   │   ├── 186_0033.jpg
│   │   ├── 186_0034.jpg
│   │   ├── 186_0035.jpg
│   │   ├── 186_0036.jpg
│   │   ├── 186_0037.jpg
│   │   ├── 186_0038.jpg
│   │   ├── 186_0039.jpg
│   │   ├── 186_0040.jpg
│   │   ├── 186_0041.jpg
│   │   ├── 186_0042.jpg
│   │   ├── 186_0043.jpg
│   │   ├── 186_0044.jpg
│   │   ├── 186_0045.jpg
│   │   ├── 186_0046.jpg
│   │   ├── 186_0047.jpg
│   │   ├── 186_0048.jpg
│   │   ├── 186_0049.jpg
│   │   ├── 186_0050.jpg
│   │   ├── 186_0051.jpg
│   │   ├── 186_0052.jpg
│   │   ├── 186_0053.jpg
│   │   ├── 186_0054.jpg
│   │   ├── 186_0055.jpg
│   │   ├── 186_0056.jpg
│   │   ├── 186_0057.jpg
│   │   ├── 186_0058.jpg
│   │   ├── 186_0059.jpg
│   │   └── 186_0060.jpg
│   ├── triceratops
│   │   ├── 228_0001.jpg
│   │   ├── 228_0002.jpg
│   │   ├── 228_0003.jpg
│   │   ├── 228_0004.jpg
│   │   ├── 228_0005.jpg
│   │   ├── 228_0006.jpg
│   │   ├── 228_0007.jpg
│   │   ├── 228_0008.jpg
│   │   ├── 228_0009.jpg
│   │   ├── 228_0010.jpg
│   │   ├── 228_0011.jpg
│   │   ├── 228_0012.jpg
│   │   ├── 228_0013.jpg
│   │   ├── 228_0014.jpg
│   │   ├── 228_0015.jpg
│   │   ├── 228_0016.jpg
│   │   ├── 228_0017.jpg
│   │   ├── 228_0018.jpg
│   │   ├── 228_0019.jpg
│   │   ├── 228_0020.jpg
│   │   ├── 228_0021.jpg
│   │   ├── 228_0022.jpg
│   │   ├── 228_0023.jpg
│   │   ├── 228_0024.jpg
│   │   ├── 228_0025.jpg
│   │   ├── 228_0026.jpg
│   │   ├── 228_0027.jpg
│   │   ├── 228_0028.jpg
│   │   ├── 228_0029.jpg
│   │   ├── 228_0030.jpg
│   │   ├── 228_0031.jpg
│   │   ├── 228_0032.jpg
│   │   ├── 228_0033.jpg
│   │   ├── 228_0034.jpg
│   │   ├── 228_0035.jpg
│   │   ├── 228_0036.jpg
│   │   ├── 228_0037.jpg
│   │   ├── 228_0038.jpg
│   │   ├── 228_0039.jpg
│   │   ├── 228_0040.jpg
│   │   ├── 228_0041.jpg
│   │   ├── 228_0042.jpg
│   │   ├── 228_0043.jpg
│   │   ├── 228_0044.jpg
│   │   ├── 228_0045.jpg
│   │   ├── 228_0046.jpg
│   │   ├── 228_0047.jpg
│   │   ├── 228_0048.jpg
│   │   ├── 228_0049.jpg
│   │   ├── 228_0050.jpg
│   │   ├── 228_0051.jpg
│   │   ├── 228_0052.jpg
│   │   ├── 228_0053.jpg
│   │   ├── 228_0054.jpg
│   │   ├── 228_0055.jpg
│   │   ├── 228_0056.jpg
│   │   ├── 228_0057.jpg
│   │   ├── 228_0058.jpg
│   │   ├── 228_0059.jpg
│   │   └── 228_0060.jpg
│   └── zebra
│       ├── 250_0001.jpg
│       ├── 250_0002.jpg
│       ├── 250_0003.jpg
│       ├── 250_0004.jpg
│       ├── 250_0005.jpg
│       ├── 250_0006.jpg
│       ├── 250_0007.jpg
│       ├── 250_0008.jpg
│       ├── 250_0009.jpg
│       ├── 250_0010.jpg
│       ├── 250_0011.jpg
│       ├── 250_0012.jpg
│       ├── 250_0013.jpg
│       ├── 250_0014.jpg
│       ├── 250_0015.jpg
│       ├── 250_0016.jpg
│       ├── 250_0017.jpg
│       ├── 250_0018.jpg
│       ├── 250_0019.jpg
│       ├── 250_0020.jpg
│       ├── 250_0021.jpg
│       ├── 250_0022.jpg
│       ├── 250_0023.jpg
│       ├── 250_0024.jpg
│       ├── 250_0025.jpg
│       ├── 250_0026.jpg
│       ├── 250_0027.jpg
│       ├── 250_0028.jpg
│       ├── 250_0029.jpg
│       ├── 250_0030.jpg
│       ├── 250_0031.jpg
│       ├── 250_0032.jpg
│       ├── 250_0033.jpg
│       ├── 250_0034.jpg
│       ├── 250_0035.jpg
│       ├── 250_0036.jpg
│       ├── 250_0037.jpg
│       ├── 250_0038.jpg
│       ├── 250_0039.jpg
│       ├── 250_0040.jpg
│       ├── 250_0041.jpg
│       ├── 250_0042.jpg
│       ├── 250_0043.jpg
│       ├── 250_0044.jpg
│       ├── 250_0045.jpg
│       ├── 250_0046.jpg
│       ├── 250_0047.jpg
│       ├── 250_0048.jpg
│       ├── 250_0049.jpg
│       ├── 250_0050.jpg
│       ├── 250_0051.jpg
│       ├── 250_0052.jpg
│       ├── 250_0053.jpg
│       ├── 250_0054.jpg
│       ├── 250_0055.jpg
│       ├── 250_0056.jpg
│       ├── 250_0057.jpg
│       ├── 250_0058.jpg
│       ├── 250_0059.jpg
│       └── 250_0060.jpg
└── valid
    ├── bear
    │   ├── 009_0061.jpg
    │   ├── 009_0062.jpg
    │   ├── 009_0063.jpg
    │   ├── 009_0064.jpg
    │   ├── 009_0065.jpg
    │   ├── 009_0066.jpg
    │   ├── 009_0067.jpg
    │   ├── 009_0068.jpg
    │   ├── 009_0069.jpg
    │   └── 009_0070.jpg
    ├── chimp
    │   ├── 038_0061.jpg
    │   ├── 038_0062.jpg
    │   ├── 038_0063.jpg
    │   ├── 038_0064.jpg
    │   ├── 038_0065.jpg
    │   ├── 038_0066.jpg
    │   ├── 038_0067.jpg
    │   ├── 038_0068.jpg
    │   ├── 038_0069.jpg
    │   └── 038_0070.jpg
    ├── giraffe
    │   ├── 084_0061.jpg
    │   ├── 084_0062.jpg
    │   ├── 084_0063.jpg
    │   ├── 084_0064.jpg
    │   ├── 084_0065.jpg
    │   ├── 084_0066.jpg
    │   ├── 084_0067.jpg
    │   ├── 084_0068.jpg
    │   ├── 084_0069.jpg
    │   └── 084_0070.jpg
    ├── gorilla
    │   ├── 090_0061.jpg
    │   ├── 090_0062.jpg
    │   ├── 090_0063.jpg
    │   ├── 090_0064.jpg
    │   ├── 090_0065.jpg
    │   ├── 090_0066.jpg
    │   ├── 090_0067.jpg
    │   ├── 090_0068.jpg
    │   ├── 090_0069.jpg
    │   └── 090_0070.jpg
    ├── llama
    │   ├── 134_0061.jpg
    │   ├── 134_0062.jpg
    │   ├── 134_0063.jpg
    │   ├── 134_0064.jpg
    │   ├── 134_0065.jpg
    │   ├── 134_0066.jpg
    │   ├── 134_0067.jpg
    │   ├── 134_0068.jpg
    │   ├── 134_0069.jpg
    │   └── 134_0070.jpg
    ├── ostrich
    │   ├── 151_0061.jpg
    │   ├── 151_0062.jpg
    │   ├── 151_0063.jpg
    │   ├── 151_0064.jpg
    │   ├── 151_0065.jpg
    │   ├── 151_0066.jpg
    │   ├── 151_0067.jpg
    │   ├── 151_0068.jpg
    │   ├── 151_0069.jpg
    │   └── 151_0070.jpg
    ├── porcupine
    │   ├── 164_0061.jpg
    │   ├── 164_0062.jpg
    │   ├── 164_0063.jpg
    │   ├── 164_0064.jpg
    │   ├── 164_0065.jpg
    │   ├── 164_0066.jpg
    │   ├── 164_0067.jpg
    │   ├── 164_0068.jpg
    │   ├── 164_0069.jpg
    │   └── 164_0070.jpg
    ├── skunk
    │   ├── 186_0061.jpg
    │   ├── 186_0062.jpg
    │   ├── 186_0063.jpg
    │   ├── 186_0064.jpg
    │   ├── 186_0065.jpg
    │   ├── 186_0066.jpg
    │   ├── 186_0067.jpg
    │   ├── 186_0068.jpg
    │   ├── 186_0069.jpg
    │   └── 186_0070.jpg
    ├── triceratops
    │   ├── 228_0061.jpg
    │   ├── 228_0062.jpg
    │   ├── 228_0063.jpg
    │   ├── 228_0064.jpg
    │   ├── 228_0065.jpg
    │   ├── 228_0066.jpg
    │   ├── 228_0067.jpg
    │   ├── 228_0068.jpg
    │   ├── 228_0069.jpg
    │   └── 228_0070.jpg
    └── zebra
        ├── 250_0061.jpg
        ├── 250_0062.jpg
        ├── 250_0063.jpg
        ├── 250_0064.jpg
        ├── 250_0065.jpg
        ├── 250_0066.jpg
        ├── 250_0067.jpg
        ├── 250_0068.jpg
        ├── 250_0069.jpg
        └── 250_0070.jpg

2、数据扩充

可用的训练集中的图像可以通过多种方式进行修改,以在训练过程中包含更多的变种图像,从而使训练后的模型更具通用性,也就是防止过拟合,并在不同类型的测试数据上表现良好。此外,输入数据可以有各种大小。它们需要标准化为一个固定的大小和格式,然后组织成批量数据一起用于训练。 每个输入图像首先通过若干变换。我们试图通过在变换中引入一些随机性来使图像发生变化。在每个轮次,每个图像都应用一组变换。当我们重复训练多个轮次时,模型会看到更多的输入图像的变化,每个训练轮次中,转换都有一个新的随机变化。这导致数据增强,然后模型变得更加通用。 下面我们看到三角龙(Triceratops)图像的转换版本的例子。

Data Augmentation

让我们解析一下用于数据增强扩张的转换。

RandomResizedCrop以随机大小(在原始大小的0.8到1.0的尺度范围内,在默认范围为0.75到1.33的随机纵横比范围内)对输入图像进行裁剪。然后将图像尺寸调整为256×256。

RandomRotation以随机选择的角度旋转图像(在-15到15度之间)。

随机进行图像水平翻转,默认概率为50%。

CenterCrop从中心扣出一个224×224图像。

ToTensor 将PIL图像的值(0-255)转换为浮点张量,并通过除以255将它们归一化为0-1。

正则化采用3通道张量,并通过通道的输入均值和标准差对每个通道进行正则化。均值和标准差向量作为3个元素向量输入。张量中的每个通道正则化化为T=(T-均值)/(标准差) 。所有上述转换都使用Compose链接在一起。

import torch, torchvision
from torchvision import datasets, models, transforms
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
import time
from torchsummary import summary
import numpy as np
import matplotlib.pyplot as plt
import os
from PIL import Image

# Applying Transforms to the Data
image_transforms = { 
    'train': transforms.Compose([
        transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
        transforms.RandomRotation(degrees=15),
        transforms.RandomHorizontalFlip(),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ]),
    'valid': transforms.Compose([
        transforms.Resize(size=256),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ]),
    'test': transforms.Compose([
        transforms.Resize(size=256),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ])
}

请注意,对于验证和测试数据,我们不进行RandomResizedCropRandomRotation 和 RandomHorizontalFlip转换。我们只需将验证图像和测试图像调整到256×256,并裁剪出中心224×224部分,以便能够使模型正确使用它们。然后将图像转换为张量,并使用ImageNet中所有图像的均值和标准差来进行正则化。

3、数据加载

接下来,让我们看看如何使用上述定义的转换并加载用于训练的数据。

# Load the Data

# Set train and valid directory paths

dataset = 'caltech_10'

train_directory = os.path.join(dataset, 'train')
valid_directory = os.path.join(dataset, 'valid')
test_directory = os.path.join(dataset, 'test')

# Batch size
bs = 32

# Number of classes
num_classes = len(os.listdir(valid_directory))  #10
print(num_classes)

# Load Data from folders
data = {
    'train': datasets.ImageFolder(root=train_directory, transform=image_transforms['train']),
    'valid': datasets.ImageFolder(root=valid_directory, transform=image_transforms['valid']),
    'test': datasets.ImageFolder(root=test_directory, transform=image_transforms['test'])
}

# Get a mapping of the indices to the class names, in order to see the output classes of the test images.
idx_to_class = {v: k for k, v in data['train'].class_to_idx.items()}
print(idx_to_class)

# Size of Data, to be used for calculating Average Loss and Accuracy
train_data_size = len(data['train'])
valid_data_size = len(data['valid'])
test_data_size = len(data['test'])

# Create iterators for the Data loaded using DataLoader module
train_data_loader = DataLoader(data['train'], batch_size=bs, shuffle=True)
valid_data_loader = DataLoader(data['valid'], batch_size=bs, shuffle=True)
test_data_loader = DataLoader(data['test'], batch_size=bs, shuffle=True)

我们首先设置训练、验证和测试数据目录,以及批处理大小(32)。然后我们使用DataLoader加载它们。请注意,我们使用DataLoader加载图像时会进行前面指定的图像转换。数据的顺序也被打乱重新排序。torchvision.transforms包和DataLoader是非常重要的PyTorch功能,使数据增强扩张和加载过程非常容易。

4、迁移学习

收集感兴趣领域的图像并从头训练分类器是非常困难和耗时的。因此,我们使用预先训练的模型作为我们的基础,并改变最后几层,以便我们可以根据想要的类对图像进行分类。即使使用一个小的数据集,我们也能获得一个良好的模型。因为基本的图像特征已经在预先训练的模型被获取了,而且是从一个更大的数据集中获取的,如ImageNet数据集。

Transfer Learning for Image Classification

正如我们在上面的图像中所看到的,预先训练的模型的内层保持不变,只有最后几层被改变以适应我们的类数。在本工作中,我们使用预先训练的ResNet50模型。

# Load pretrained ResNet50 Model
resnet50 = models.resnet50(pretrained=True)
# resnet50 = resnet50.to('cuda:0')

ResNet50是在准确性和推理时间之间有很好的权衡的一种模型。当模型在Py Torch中加载时,其所有参数的“requid_grad”字段默认设置为true。这意味着参数值的每一个变化都将被存储在用于训练的反向传播图中。这增加了内存需求。因此,由于我们预先训练的模型中的大多数参数已经训练好了,我们将require_grad字段重置为false。

# Freeze model parameters
for param in resnet50.parameters():
    param.requires_grad = False

然后,我们将ResNet50模型的最后一层替换为一组小的顺序层。对ResNet50的最后一个完全连接层的输入被馈送到具有256个输出的线性层,然后这些输出被馈入ReLU激活函数和Dropout层。然后是一个256×10线性层,它有10个输出对应于我们的CalTech子集中的10个类。NLLLoss和softmax往往配合使用,参考:https://blog.csdn.net/jasonleesjtu/article/details/89097758

# Change the final layer of ResNet50 Model for Transfer Learning
fc_inputs = resnet50.fc.in_features
 
resnet50.fc = nn.Sequential(
    nn.Linear(fc_inputs, 256),
    nn.ReLU(),
    nn.Dropout(0.4),
    nn.Linear(256, 10), 
    nn.LogSoftmax(dim=1) # For using NLLLoss()
# Convert model to be used on GPU
# resnet50 = resnet50.to('cuda:0')

如果你的实验环境支持GPU,可以将代码中有关gpu的部分去掉,便可以在gpu上进行训练。

接下来,我们定义了损失函数和用于训练的优化器。PyTorch提供多种损失函数。我们使用负对数似然函数,因为它可以用来分类多个类。PyTorch还支持多个优化器。我们用Adam优化器。Adam是最受欢迎的优化器之一,因为它可以单独调整每个参数的学习速率。

# Define Optimizer and Loss Function
loss_func = nn.NLLLoss()
optimizer = optim.Adam(resnet50.parameters())

5、训练

训练过程按轮次进行,重复进行指定的次数,每张图像在一个轮次中处理一次。训练数据加载器批量加载数据,本例中,我们指定批次大小为32,这意味着每个批次最多可以有32个图像。通常,一个轮次包含多个批次。 对于每一批,输入图像数据通过模型,即向前传递,以获得输出。然后使用所提供的损失函数使用真实类型和输出结果类型来计算损失。参考计算出的损失,利用后向函数可训练参数的梯度。请注意,在转移学习中,我们只需要计算一小组参数的梯度,这些参数属于模型末尾的几个新添加的层。对模型进行汇总,可以揭示实际参数个数和可训练参数个数,正如我们在下面看到的,我们现在只需要训练大约十分之一的模型参数。

Parameter count summary

梯度计算是使用自动梯度和反向传播,在图中微分使用链式规则。PyTorch在向后传播中积累了所有的梯度。因此,在训练循环开始时,必须将它们清零。这是使用优化器的zero_grad函数实现的。最后,在向后传递中计算梯度后,使用优化器的step函数更新参数。 计算每个批次的总损失和准确度,然后对所有批次进行平均,得到整个轮次的损失和准确度值。

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def train_and_validate(model, loss_criterion, optimizer, epochs=25):
    '''
    Function to train and validate
    Parameters
        :param model: Model to train and validate
        :param loss_criterion: Loss Criterion to minimize
        :param optimizer: Optimizer for computing gradients
        :param epochs: Number of epochs (default=25)
  
    Returns
        model: Trained Model with best validation accuracy
        history: (dict object): Having training loss, accuracy and validation loss, accuracy
    '''
    
    start = time.time()
    history = []
    best_acc = 0.0

    for epoch in range(epochs):
        epoch_start = time.time()
        print("Epoch: {}/{}".format(epoch+1, epochs))
        
        # Set to training mode
        model.train()
        
        # Loss and Accuracy within the epoch
        train_loss = 0.0
        train_acc = 0.0
        
        valid_loss = 0.0
        valid_acc = 0.0
        
        for i, (inputs, labels) in enumerate(train_data_loader):

            inputs = inputs.to(device)
            labels = labels.to(device)
            
            # Clean existing gradients
            optimizer.zero_grad()
            
            # Forward pass - compute outputs on input data using the model
            outputs = model(inputs)
            
            # Compute loss
            loss = loss_criterion(outputs, labels)
            
            # Backpropagate the gradients
            loss.backward()
            
            # Update the parameters
            optimizer.step()
            
            # Compute the total loss for the batch and add it to train_loss
            train_loss += loss.item() * inputs.size(0)
            
            # Compute the accuracy
            ret, predictions = torch.max(outputs.data, 1)
            correct_counts = predictions.eq(labels.data.view_as(predictions))
            
            # Convert correct_counts to float and then compute the mean
            acc = torch.mean(correct_counts.type(torch.FloatTensor))
            
            # Compute total accuracy in the whole batch and add to train_acc
            train_acc += acc.item() * inputs.size(0)
            
            #print("Batch number: {:03d}, Training: Loss: {:.4f}, Accuracy: {:.4f}".format(i, loss.item(), acc.item()))

            
        # Validation - No gradient tracking needed
        with torch.no_grad():

            # Set to evaluation mode
            model.eval()

            # Validation loop
            for j, (inputs, labels) in enumerate(valid_data_loader):
                inputs = inputs.to(device)
                labels = labels.to(device)

                # Forward pass - compute outputs on input data using the model
                outputs = model(inputs)

                # Compute loss
                loss = loss_criterion(outputs, labels)

                # Compute the total loss for the batch and add it to valid_loss
                valid_loss += loss.item() * inputs.size(0)

                # Calculate validation accuracy
                ret, predictions = torch.max(outputs.data, 1)
                correct_counts = predictions.eq(labels.data.view_as(predictions))

                # Convert correct_counts to float and then compute the mean
                acc = torch.mean(correct_counts.type(torch.FloatTensor))

                # Compute total accuracy in the whole batch and add to valid_acc
                valid_acc += acc.item() * inputs.size(0)

                #print("Validation Batch number: {:03d}, Validation: Loss: {:.4f}, Accuracy: {:.4f}".format(j, loss.item(), acc.item()))
            
        # Find average training loss and training accuracy
        avg_train_loss = train_loss/train_data_size 
        avg_train_acc = train_acc/train_data_size

        # Find average training loss and training accuracy
        avg_valid_loss = valid_loss/valid_data_size 
        avg_valid_acc = valid_acc/valid_data_size

        history.append([avg_train_loss, avg_valid_loss, avg_train_acc, avg_valid_acc])
                
        epoch_end = time.time()
    
        print("Epoch : {:03d}, Training: Loss: {:.4f}, Accuracy: {:.4f}%, \n\t\tValidation : Loss : {:.4f}, Accuracy: {:.4f}%, Time: {:.4f}s".format(epoch, avg_train_loss, avg_train_acc*100, avg_valid_loss, avg_valid_acc*100, epoch_end-epoch_start))
        
        # Save if the model has best accuracy till now
        torch.save(model, dataset+'_model_'+str(epoch)+'.pt')
            
    return model, history
# Print the model to be trained
# summary(resnet50, input_size=(3, 224, 224), batch_size=bs, device='cuda')

# Train the model for 30 epochs
num_epochs = 30
trained_model, history = train_and_validate(resnet50, loss_func, optimizer, num_epochs)

torch.save(history, dataset+'_history.pt')

train_loss += loss.item() * inputs.size(0)中,iputs.size(0)返回32,即每批次有32张图片,最后一批次可能不到32张。

ret, predictions = torch.max(outputs.data, 1)
correct_counts = predictions.eq(labels.data.view_as(predictions)) 中,predictions是一维列表,顺序包含每张图片的预测类型标号,correct_counts为一维列表,只包含0或者1,0代表预测正确,1代表预测错误。

history.append([avg_train_loss, avg_valid_loss, avg_train_acc, avg_valid_acc]),history为二维数组,包含每轮次的训练统计结果,为画图标准备数据。

本例的实验环境为ubuntu18.04,使用了i5中的4核,没有使用gpu。输出结果如下:

Epoch: 1/30
Epoch : 000, Training: Loss: 1.5882, Accuracy: 48.5000%, 
		Validation : Loss : 0.6234, Accuracy: 86.0000%, Time: 496.7489s
Epoch: 2/30
Epoch : 001, Training: Loss: 0.6274, Accuracy: 84.8333%, 
		Validation : Loss : 0.2899, Accuracy: 96.0000%, Time: 143.8269s
Epoch: 3/30
Epoch : 002, Training: Loss: 0.3289, Accuracy: 93.6667%, 
		Validation : Loss : 0.2095, Accuracy: 97.0000%, Time: 114.8437s
Epoch: 4/30
Epoch : 003, Training: Loss: 0.2767, Accuracy: 92.3333%, 
		Validation : Loss : 0.2141, Accuracy: 94.0000%, Time: 115.5789s
Epoch: 5/30
Epoch : 004, Training: Loss: 0.2121, Accuracy: 94.0000%, 
		Validation : Loss : 0.1396, Accuracy: 96.0000%, Time: 104.1761s
Epoch: 6/30
Epoch : 005, Training: Loss: 0.2227, Accuracy: 93.6667%, 
		Validation : Loss : 0.1570, Accuracy: 96.0000%, Time: 104.7612s
Epoch: 7/30
Epoch : 006, Training: Loss: 0.1922, Accuracy: 93.8333%, 
		Validation : Loss : 0.1750, Accuracy: 96.0000%, Time: 116.5069s
Epoch: 8/30
Epoch : 007, Training: Loss: 0.1541, Accuracy: 95.8333%, 
		Validation : Loss : 0.1555, Accuracy: 96.0000%, Time: 103.5355s
Epoch: 9/30
Epoch : 008, Training: Loss: 0.1387, Accuracy: 95.8333%, 
		Validation : Loss : 0.1756, Accuracy: 94.0000%, Time: 106.4436s
Epoch: 10/30
Epoch : 009, Training: Loss: 0.1400, Accuracy: 96.6667%, 
		Validation : Loss : 0.1248, Accuracy: 97.0000%, Time: 102.8343s
Epoch: 11/30
Epoch : 010, Training: Loss: 0.1331, Accuracy: 96.1667%, 
		Validation : Loss : 0.1316, Accuracy: 97.0000%, Time: 102.7859s
Epoch: 12/30
Epoch : 011, Training: Loss: 0.0964, Accuracy: 97.1667%, 
		Validation : Loss : 0.1461, Accuracy: 96.0000%, Time: 101.7347s
Epoch: 13/30
Epoch : 012, Training: Loss: 0.0850, Accuracy: 98.0000%, 
		Validation : Loss : 0.1296, Accuracy: 97.0000%, Time: 103.7292s
Epoch: 14/30
Epoch : 013, Training: Loss: 0.1283, Accuracy: 95.1667%, 
		Validation : Loss : 0.1328, Accuracy: 96.0000%, Time: 101.8993s
Epoch: 15/30
Epoch : 014, Training: Loss: 0.1033, Accuracy: 96.8333%, 
		Validation : Loss : 0.2060, Accuracy: 93.0000%, Time: 101.6368s
Epoch: 16/30
Epoch : 015, Training: Loss: 0.0890, Accuracy: 97.6667%, 
		Validation : Loss : 0.1072, Accuracy: 98.0000%, Time: 101.3270s
Epoch: 17/30
Epoch : 016, Training: Loss: 0.0949, Accuracy: 97.3333%, 
		Validation : Loss : 0.1981, Accuracy: 92.0000%, Time: 102.3606s
Epoch: 18/30
Epoch : 017, Training: Loss: 0.1004, Accuracy: 96.1667%, 
		Validation : Loss : 0.1445, Accuracy: 93.0000%, Time: 102.5671s
Epoch: 19/30
Epoch : 018, Training: Loss: 0.1029, Accuracy: 96.8333%, 
		Validation : Loss : 0.1777, Accuracy: 93.0000%, Time: 102.3143s
Epoch: 20/30
Epoch : 019, Training: Loss: 0.0813, Accuracy: 97.1667%, 
		Validation : Loss : 0.1403, Accuracy: 95.0000%, Time: 102.7968s
Epoch: 21/30
Epoch : 020, Training: Loss: 0.0581, Accuracy: 98.5000%, 
		Validation : Loss : 0.1375, Accuracy: 95.0000%, Time: 101.5044s
Epoch: 22/30
Epoch : 021, Training: Loss: 0.0636, Accuracy: 98.3333%, 
		Validation : Loss : 0.1043, Accuracy: 96.0000%, Time: 101.3938s
Epoch: 23/30
Epoch : 022, Training: Loss: 0.0822, Accuracy: 97.5000%, 
		Validation : Loss : 0.1587, Accuracy: 95.0000%, Time: 102.4387s
Epoch: 24/30
Epoch : 023, Training: Loss: 0.0650, Accuracy: 97.6667%, 
		Validation : Loss : 0.1398, Accuracy: 95.0000%, Time: 100.7330s
Epoch: 25/30
Epoch : 024, Training: Loss: 0.0852, Accuracy: 97.0000%, 
		Validation : Loss : 0.1054, Accuracy: 96.0000%, Time: 101.2396s
Epoch: 26/30
Epoch : 025, Training: Loss: 0.0894, Accuracy: 97.3333%, 
		Validation : Loss : 0.1208, Accuracy: 97.0000%, Time: 101.9070s
Epoch: 27/30
Epoch : 026, Training: Loss: 0.0640, Accuracy: 98.0000%, 
		Validation : Loss : 0.1435, Accuracy: 96.0000%, Time: 101.8337s
Epoch: 28/30
Epoch : 027, Training: Loss: 0.0690, Accuracy: 97.3333%, 
		Validation : Loss : 0.1145, Accuracy: 97.0000%, Time: 101.6800s
Epoch: 29/30
Epoch : 028, Training: Loss: 0.0428, Accuracy: 98.8333%, 
		Validation : Loss : 0.1623, Accuracy: 94.0000%, Time: 111.7447s
Epoch: 30/30
Epoch : 029, Training: Loss: 0.0361, Accuracy: 99.3333%, 
		Validation : Loss : 0.1487, Accuracy: 96.0000%, Time: 102.9441s

6、 验证

随着训练的进行,该模型往往过度拟合数据,导致其在新的测试数据上的性能差。维护一个单独的验证集是很重要的,这样我们就可以在正确的点停止训练,并防止过度拟合。在每个轮次中,验证在训练循环之后立即进行。由于我们在验证过程中不需要任何梯度计算,所以它是在torch.no_grad()块中完成的。 对于每个验证批次,输入和标签被转移到GPU(如果Cuda可用,否则为CPU,本例中使用cpu,实际不发生转移)。输入经过前向传播,然后对批处理的损失和精度进行计算,循环结束时为整个轮次计算损失和精度。关于以下代码中用到的列表的分片和matplotlib绘图操作,请自行百度。

history = np.array(history)
plt.plot(history[:,0:2])
plt.legend(['Tr Loss', 'Val Loss'])
plt.xlabel('Epoch Number')
plt.ylabel('Loss')
plt.ylim(0,1)
plt.savefig(dataset+'_loss_curve.png')
plt.show()
plt.plot(history[:,2:4])
plt.legend(['Tr Accuracy', 'Val Accuracy'])
plt.xlabel('Epoch Number')
plt.ylabel('Accuracy')
plt.ylim(0,1)
plt.savefig(dataset+'_accuracy_curve.png')
plt.show()

Loss curve for training and validation

训练和验证的损失曲线

Accuracy curve for training and validation

训练和验证的精度曲线

正如我们在上面的图表中所看到的,对于这个数据集,验证和训练损失都很快就降低了。精度提高到0.9的水平也非常快。随着训练轮次的增加,训练损失进一步减少,但验证结果没有很大提高,出现了过度拟合。因此,我们从具有较高精度和较低损耗的时刻选择了模型。如果我们早点停下来,也更好,可以防止过度拟合训练数据。在我们的例子中,我们选择了具有96%的验证精度的第8批次结果。 提取停止训练也可以自动化。一旦损失低于给定的阈值,并且经过某些轮次的训练,验证精度没有提高,我们就可以停止。

7、推理

一旦我们有了模型,我们就可以对单个测试图像进行推理,或者在整个测试数据集上进行推理,以获得测试精度。测试集精度计算与验证代码相似,但在测试数据集上进行。让我们看看下面如何找到给定测试图像的输出类。 输入图像首先经过用于验证/测试数据的所有转换。然后将得到的张量转换为4维张量送给模型,输出不同类的对数概率。模型输出经进一步指数运算为我们提供了每个类的概率,然后我们选择概率最高的类作为我们的输出类。

def computeTestSetAccuracy(model, loss_criterion):
    '''
    Function to compute the accuracy on the test set
    Parameters
        :param model: Model to test
        :param loss_criterion: Loss Criterion to minimize
    '''

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

    test_acc = 0.0
    test_loss = 0.0

    # Validation - No gradient tracking needed
    with torch.no_grad():

        # Set to evaluation mode
        model.eval()

        # Validation loop
        for j, (inputs, labels) in enumerate(test_data_loader):
            inputs = inputs.to(device)
            labels = labels.to(device)

            # Forward pass - compute outputs on input data using the model
            outputs = model(inputs)

            # Compute loss
            loss = loss_criterion(outputs, labels)

            # Compute the total loss for the batch and add it to valid_loss
            test_loss += loss.item() * inputs.size(0)

            # Calculate validation accuracy
            ret, predictions = torch.max(outputs.data, 1)
            correct_counts = predictions.eq(labels.data.view_as(predictions))

            # Convert correct_counts to float and then compute the mean
            acc = torch.mean(correct_counts.type(torch.FloatTensor))

            # Compute total accuracy in the whole batch and add to valid_acc
            test_acc += acc.item() * inputs.size(0)

            print("Test Batch number: {:03d}, Test: Loss: {:.4f}, Accuracy: {:.4f}".format(j, loss.item(), acc.item()))

    # Find average test loss and test accuracy
    avg_test_loss = test_loss/test_data_size 
    avg_test_acc = test_acc/test_data_size

    print("Test accuracy : " + str(avg_test_acc))

结果如下:

Test Batch number: 000, Test: Loss: 0.1056, Accuracy: 0.9688
Test Batch number: 001, Test: Loss: 0.1419, Accuracy: 0.9375
Test Batch number: 002, Test: Loss: 0.1524, Accuracy: 0.9688
Test Batch number: 003, Test: Loss: 0.0064, Accuracy: 1.0000
Test Batch number: 004, Test: Loss: 0.1434, Accuracy: 0.9375
Test Batch number: 005, Test: Loss: 0.0590, Accuracy: 1.0000
Test Batch number: 006, Test: Loss: 0.3355, Accuracy: 0.8750
Test Batch number: 007, Test: Loss: 0.2506, Accuracy: 0.9375
Test Batch number: 008, Test: Loss: 0.2860, Accuracy: 0.9062
Test Batch number: 009, Test: Loss: 0.1077, Accuracy: 0.9375
Test Batch number: 010, Test: Loss: 0.1335, Accuracy: 0.9375
Test Batch number: 011, Test: Loss: 0.2154, Accuracy: 0.9688
Test Batch number: 012, Test: Loss: 0.3630, Accuracy: 0.8800
Test accuracy : 0.9437652808821289Test loss : 0.17376016186035642

 在409幅图像的测试集上达到了94.3%的精度。

接下来对每一张图片单独进行推理。

def predict(model, test_image_name):
    '''
    Function to predict the class of a single test image
    Parameters
        :param model: Model to test
        :param test_image_name: Test image

    '''
    
    transform = image_transforms['test']

    test_image = Image.open(test_image_name)
    plt.imshow(test_image)
    
    test_image_tensor = transform(test_image)

    if torch.cuda.is_available():
        test_image_tensor = test_image_tensor.view(1, 3, 224, 224).cuda()
    else:
        test_image_tensor = test_image_tensor.view(1, 3, 224, 224)
    
    with torch.no_grad():
        model.eval()
        # Model outputs log probabilities
        start = time.time()
        out = model(test_image_tensor)
        stop = time.time()
		print('cost time', stop-start)
        ps = torch.exp(out)
        topk, topclass = ps.topk(3, dim=1)
        for i in range(3):
            print("Predcition", i+1, ":", idx_to_class[topclass.cpu().numpy()[0][i]], ", Score: ", topk.cpu().numpy()[0][i])
model = torch.load('caltech_10_model_8.pt')
predict(model, 'caltech_10/test/zebra/250_0091.jpg')

结果如下:

>>> predict(model, 'caltech_10/test/zebra/250_0091.jpg')
cost time 0.5529406070709229
Predcition 1 : zebra , Score:  0.9980318
Predcition 2 : triceratops , Score:  0.0012739539
Predcition 3 : giraffe , Score:  0.00028341665

你可以多做一些实验,你会发现,概率最高的类通常是正确的。还要注意的是,概率第二高的类在外观上往往是最接近实际类的动物。

本篇实验参考连接:https://www.learnopencv.com/image-classification-using-transfer-learning-in-pytorch/

 

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值