File Exchange

## Deep Learning: Transfer Learning in 10 lines of MATLAB Code

version 1.0.0.0 (2.32 KB) by MathWorks Deep Learning Toolbox Team

### MathWorks Deep Learning Toolbox Team (view profile)

Use transfer learning for training a deep neural network to classify 5 different types of food.

Updated 24 Feb 2017

Editor's Note: This file was selected as MATLAB Central Pick of the Week

Learn how to use transfer learning in MATLAB to re-train deep learning networks created by experts for your own data or task.
This demo teaches you how to use transfer learning to re-train AlexNet, a pretrained deep convolutional neural network (CNN or ConvNet) to recognize snack food such as hot dogs, cup cakes and apple pie.
https://www.mathworks.com/matlabcentral/fileexchange/59133-neural-network-toolbox-tm--model-for-alexnet-network
https://www.mathworks.com/matlabcentral/fileexchange/45182-matlab-support-package-for-usb-webcams

As Has

### As Has (view profile)

if i have 2 not equal sizes of classes( classe_1 = 50) and (classe_2=60)
is it necessary to determine the smallest amount of images in a category
e.g
tbl = countEachLabel(allimages);
minSetCount = min(tbl{:,2});
allimages = splitEachLabel(allimages, minSetCount);
countEachLabel(allimages)

Shounak Mitra

### Shounak Mitra (view profile)

Hi Srinivas,

Use
net = alexnet;
sz = net.Layers(1).InputSize
I = I(1:sz(1),1:sz(2),1:sz(3));

and let us know if it still doesn't work.

Refer to the following documentation and example in case you need more help. https://www.mathworks.com/help/deeplearning/ref/alexnet.html

Srinivas Satya

### Srinivas Satya (view profile)

Error using trainNetwork (line 154)
Unexpected image size: All images must have the same size.

Error in transferlearning (line 17)
myNet = trainNetwork(trainingImages, layers, opts);

Caused by:
Error using nnet.internal.cnn.MiniBatchDatastoreDispatcher>iCellTo4DArray (line 386)
Unexpected image size: All images must have the same size.
this is my error even after converting all the images into 227*227 pixels i am getting this error and one more thing is i used 3 different sets with different no.of images

Sun Rover

Nasuno Hiroshi

Niki rami

### Niki rami (view profile)

Hello everyone.
I was wondering if someone can help me with this matter.
I trained Alexnet for my pictures, I give it random images and it can detect them.
Now, I want to test it with a shot video. How should I modify the code to feed the video as a test? just to see how it works for video. I do not want to use the camera, I will use the shot video. Please feel free to contact me.
my skype id: dorsa_dorsa@hotmail.com

Wen Rei Do

### Wen Rei Do (view profile)

@Alaa, I wrote my own classifyVideo.m file and it works, here you go

function I = classifyVideo(myNet)

cam = webcam;

while true
picture = cam.snapshot;
picture = imresize (picture,[227,227]);

label = classify(myNet, picture);
image(picture);
title(char(label));
drawnow;

end
end

Alaa

### Alaa (view profile)

Any one help me to find a classifyVideo.m file Matlab file

Alaa

### Alaa (view profile)

Hello
Nice job here, but I need the classifyVideo.m file?
twelvemessages@gmail.com

ridvan ozdemir

### ridvan ozdemir (view profile)

Thank you for such a great video, but I have a question.
Can we use 16 layers of AlexNet instead of using all layers it has?
And if yes, how can we do that? Can you help me please?
ridvanozdemir01@gmail.com

Frank-Michael Schleif

### Frank-Michael Schleif (view profile)

You can use the following script (under linux - adapt it a bit for file operations in windows)
to convert the files e.g. from caltech: http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz

% to be place on top of myImages (with the respective images-classes as subfolders)
[status,res] = system('find . -name *.jpg'); % pick the images
resCell = regexp(res, char(10), 'split'); % to handle line breaks
resCell = resCell(1:end-1); % skip empty entry
for sFile = resCell
if(numel(size(I))==3) % remove non-rgb images
I = imresize(I,[227,227]); % rescale to alexnet format
imwrite(I,sFile{1});
else
sCommand = sprintf('rm %s',sFile{1});
system(sCommand);
end
end

