Error using trainNetwork. Unable to read file.

I am trying to implement CNN on signal's Data. I have a database in which I have 10 folders(Each folder has 12 subfolders). Each file has dimensions 12x2000 which is a .mat file. While running CNN on the above data I am facing below attached error. Can someone help me out?
location = 'C:\Users\AKRA\Desktop\New folder (3)';
imds = imageDatastore(location, 'FileExtensions', '.mat', 'IncludeSubfolders',1, ...
'LabelSource','foldernames');
labelCount = countEachLabel(imds)
img = readimage(imds,1);
size(img)
numTrainFiles = 8;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
layers = [
imageInputLayer([12 2000 1])
convolution2dLayer(3,8,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(3,16,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(3,32,'Padding','same')
batchNormalizationLayer
reluLayer
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];
options = trainingOptions('sgdm', ...
'InitialLearnRate',0.01, ...
'MaxEpochs',4, ...
'Shuffle','every-epoch', ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',30, ...
'Verbose',false, ...
'Plots','training-progress');
net = trainNetwork(imdsTrain,layers,options);
YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = sum(YPred == YValidation)/numel(YValidation)
Screenshot (9).png

3 comentarios

Catalytic
Catalytic el 2 de Abr. de 2019
Is there a reason you are using an imagedatastore for what looks like non-image data?
Hassan Ashraf
Hassan Ashraf el 2 de Abr. de 2019
What could be other options?
Catalytic
Catalytic el 2 de Abr. de 2019
Editada: Catalytic el 2 de Abr. de 2019

Iniciar sesión para comentar.

 Respuesta aceptada

Catalytic
Catalytic el 2 de Abr. de 2019
Editada: Catalytic el 2 de Abr. de 2019
I think it is expecting more traditional types of image files like .jpg,.png, etc.. I think for .mat you need to specify a specialized ReadFcn. Maybe this?
imds = imageDatastore(location, 'FileExtensions', '.mat', 'IncludeSubfolders',1, ...
'LabelSource','foldernames',...
'ReadFcn',@(f) getfield(load(f)),___);

16 comentarios

Hassan Ashraf
Hassan Ashraf el 2 de Abr. de 2019
How can I specify a specialized ReadFcn for my work?
Hassan Ashraf
Hassan Ashraf el 2 de Abr. de 2019
Tried this but still no luck :(
Catalytic
Catalytic el 2 de Abr. de 2019
What was the result?
Hassan Ashraf
Hassan Ashraf el 2 de Abr. de 2019
error.png
Catalytic
Catalytic el 2 de Abr. de 2019
Editada: Catalytic el 2 de Abr. de 2019
You should debug your ReadFcn, testing it on an isolated file, before submitting it to imagedatastore.
Hassan Ashraf
Hassan Ashraf el 5 de Abr. de 2019
Thank you "Catalytic". It worked and helped me a lot.
Keep helping. God Bless you.
Toqa Am
Toqa Am el 26 de Dic. de 2019
Hello Mr. Hassan Ashraf,
Can you please tell me how you can solve this problem, because I have faced it for a long time and I cannot solve it. The same error appears.
Please tell me as soon as possible.
Moreover, there are another error has been accure,
Error using trainNetwork (line 150)
Conversion to single from struct is not possible.
Error in classificationlayers (line 55)
net = trainNetwork(trainingset,layers,options);
Caused by:
Error using cast
Conversion to single from struct is not possible.
I would be grateful for your help.
Hassan Ashraf
Hassan Ashraf el 27 de Dic. de 2019
Hi Toqa Am..!
I resolved the error by just debugging my ReadFcn function. There was an error of name in the ReadFcn function.
I've also skipped this step, but now the problem is with the second error,
Error using trainNetwork (line 150)
Conversion to single from struct is not possible.
Error in classificationlayers (line 55)
net = trainNetwork(trainingset,layers,options);
Caused by:
Error using cast
Conversion to single from struct is not possible.
can you solve this error???
Max
Max el 31 de En. de 2021
Editada: Max el 31 de En. de 2021
imds = imageDatastore(location, 'FileExtensions', '.mat', 'IncludeSubfolders',1,...
'LabelSource','foldernames','ReadFcn',@matReader);
function S = matReader(filename)
load(filename);
end
Walter Roberson
Walter Roberson el 17 de Nov. de 2021
What are you returning from matReader() ?
When you load() a .mat and assign the result to a variable, then the variable will be a struct with one field for each variable loaded from the file. You would need to extract some particular variable to assign to S.
Lan  Anh
Lan Anh el 13 de Dic. de 2021
Can you please tell me how you can solve this problem in detail? I tried but I could not.
Thanks so much in advance
Walter Roberson
Walter Roberson el 13 de Dic. de 2021
You have .mat files with names such as p10_v16_s10.mat .
A .mat file may contain multiple variables, but you will need to pick a particular variable to return.
In your situation, is the name of the variable to read from the file always the same? Of is the name of the variable to read the same as the file name? Or are you certain that the file only contains a single variable?
Lan  Anh
Lan Anh el 14 de Dic. de 2021
The file only contains a single variable and the name of the variable to read from the file is always the same
function S = matReader(filename)
data_struct = load(filename);
fields = fieldnames(data_struct);
S = data_struct.(fields{1});
end
This code will handle the case of exactly one variable in the file, no matter what the variable is named.

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 2 de Abr. de 2019

0 votos

Maybe it's a corrupt file. Are you able to open CNN1.mat simply by using load?

3 comentarios

Hassan Ashraf
Hassan Ashraf el 2 de Abr. de 2019
Yes I am able to do that. I tried to run this code multiple times and every time the same error appears with a different file name. Sometimes it says unable to read CNN12.mat and another time it says unable to read CNN19.mat.
hellow Hassan
I need your help. I am also trying to train model on .mat file. I do the same like you but i am facing some issue. I have tried the above code
imds = imageDatastore(location, 'FileExtensions', '.mat', 'IncludeSubfolders',1,...
'LabelSource','foldernames','ReadFcn',@matReader);
and my matReader is
function S = matReader(filename)
S = load(filename);
end
but when i run the following code
net = trainNetwork(imdsTrain,lgraph_1,options);
Error using trainNetwork (line 184)
Conversion to single from struct is not possible.
Caused by:
Error using cast
Conversion to single from struct is not possible.
Please assist i have also attached the image
If its a struct file, then there must be different fields within that struct file. You need to specify which file (field) from that struct file to read. See my code to read and call the struct file
function I=readFcn1(filename)
I=load(filename);
I=I.S;
and on the other hand, this is how I am calling this function
location = 'C:\EMG\Test\Subject5\Day5';
test = imageDatastore(location, 'FileExtensions', '.mat', 'IncludeSubfolders',1, ...
'LabelSource','foldernames',...
'ReadFcn', @readFcn1);

Iniciar sesión para comentar.

Categorías

Más información sobre File Operations en Centro de ayuda y File Exchange.

Preguntada:

el 2 de Abr. de 2019

Comentada:

el 15 de Dic. de 2021

Community Treasure Hunt

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

Start Hunting!

Translated by