Hot to extract keras model data to MATLAB - matlab

I do not have the deep learning toolbox of Matlab. I want to implement only the classification part in MATLAB. I would train the network in Keras and save the model in JSON and h5 format. Finally, load the Jason and h5 formatted data from MATLAB and use the model to predict a test sample.
I have created and saved a binary classifier with one layer model using Keras as follows:
model.add(keras.layers.Dense(25, input_dim=232, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
model.save_weights("model.h5")
Next I can read the Json file from MATLAB:
fid = fopen(fileName); % Opening the file
raw = fread(fid,inf); % Reading the contents
str = char(raw'); % Transformation
fclose(fid); % Closing the file
data = jsondecode(str); %
Now how can I build the model in MATLAB to predict a sample? How weights and biases are stored in JSON of the h5 file?
Any comments would be appreciated.

First, you need to see what dataset is present in the file and in which group. To do so you type the command in the MatLab command prompt: h5disp(fileName)
This will display all the groups and datasets under each group and next you can access the required dataset from a group by specifying it in h5read. An example is in the link: https://au.mathworks.com/help/matlab/ref/h5read.html

Related

SVM Classifications on set of images of digits in Matlab

I have to use SVM classifier on digits dataset. The dataset consists of images of digits 28x28 and a toal of 2000 images.
I tried to use svmtrain but the matlab gave an error that svmtrain has been removed. so now i am using fitcsvm.
My code is as below:
labelData = zeros(2000,1);
for i=1:1000
labelData(i,1)=1;
end
for j=1001:2000
labelData(j,1)=1;
end
SVMStruct =fitcsvm(trainingData,labelData)
%where training data is the set of images of digits.
I need to know how i can predict the outputs of test data using svm? Further is my code correct?
The function that you are looking for is predict. It takes the SVM-object as input followed by a data-matrix and returns the predicted labels.
Make sure that you do not train your model on all data but on a reasonable subset (usually 70%). You can use the cross-validation preparation:
% create cross-validation object
cvp = cvpartition(Lbl,'HoldOut',0.3);
% extract logical vectors for training and testing data
lgTrn = cvp.training;
lgTst = cvp.test;
% train SVM
mdl = fitcsvm(Dat(lgTrn,:),Lbl(lgTrn));
% test / predict SVM
Lbl_prd = predict(mdl,Dat(lgTst,:));
Note that your labeling produces a single vector of ones.
The reason why The Mathworks changed svmtrain to fitcsvm is conciseness. It is now clear whether it is "classification" (fitcsvm) or "regression" (fitrsvm).

Matlab: make predictions with SVM for multiclass classification problems

I am trying to use a Support Vector Machine to classify my data in 3 classes. I used this Matlab function to train and cross-validate the SVM:
Mdl = fitcecoc(XTrain, yTrain, 'Learners', 'svm', 'ObservationsIn', 'rows', ...
'ScoreTransform', 'invlogit','Crossval','on', 'Holdout', 0.2);
where XTrain contains all of my data and yTrain is a cell containing the names of each class to be assigned to the input data in XTrain.
The function above returns to me:
Mdl --> 1x1 ClassificationPartitionedECOC
My question is, what function do I have to use in order to make predictions using new data? In the case of binary classification, I build the SVM with 'fitcsvm' and then I predicted the labels with:
[label, score] = predict(Mdl, XTest);
However, if I feed the ClassificationPartitionedECOC to the 'predict' function, it gives me this error:
No valid system or dataset was specified.
I haven't been able to find a function that allows me to perform prediction starting from the model format that I have, ClassificationPartitionedECOC.
Thanks for any help you may provide!
You can access the learner i through:
Mdl.BinaryLearners{i}
Because fitcecoc just trains a binary classifier like you would do with fitCSVM in a one versus one fashion.

Training using LM algorithm in Neural Network Toolbox in MATLAB

I am trying to use the Neural Toolbox in MATLAB to train a dataset using the LM algorithm. The network architecture I am using is feedforward with one hidden layer while the transfer functions I am using is the tansig for input-to-hidden layer and pureline for hidden-to-output layer. During training, the values of MSE with increasing number of epochs shows up on the screen till the performance goal is met, or the maximum no. of epochs is reached. However, what I am interested is in is to save the value of MSE at each epoch from the start till the end of training as a datafile (.txt or .dat) in my hard drive. I have browsed a lot but I could not find a way to do this. Can someone please help me in this regard. Thanks.
If you create you code with network called net then you can get the information about MSE using the function [net tr ] = train(net,x,t).
For instance if we use simplefit_dataset simple data with a simple network the result is on tr.perf which shows that MSE for each epoch for the train data:
close all, clear all, clc, plt=0;
[x,t] = simplefit_dataset;
net = fitnet(10);
rng(0)
[net tr ] = train(net, x, t);
plt = plt+1, figure(plt), hold on;
plot(tr.perf,'b', 'LineWidth', 2)
For more information,please visit the following link:
https://www.mathworks.com/matlabcentral/answers/57648-how-to-plot-mse-for-train-and-test
To save the output results in a text file please use the following code:
fileID = fopen('Output.txt','w');
fprintf(fileID,'%f\n',tr.perf);
fclose(fileID);
For more information about writing and reading data from/to the text in matlab refer to the below link:
https://www.mathworks.com/help/matlab/import_export/writing-to-text-data-files-with-low-level-io.html
All results of mlp_ANN toolbax is in tr variable on workspace.you have not to do anything as writing code to get MSE for each epoch.All you need is that go into the tr variable on workspace after halting train and open the pref and copy it to notpad as .txt file.

MATLAB: generating Eye Diagram of a time-domain signal

I have a csv file of time signal. The data has been extracted from Cadence Virtusuo. I can simulate in Virtusuo and get the Eye Diagram of the signal over the 30ns period and using 500ps time step. Now I wanted to generate the same plot in MATLAB. But my MATLAB code doesn't generate same eye diagram as I see in the Virtusuo SImulator.
Can anyone help me to get the plot that I want to generate in MATLAB. Here is the Data in csv and the desired eye diagram image from Cadence Virtusuo has been given. My MATLAB code is given also.
Desired Eye Diagram:
MATLAB code:
% open data file
fid = fopen('Data.csv');
readData = textscan(fid,'%f %f','Headerlines',1,'Delimiter',',');
% Extract data from readData
xData = readData{1,1}(:,1);
yData = readData{1,2}(:,1);
eyediagram(yData,300,10e-10);
plottools
MATLAB Generated Plot:

Reconstruct Original Data using Denoising AutoEncoder

Sometimes , the raw data doesn't contains sufficient information like biological experimental data.I have a gene expression dataset with size 100*1000. I want to use Denoising AutoEncoder to get an reconstructed output with the same size(100*1000). How it would be possible?
Here you can find an interesting article about autoencoders. The denosing case is also mentioned - I hope that it will answer your question :
https://medium.com/a-year-of-artificial-intelligence/lenny-2-autoencoders-and-word-embeddings-oh-my-576403b0113a#.2jdcn3ctk
Just if anyone ever stumbles over this post and wonders how to code a denoising autoencoder. Here is a simple example:
import numpy as np
import tensorflow as tf
# Generate a 100x1000 dataset
x_train = np.random.rand(100, 1000)
# Add noise to the data
noise_factor = 0.5
x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape)
# Clip the values to [0, 1]
x_train_noisy = np.clip(x_train_noisy, 0., 1.)
# Define the input layer
inputs = tf.keras.layers.Input(shape=(1000,))
# Define the encoder
encoded = tf.keras.layers.Dense(100, activation='relu')(inputs)
# Define the decoder
decoded = tf.keras.layers.Dense(1000, activation='sigmoid')(encoded)
# Define the autoencoder model
autoencoder = tf.keras.models.Model(inputs, decoded)
# Compile the model
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
# Train the model
autoencoder.fit(x_train_noisy, x_train, epochs=100, batch_size=32)
Note:
You have to replace x_train with your data
x_train has to be noise free (otherwise the denoising autoencoder won't work, since it has no reference)
you can add additional layers for your encoder and decoder part
you should play around with hyperparameters (number of neurons in the individual layers, loss function, (optimizer,) epochs, batch_size) to see what works best for you -> preferably, you run an optimisier to find the best values for them (like grid search and the like)
And here are a couple of links to other sources on autoencoders:
Machine Learning Mastery
Keras Blog