%% Assemble Network from Pretrained Keras Layers
% Import the layers from a pretrained Keras network, replace the unsupported layers with custom layers, and assemble the layers into a network ready for prediction.
%
%% Import Keras Network
% Import the layers from a Keras network model. The network in 'digitsDAGnetwithnoise.h5' classifies images of digits.

filename = 'digitsDAGnetwithnoise.h5';
lgraph = importKerasLayers(filename,'ImportWeights',true);

% The Keras network contains some layers that are not supported by Deep Learning Toolbox™. The importKerasLayers function displays a warning and replaces the unsupported layers with placeholder layers.
%
%% Replace Placeholder Layers
% To replace the placeholder layers, first identify the names of the layers to replace. Find the placeholder layers using findPlaceholderLayers and display their Keras configurations.

placeholderLayers = findPlaceholderLayers(lgraph);
placeholderLayers.KerasConfiguration

% Define a custom Gaussian noise layer by saving the file gaussianNoiseLayer.m in the current folder. Then, create two Gaussian noise layers with the same configurations as the imported Keras layers.

gnLayer1 = gaussianNoiseLayer(1.5,'new_gaussian_noise_1');
gnLayer2 = gaussianNoiseLayer(0.7,'new_gaussian_noise_2');

% Replace the placeholder layers with the custom layers using replaceLayer.

lgraph = replaceLayer(lgraph,'gaussian_noise_1',gnLayer1);
lgraph = replaceLayer(lgraph,'gaussian_noise_2',gnLayer2);

%
%% Specify Class Names
% The imported classification layer does not contain the classes, so you must specify these before assembling the network. If you do not specify the classes, then the software automatically sets the classes to 1, 2, ..., N, where N is the number of classes.
% The classification layer has the name 'ClassificationLayer_activation_1'. Set the classes to 0, 1, ..., 9, and then replace the imported classification layer with the new one.

cLayer = lgraph.Layers(end);
cLayer.Classes = string(0:9);
lgraph = replaceLayer(lgraph,'ClassificationLayer_activation_1',cLayer);

%
%% Assemble Network
% Assemble the layer graph using assembleNetwork. The function returns a DAGNetwork object that is ready to use for prediction.

net = assembleNetwork(lgraph)

% Copyright 2018 The MathWorks, Inc.