MATLAB Answers

Image Regression using .mat Files and a datastore

140 views (last 30 days)
I would like to train a CNN for image regression using a datastore. My images are stored in .mat files (not png or jpeg). This is not image-to-image regression, rather an image to single regression label problem. Is it possible to do this using a datastore, or at least some other out-of-memory approach?


Sign in to comment.

Accepted Answer

luisa di monaco
luisa di monaco on 7 Dec 2019
Edited: luisa di monaco on 2 Jan 2020
I have solved something similar.
I'm trying to train a CNN for regression. My inputs are numeric matrices of size 32x32x2 (each input includes 2 grayscale images as two channels). My outputs are numeric vectors of length 6.
500 000 is the total amount of data.
I created 500 000 .mat file for inputs in folder 'inputData' and 500 000 .mat file for target in folder 'targetData'. Each .mat file contains only 1 variable of type double called 'C'.
The size of C is 32x32x2 (if input) or 1x6 (if target).
inputDatat = transform(inputData,@(data) rearrange_datastore(data));
targetDatat = transform(targetData,@(data) rearrange_datastore(data));
% here I defined my network architecture
% here I defined my training options
net=trainNetwork(trainData, Layers, options);
function image = rearrange_datastore(data)
image= {image};


Matthew Fall
Matthew Fall on 10 Dec 2019
Seems like it should work! I've already moved away from this project, but I will give this a try if it comes up again. What version of Matlab did you use?
luisa di monaco
luisa di monaco on 10 Dec 2019
2019b because I need to define a custom regression layer. I don't know if 2019b is needed to use filedatastore, combine and transform.

Sign in to comment.

More Answers (2)

Johanna Pingel
Johanna Pingel on 29 Apr 2019
Edited: Johanna Pingel on 29 Apr 2019
I've used a .mat to imagedatastore conversion here:
imds = imageDatastore(ImagesDir,'FileExtensions','.mat','ReadFcn',@matRead);
function data = matRead(filename)
inp = load(filename);
f = fields(inp);
data = inp.(f{1});

  1 Comment

Matthew Fall
Matthew Fall on 29 Apr 2019
Thank you for your swift reply.
Unfortunately, the matlab regression example requires loading all of the training and validation data in memory, which I want to avoid by using the datastore.
I've tried using the imageDatastore with regression labels before, but then trainNetwork gives me the error:
Error using trainNetwork (line 150)
Invalid training data. The labels of the ImageDatastore must be a categorical vector.

Sign in to comment.

Lykke Kempfner
Lykke Kempfner on 16 Aug 2019
I have same problem.
I have many *.mat files with data that can not fit in memory. You may consider the files as not standard images. I have the ReadFunction for the files. I wish to create a datastore (?) where each sample are associated with two single values and not a class.
Are there any solution to this issue ?

Sign in to answer this question.