This example shows how to fine-tune a pretrained GoogLeNet network to classify a new collection of images. This process is called transfer learning and is usually much faster and easier than training a new network, because you can apply learned features to a new task using a smaller number of training images. To prepare a network for transfer learning interactively, use Deep Network Designer.
In the workspace, unzip the data.
Open Deep Network Designer.
Load a pretrained GoogLeNet network by selecting it from the Deep Network Designer start page. If you need to download the network, then click Install for a link to Add-On Explorer.
Deep Network Designer displays a zoomed-out view of the whole network. Explore the network plot. To zoom in with the mouse, use Ctrl+scroll wheel.
To load the data into Deep Network Designer, on the Data tab, click Import Data. The Import Data dialog box opens.
In the Data source list, select Folder. Click Browse and select the extracted MerchData folder.
The dialog box also allows you to split the validation data from within the app. Divide the data into 70% training data and 30% validation data.
Specify augmentation operations to perform on the training images. For this example, apply a random reflection in the x-axis, a random rotation from the range [-90,90] degrees, and a random rescaling from the range [1,2].
Click Import to import the data into Deep Network Designer.
Deep Network Designer resizes the images during training to match the network input size. To view the network input size, on the Designer pane, click the
imageInputLayer. This network has an input size of 224-by-224.
Using Deep Network Designer, you can visually inspect the distribution of the training and validation data in the Data pane. You can see that, in this example, there are five classes in the data set.
To retrain a pretrained network to classify new images, replace the final layers with new layers adapted to the new data set.
In the Designer pane, drag a new
fullyConnectedLayer from the Layer Library onto the canvas. Set
OutputSize to the number of classes in the new data, in this example,
Edit learning rates to learn faster in the new layers than in the transferred layers. Set
BiasLearnRateFactor to 10. Delete the last fully connected layer and connect your new layer instead.
Replace the output layer. Scroll to the end of the Layer Library and drag a new
classificationLayer onto the canvas. Delete the original
output layer and connect your new layer instead.
To make sure your edited network is ready for training, click Analyze, and ensure the Deep Learning Network Analyzer reports zero errors.
To train the network with the default settings, on the Training tab, click Train.
If you want greater control over the training, click Training Options and choose the settings to train with. The default training options are better suited for large data sets. For small data sets, use smaller values for
ValidationFrequency. For more information on selecting training options, see
For this example, set
8. As there are 55 observations, set
MiniBatchSize to 11 to divide the training data evenly and ensure the whole data set is used during each epoch.
To train the network with the specified training options, click Close and then click Train.
Deep Network Designer allows you to visualize and monitor the training progress. You can then edit the training options and retrain the network, if required.
To export the results from training, on the Training tab, select Export > Export Trained Network and Results. Deep Network Designer exports the trained network as the variable
trainedNetwork_1 and the training info as the variable
You can also generate MATLAB code, which recreates the network and the training options used. On the Training tab, select Export > Generate Code for Training.
Select a new image to classify using the trained network.
I = imread("MerchDataTest.jpg");
Resize the test image to match the network input size.
I = imresize(I, [224 224]);
Classify the test image using the trained network.
[YPred,probs] = classify(trainedNetwork_1,I); imshow(I) label = YPred; title(string(label) + ", " + num2str(100*max(probs),3) + "%");
For more information, including on other pretrained networks, see Deep Network Designer.