X = abalone_dataset;
inp_num = size(X,1);
hid_num1 = 7;
hid_num2 = 6 ;
auto1 = trainAutoencoder(X,hid_num1,'DecoderTransferFunction','pureline','Scale',false);
tmp1 = encode(auto1,X);
auto2 = trainAutoencoder(tmp1,hid_num2,'DecoderTransferFunction','purelin','Scale',false);
tmp2 = encode(auto2,tmp1);
fnet = network;
fnet.numInputs = 1;
fnet.numLayers = 4;
fnet.inputConnect(1,1) = 1;
fnet.layerConnect(2,1) = 1;
fnet.layerConnect(3,2) = 1;
fnet.layerConnect(4,3) = 1;
fnet.outputConnect(1,4) = 1;
fnet.biasConnect = [1;1;1;1];
fnet.inputs{1}.size = inp_num;
fnet.layers{1}.size = hid_num1;
fnet.layers{2}.size = hid_num2;
fnet.layers{3}.size = hid_num1;
fnet.layers{4}.size = inp_num;
fnet.layers{1}.transferFcn = 'logsig';
fnet.layers{2}.transferFcn = 'logsig';
fnet.layers{3}.transferFcn = 'purelin';
fnet.layers{4}.transferFcn = 'purelin';
fnet.divideFcn = 'dividetrain';
fnet.IW{1,1} = auto1.EncoderWeights;
fnet.b{1} = auto1.EncoderBiases;
fnet.LW{2,1} = auto2.EncoderWeights;
fnet.b{2} = auto2.EncoderBiases;
fnet.LW{3,2} = auto2.DecoderWeights;
fnet.b{3} = auto2.DecoderBiases;
fnet.LW{4,3} = auto1.DecoderWeights;
fnet.b{4} = auto1.DecoderBiases;
fnet.trainFcn = 'trainscg';
fnet.trainParam.epochs = 1000;
fnet = train(fnet,X,X);
Y = fnet(X);
hold on
for n = 1:inp_num
plot(X(n,:),Y(n,:),'.')
end
grid on
plot([-0.5 3.5],[-0.5 3.5])