hefeng Yin

### hefeng Yin (view profile)

@Zoran, Pappu and Josiah, Hello, guys, the training data used in this demo are from the Food-101 dataset, and it can be downloaded via http://www.vision.ee.ethz.ch/datasets_extra/food-101/

taha khan

### taha khan (view profile)

sir you do amazing work, but i have problem with training speed its too much slow ? and take lot of time ,any one tell me how too increase my training speed ?

Zoran Djordjevic

### Zoran Djordjevic (view profile)

Why are images not supplied. What is the point of short example if one has to spend hours preparing data. This is just marketing.

i have done my treating and tested the acc but how can i bring up the web came to identify the objects that i trained plz help asap

Pappu Murthy

### Pappu Murthy (view profile)

you need to provide the folders and images for this program to run so that we can also try to train and learn. Is there anyway to get these folders and images

chewnala

### chewnala (view profile)

% In order for imageDataStore to parse the folder names as category labels,
% you would have to store image categories in corresponding sub-folders.
allImages = imageDatastore('C:\Users\rcham\Documents\seniorproj2\pics', 'IncludeSubfolders', true,'LabelSource', 'foldernames');

%% Split data into training and test sets
[trainingImages, testImages] = splitEachLabel(allImages, 0.8, 'randomize');

% AlexNet is a pre-trained network trained on 1000 object categories.
% AlexNet is avaliable as a support package on FileExchange.
alex = alexnet;

%% Review Network Architecture
layers = alex.Layers

%% Modify Pre-trained Network
% AlexNet was trained to recognize 1000 classes, we need to modify it to
% recognize just 5 classes.
layers(23) = fullyConnectedLayer(4); % change this based on # of classes
layers(25) = classificationLayer

%% Perform Transfer Learning
% For transfer learning we want to change the weights of the network ever so slightly. How
% much a network is changed during training is controlled by the learning
% rates.
opts = trainingOptions('sgdm', 'InitialLearnRate', 0.001,...
'MaxEpochs', 20, 'MiniBatchSize', 64);

% One of the great things about imageDataStore it lets you specify a
% "custom" read function, in this case it is simply resizing the input
% images to 227x227 pixels which is what AlexNet expects. You can do this by
% specifying a function handle of a function with code to read and
% pre-process the image.

%% Train the Network
% This process usually takes about 5-20 minutes on a desktop GPU.
myNet = trainNetwork(trainingImages, layers, opts);

%% Test Network Performance
% Now let's the test the performance of our new "snack recognizer" on the test set.
predictedLabels = classify(myNet, testImages);
accuracy = mean(predictedLabels == testImages.Labels)

This is what I've got. The only thing I changed was giving the full path to the folder file that contains the subfolders of images

chewnala

### chewnala (view profile)

Is there anyone who could help me understand this error. Error using matlab.io.datastore.ImageDatastore/subsasgn (line 274)

Error in Untitled20 (line 38)

Thanks

Group Six

### Group Six (view profile)

Is there a way you can post how you changed the location of where the alex net picks up the images? and how should those folders be categorized when splitting into training and testing ?

Farzan Majeed Noori

### Farzan Majeed Noori (view profile)

anyone can help?
---------------------------

25x1 Layer array with layers:

