%% Replace Unsupported Keras Layer with Function Layer
% This example shows how to import the layers from a pretrained Keras network, replace the unsupported layers with function 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 "digitsNet.h5" classifies images of digits.

filename = "digitsNet.h5";
layers = 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 the findPlaceholderLayers function.

placeholderLayers = findPlaceholderLayers(layers)

% Replace the placeholder layers with function layers with function specified by the softsign function, listed at the end of the example.
% Create a function layer with function specified by the softsign function, attached to this example as a supporting file. To access this function, open this example as a live script. Set the layer description to "softsign".

layer = functionLayer(@softsign,Description="softsign");

% Replace the layers using the replaceLayer function. To use the replaceLayer function, first convert the layer array to a layer graph.

lgraph = layerGraph(layers);
lgraph = replaceLayer(lgraph,"conv2d_softsign",layer);
lgraph = replaceLayer(lgraph,"conv2d_1_softsign",layer);

%% Specify Class Names
% If the imported classification layer does not contain the classes, then  you must specify these before prediction. 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.
% Find the index of the classification layer by viewing the Layers property of the layer graph.

lgraph.Layers

% The classification layer has the name 'ClassificationLayer_dense_1'. View the classification layer and check the Classes property.

cLayer = lgraph.Layers(end)

% Because the Classes property of the layer is "auto", you must specify the classes manually. Set the classes to 0, 1, ..., 9, and then replace the imported classification layer with the new one.

cLayer.Classes = string(0:9);
lgraph = replaceLayer(lgraph,"ClassificationLayer_dense_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)

%
%% Test Network
% Make predictions with the network using a test data set.

[XTest,YTest] = digitTest4DArrayData;
YPred = classify(net,XTest);

% View the accuracy.

mean(YPred == YTest)

% Visualize the predictions in a confusion matrix.

confusionchart(YTest,YPred)

% Copyright 2021 The MathWorks, Inc.