本周文件交换精选

我们最好的用户提交

深度学习:10行MATLAB代码中的迁移学习

Avi格式的本周的精选是深度学习:10行MATLAB代码中的迁移学习MathWorks深度学习工具箱团队

你是否曾想尝试用深度学习来解决一个问题,但因为没有足够的数据或不习惯设计深度神经网络而未能完成?转移学习是一种非常实用的深度学习方法,它通过修改现有的深度网络(通常由专家训练)来处理数据。这篇文章详细解释了迁移学习是如何工作的。在你读完这篇文章之前,我强烈建议你看一看这个视频Joe Hicklin的作品(见下图),这说明了我将更详细地解释的内容。

我试图用迁移学习来解决的问题是区分5类食物——纸杯蛋糕、汉堡、苹果派、热狗和冰淇淋。要开始,你需要两样东西:

  1. 训练我们试图识别的不同类型食物的图像
  2. 一个经过预先训练的深度神经网络,我们可以根据数据和任务重新训练它

负荷训练图像

我有我所有的图像存储在“训练数据”文件夹与子目录对应的不同的类。我选择这种结构是因为它允许imageDataStore使用文件夹名称作为图像类别的标签。

为了将图像带入MATLAB中,我使用imageDatastore。imageDataStore用于管理大量的图像集合。只需一行代码,我就可以将所有的训练数据输入到MATLAB中,在我的例子中,我只有几千张图像,但即使我有数百万张图像,我也会使用相同的代码。使用imageDataStore的另一个优点是它支持从磁盘、网络驱动器、数据库和Hadoop等大数据文件系统读取图像。

allImages = imageDatastore (“TrainingData”“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

然后我将训练数据分成两组,一组用于训练,另一组用于测试,我使用的分割是80%用于训练,其余用于测试。

[trainingImages, testImages] = splitEachLabel(allImages, 0.8,“随机”);

负载预训练网络(AlexNet)

我的下一步是加载一个预先训练的模型,我将使用AlexNet,这是一个深度卷积神经网络,它已经被训练来识别1000种类型的物体,并对数百万张图像进行训练。AlexNet已经学会了如何执行基本的图像预处理,这需要在它的早期层中区分不同类别的图像,我的目标是“转移”学习到的任务,以分类不同种类的食物。

亚历克斯= alexnet;

现在让我们来看看AlexNet卷积神经网络的结构。

层=亚历克斯。层
有图层的图层数组:2' conv1' Convolution 96 11x11x3 convolutions with stride [4 4] and padding [0 0] 3 'relu1' ReLU ReLU 4 'norm1' Cross Channel normalization Cross Channel normalization with 5 channels per element 5 'pool1' Max Pooling 3x3 Max Pooling with stride [2 2] and padding [0 0] 6 'conv2' Convolution 256 5x5x48 convolutions with stride [1 1] and padding [2 2] 7 'relu2' ReLU ReLU 8 'norm2' Cross Channel normalization Cross Channel标准化与5频道/元素9“pool2”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0]10 conv3卷积384 3 x3x256旋转步[1]和填充[1]11的relu3 ReLU ReLU 12 conv4卷积384 3 x3x192旋转步[1]和填充[1]13的relu4 ReLU ReLU 14 conv5卷积256 3 x3x192旋转步[1]和填充[1]15 ' relu5 ReLU ReLU 16“pool5”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0] 17 'fc6'全连接4096全连接层18 'relu6' ReLU ReLU 19 'drop6' Dropout 50% Dropout 20 'fc7'全连接层21 'relu7' ReLU ReLU 22 'drop7' Dropout 50% Dropout 23 'fc8'全连接层1000全连接层24 'prob' Softmax Softmax 25 'output'分类输出crossentropyex与'tench', '金鱼'和998其他类

修改Pre-trained网络

AlexNet被训练可以识别1000个类,我们需要修改它,只识别5个类。为此,我将修改几个图层。注意最后几层的结构现在与AlexNet不同

层(23)= fullyConnectedLayer (5);层(25)= classificationLayer
有图层的图层数组:2' conv1' Convolution 96 11x11x3 convolutions with stride [4 4] and padding [0 0] 3 'relu1' ReLU ReLU 4 'norm1' Cross Channel normalization Cross Channel normalization with 5 channels per element 5 'pool1' Max Pooling 3x3 Max Pooling with stride [2 2] and padding [0 0] 6 'conv2' Convolution 256 5x5x48 convolutions with stride [1 1] and padding [2 2] 7 'relu2' ReLU ReLU 8 'norm2' Cross Channel normalization Cross Channel标准化与5频道/元素9“pool2”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0]10 conv3卷积384 3 x3x256旋转步[1]和填充[1]11的relu3 ReLU ReLU 12 conv4卷积384 3 x3x192旋转步[1]和填充[1]13的relu4 ReLU ReLU 14 conv5卷积256 3 x3x192旋转步[1]和填充[1]15 ' relu5 ReLU ReLU 16“pool5”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0] 17 'fc6'全连接4096全连接层18 'relu6' ReLU ReLU 19 'drop6' Dropout 50% Dropout 20 'fc7'全连接4096全连接层21 'relu7' ReLU ReLU 22 'drop7' Dropout 50% Dropout 23 "全连接5全连接层24 'prob' Softmax Softmax 25 "分类输出crossentropyex

