Can anyone help me in reshaping a fully connected layer output to a image?

I am trying to make a deep layer network in which I want to connect my pretrained convolutional layer at the intermediate step? I am unable to write a custom layer for it. I am sharing the code for the custom layer, please le me know where am I going wrong in it.
classdef fullytandem < nnet.layer.Layer
properties
% (Optional) Layer properties
% Layer properties go here
end
properties (Learnable)
% (Optional) Layer learnable parameters
% Layer learnable parameters go here
W;
b;
Z;
end
methods
function layer = fullytandem(input_shape, output_shape, im_layer, name)
% (Optional) Create a myLayer
% This function must have the same name as the layer
% Layer constructor function goes here
layer.Name = name;
layer.Description = 'fully self';
layer.b = rand([im_layer,1]);
layer.W = rand([im_layer,input_shape]);
end
function Z = predict(layer, X)
load('net_28s11.mat')
% Forward input data through the layer at prediction time and
% output the result
%
% Inputs:
% layer - Layer to forward propagate through
% X - Input data
% Output:
% Z - Output of layer forward function
% Layer forward function for prediction goes here
disp('W')
size(layer.W)
disp('X')
size(X)
weights = layer.W;
bias = layer.b;
Y = fullyconnect(X,weights,bias,'DataFormat','SSCB');
% Z = layer.W*X + layer.b';
% disp(size(Z))
% outputSize = X.OutputSize;
disp('Y')
size(Y)
Z = reshape(Y, [4,7,1]);
disp('Z')
size(Z)
% Z = predict(net,dlarray(Z));
end
%
end
end

 Accepted Answer

Instead of writing the code for fullyconnected layer you can make use of the existing fullyConnectedLayer & write the custom layer code only for the reshape operation as follows:
layers = [ ...
imageInputLayer([100 1 1],'Name','input','Normalization','none')
fullyConnectedLayer(100, 'Name','fc')
reshapeLayer("reshape")
convolution2dLayer(5,20,'Name','conv')];
dlnet = dlnetwork(layerGraph(layers));
analyzeNetwork(dlnet)
Custom layer code for reshape operation:
classdef reshapeLayer < nnet.layer.Layer
properties
end
properties (Learnable)
end
methods
function layer = reshapeLayer(name)
layer.Name = name;
end
function [Z] = predict(layer, X)
Z = reshape(X,10,10,1,[]);
end
end
end

5 Comments

Thanks alot for the answer, Srivardhan. I am still rusky on how to connect this reshape layer to the pretrained network? Say, I have a network saved in the .mat file. We can use this network as predict(net,XTest). How to add this pretrained network layers after the reshape layer?
Could you please guide me on the same?
Thanks again!
It should work if you replace the first line with
classdef reshapeLayer < nnet.layer.Layer & nnet.layer.Formattable
as recommended by the analyzeNetwork() function when you run Srivardhan Gadila's code.
I have implemented this reshape function and I am trying to reshape from 512 to 8 x 8 x 8.
I have changed the reshape settings to Z = reshape(X,8,8,8);
For some reason, the output in the network is 8.
Any idea why this is happening?
Attached the analyzeNetwork
Just found the answer.
You have to add a line to the function as follows:
function [Z] = predict(layer, X)
Z = reshape(X, 8, 8, 8, []);
Z = dlarray(Z,'SSSCB');

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!