1 'data' Image Input 227x227x3 images with 'zerocenter' normalization
2 'conv1' Convolution 96 11x11x3 convolutions with stride [4 4] and padding [0 0 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 0 0]
6 'conv2' Convolution 256 5x5x48 convolutions with stride [1 1] and padding [2 2 2 2]
7 'relu2' ReLU ReLU
8 'norm2' Cross Channel Normalization cross channel normalization with 5 channels per element
9 'pool2' Max Pooling 3x3 max pooling with stride [2 2] and padding [0 0 0 0]
10 'conv3' Convolution 384 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
11 'relu3' ReLU ReLU
12 'conv4' Convolution 384 3x3x192 convolutions with stride [1 1] and padding [1 1 1 1]
13 'relu4' ReLU ReLU
14 'conv5' Convolution 256 3x3x192 convolutions with stride [1 1] and padding [1 1 1 1]
15 'relu5' ReLU ReLU
16 'pool5' Max Pooling 3x3 max pooling with stride [2 2] and padding [0 0 0 0]
17 'fc6' Fully Connected 4096 fully connected layer
18 'relu6' ReLU ReLU
19 'drop6' Dropout 50% dropout
20 'fc7' Fully Connected 4096 fully connected layer
21 'relu7' ReLU ReLU
22 'drop7' Dropout 50% dropout
23 '' Fully Connected 5 fully connected layer
24 'prob' Softmax softmax
25 '' Classification Output crossentropyex
Training on single CPU.
Initializing image normalization.
|=========================================================================================|
| Epoch | Iteration | Time Elapsed | Mini-batch | Mini-batch | Base Learning|
| | | (seconds) | Loss | Accuracy | Rate |
|=========================================================================================|
| 1 | 1 | 21.41 | 2.1046 | 12.50% | 0.0010 |
| 20 | 20 | 622.74 | 0.0003 | 100.00% | 0.0010 |
|=========================================================================================|
Error using matlab.io.datastore.ImageDatastore/subsasgn (line 274)
Expected ReadSize to be a scalar with value >= 1.

Error in nnet.internal.cnn.ImageDatastoreMiniBatchDatasource/set.MiniBatchSize (line 110)

Error in nnet.internal.cnn.ImageDatastoreMiniBatchDatasource (line 37)
self.MiniBatchSize = miniBatchSize;

ds = nnet.internal.cnn.ImageDatastoreMiniBatchDatasource( inputs, miniBatchSize );

datasource = iCreateImageDatastoreMiniBatchDatasource( inputs, miniBatchSize );

Error in SeriesNetwork/predict (line 328)
dispatcher = iDataDispatcher(data, miniBatchSize, precision, ...

Error in SeriesNetwork/classify (line 559)
scores = this.predict( X, varargin{:} );

Error in TransferLearningVideo (line 20)
predictedLabels = classify(myNet, testImages)

jy w

jy w

Josiah Laivins

### Josiah Laivins (view profile)

Can you actually post a folder with the 5 different foods? I dont really want to have to manually download and resize 1000 images of food, and I saw you literally have a folder with the images. Also I would like to have similar results to you, so having your images can make this tutorial better. Could you post that?

nastaran

### nastaran (view profile)

Error using trainNetwork>iAssertThatTrainingDataHasValidSizeForTraining (line 157)
The training images are of size 480x640x3 but the input layer expects images of size 227x227x3.

Error in trainNetwork (line 89)
iAssertThatTrainingDataHasValidSizeForTraining(internalLayers{1}, dispatcher);

>>

tao fuyu

### tao fuyu (view profile)

how many images do I need for training each category?

Manish Sahu

### Manish Sahu (view profile)

What kind of error are you getting Muhammad Rafiq?
I am using GT740m and its working fine.

I am facing GPU_LAUNCH_FAILED
Using NVidia GT 710, CUDA Enabled, Compute Capability 3.5
NN and Parallel toolbox installed and working independently.
Images are 227x227 JPG format divided in 3 classes.

Gaetano Roggia

### Gaetano Roggia (view profile)

Hi, I would need to detect human faces with open/closed eyes. Would this algorithm be able to classify that?

Shyamal Patel

### Shyamal Patel (view profile)

You need images of 5 different types of food to run this example. Check out this video for more details:
https://www.mathworks.com/videos/deep-learning-with-matlab-transfer-learning-in-10-lines-of-matlab-code-1487714838381.html

Branislav Pazicky

### Branislav Pazicky (view profile)

I have an error: The output size (5) of the last layer doesn't match the number of classes (1).
Can you help me ?

 23 Feb 2017 1.0.0.0 Updated icon image.
##### MATLAB Release Compatibility
Created with R2016b
Compatible with any release
##### Platform Compatibility
Windows macOS Linux

### Discover Live Editor

Create scripts with code, output, and formatted text in a single executable document.