执行转移学习

现在我已经修改了网络结构,是时候学习我们修改的最后几个层的权值了。对于迁移学习,我们想要稍微改变网络。在训练过程中,网络的变化程度取决于学习速率。这里我们不修改原始层的学习速率,即最后3层之前的学习速率。这些层的速率已经非常小了,所以不需要进一步降低。您甚至可以通过将速率设置为零来冻结这些早期层的权值。

选择= trainingOptions (“个”“InitialLearnRate”, 0.001,“MaxEpochs”, 20岁,“MiniBatchSize”, 64);

imageDataStore伟大的事情之一,它让我指定一个“自定义”读取函数,在这种情况下,我只是将输入图像的大小调整到227×227像素,这是AlexNet所期望的。我可以通过指定带有代码的函数句柄来读取和预处理图像。

trainingImages。ReadFcn = @readFunctionTrain;

现在让我们继续训练网络,这个过程在桌面GPU上通常需要5-20分钟。这是喝杯咖啡的好时机。

myNet = trainNetwork(trainingImages, layers, opts);
单GPU训练。初始化图像正常化。|=========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习| | | | | | |精度损失速率(秒)  | |=========================================================================================| | 1 | 1 | 2.32 | 1.9052 | 26.56% | 0.0010 | | 1 | 50 | 42.65 | 0.7895 | 73.44% | 0.0010 | | 2 | 100 | 83.74 | 0.5341 | 87.50% | 0.0010 | | 3 | 150 | 124.51 | 0.3321 | 87.50% | 0.0010 | | 4 | 200| 165.79 | 0.3374 | 87.50% | 0.0010 | | 250 | | 208.79 | 0.2333 | 87.50% | 0.0010 | | 300 | | 250.70 | 0.1183 | 96.88% | 0.0010 | | 6 | 350 | 291.97 | 0.1157 | 96.88% | 0.0010 | | 400 | | 333.00 | 0.1074 | 93.75% | 0.0010 | | 450 | | 374.26 | 0.0379 | 98.44% | 0.0010 | | 500 | | 415.51 | 0.0699 | 96.88% | 0.0010 | | 550 | | 456.80 | 0.1083 | 95.31% | 0.0010 | | 600 | | 497.80 | 0.1243 | 93.75% | 0.0010 | | 650 | | 538.83 | 0.0231 | 100.00% | 0.0010 | | 700 | | 580.26 |0.0353 | 96.88% | 0.0010 | | 750 | | 621.47 | 0.0154 | 100.00% | 0.0010 | | 800 | | 662.39 | 0.0104 | 100.00% | 0.0010 | | 850 | | 703.69 | 0.0360 | 98.44% | 0.0010 | | | 900 | | 0.0010 | 744.72 | 0.0065 | 100.00% | 16 | 950 | 785.74 | 0.0375 | 98.44% | 0.0010 | | 1000 | | 826.64 | 0.0102 | 100.00% | 0.0010 | | 1050 | | 867.78 | 0.0026 | 100.00% | 0.0010 | | 1100 | | 909.37 | 0.0019 | 100.00% | 0.0010 | | 19 | 1150 | 951.01 | 0.0120 | 100.00% | 0.0010 | | 1200 | | 992.630.0010 | 0.0009 | 100.00% | | | 1240 | | 1025.67 | 0.0015 | 0.0010 | 100.00%  | |=========================================================================================|

测试网络性能

现在让我们在测试台上测试我们的新“零食识别器”的性能。我们会看到算法的准确率超过80%。您可以通过添加更多的训练数据或调整一些训练参数来提高准确性。

testImages。ReadFcn = @readFunctionTrain;predictedLabels = classification (myNet, testImages);accuracy = mean(predictedLabels == testImages.Labels)
精度= 0.8260

在直播视频中尝试分类器

现在我们有了一个基于深度学习的零食识别器,我鼓励你自己抓一个零食试试。

也看看这个视频这段视频展示了如何在网络摄像头的直播流中进行图像识别。

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。

Baidu
map