How to change input values for weight classfication layer.

조회 수: 11 (최근 30일)
Raza Ali
Raza Ali 2019년 10월 7일
댓글: evelyn 2024년 4월 29일
I am using weigth classfication fucntion which given as example in MATALAB documentaion.
But whenI use it in my network it gives error "Error using 'backwardLoss' in Layer weightedClassificationLayer. The function threw an error and could not be executed". I think the error is due to input value but i am not sure where to change these valuse. The weighted classification function works well according to input valuse assigned in example.
the code I am using for weighted classification function
%%%%%%
classdef weightedClassificationLayer < nnet.layer.ClassificationLayer
properties
% Row vector of weights corresponding to the classes in the
% training data.
ClassWeights
end
methods
function layer = weightedClassificationLayer(classWeights, name)
% layer = weightedClassificationLayer(classWeights) creates a
% weighted cross entropy loss layer. classWeights is a row
% vector of weights corresponding to the classes in the order
% that they appear in the training data.
%
% layer = weightedClassificationLayer(classWeights, name)
% additionally specifies the layer name.
% Set class weights.
layer.ClassWeights = classWeights;
% Set layer name.
if nargin == 2
layer.Name = name;
end
% Set layer description
layer.Description = 'Weighted cross entropy';
end
function loss = forwardLoss(layer, Y, T)
% loss = forwardLoss(layer, Y, T) returns the weighted cross
% entropy loss between the predictions Y and the training
% targets T.
N = size(Y,4);
Y = squeeze(Y);
T = squeeze(T);
W = layer.ClassWeights;
loss = -sum(W*(T.*log(Y)))/N;
end
function dLdY = backwardLoss(layer, Y, T)
% dLdX = backwardLoss(layer, Y, T) returns the derivatives of
% the weighted cross entropy loss with respect to the
% predictions Y.
[~,~,K,N] = size(Y);
Y = squeeze(Y);
T = squeeze(T);
W = layer.ClassWeights;
dLdY = -(W'.*T./Y)/N;
dLdY = reshape(dLdY,[1 1 K N]);
end
end
end

채택된 답변

Pujitha Narra
Pujitha Narra 2019년 10월 11일
This is a way to initialize 'classWeights'
classWeights = 1./countcats(YTrain);
classWeights = classWeights'/mean(classWeights);
and you can use it here:
Network = [
imageInputLayer([256 256 3],"Name","imageinput")
convolution2dLayer([3 3],2,"Name","conv","Padding","same")
reluLayer("Name","relu")
softmaxLayer("Name","softmax")
weightedClassificationLayer(classWeights)
];
I think this should solve the problem.
  댓글 수: 6
Pujitha Narra
Pujitha Narra 2019년 10월 14일
Can you share the code your are using?
Raza Ali
Raza Ali 2019년 10월 14일
I am using two different image types( two classes A and B). Each Image has size: 256 by 256 by 3
%%%Start
imds = imageDatastore('Images','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
YTrain=imdsTrain.Labels;
YTrain = removecats(YTrain);
classWeights = 1./countcats(YTrain)
classWeights = classWeights'/mean(classWeights)
Network = [
imageInputLayer([256 256 3],"Name","data")
convolution2dLayer([3 3],16,"Name","conv1","BiasLearnRateFactor",2,"Stride",[4 4])
reluLayer("Name","relu1")
crossChannelNormalizationLayer(5,"Name","norm1","K",1)
maxPooling2dLayer([3 3],"Name","pool1","Stride",[2 2])
convolution2dLayer([3 3],32,"Name","conv","Padding","same")
reluLayer("Name","relu5")
maxPooling2dLayer([3 3],"Name","pool5","Stride",[2 2])
fullyConnectedLayer(2,"Name","fc8","BiasLearnRateFactor",2)
softmaxLayer("Name","prob")
weightedClassificationLayer("classWeights")
];
Options = trainingOptions('sgdm', ...
'MiniBatchSize',5, ...
'MaxEpochs',3, ...
'Shuffle','every-epoch', ...
'InitialLearnRate',1e-4, ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',2100, ...
'Verbose',true, ...
'Plots','training-progress');
TrainedNetwork = trainNetwork(imdsTrain,Network,Options);

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Pujitha Narra
Pujitha Narra 2019년 10월 10일
Hi Raza Ali,
Can you mention how are you using 'weightedClassificationLayer' in your network? Assuming you want to know the inputs to the constructor of this class:
'classWeights' and the layer's 'name' are the only inputs.
'classWeights'-. classWeights is a row vector of weights corresponding to the classes in the order that they appear in the training data.
'name' -additionally specifies the layer name.
Also this example might be of help
Hope this helps!
  댓글 수: 8
Raza Ali
Raza Ali 2019년 10월 11일
Network = [
imageInputLayer([256 256 3],"Name","imageinput")
convolution2dLayer([3 3],2,"Name","conv","Padding","same")
reluLayer("Name","relu")
softmaxLayer("Name","softmax")
weightedClassificationLayer('classWeights')
];
evelyn
evelyn 2024년 4월 29일
'ClassWeights', classWeights is a row vector of weights corresponding to the classes in the order that they appear in the training data.
how about the train data is shuffle? how to do that?

댓글을 달려면 로그인하십시오.


Ashwin
Ashwin 2022년 7월 13일
Try to use classWeights' instead of classWeights
And check if it works

카테고리

Help CenterFile Exchange에서 Image Data Workflows에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by