Arcface loss, sphereface loss

Hi
Is there any implementation of arcface loss or sphereface loss in MATLAB deep leaning toolbox?
Best Regards
Sameed

回答 (2 件)

Harsha Priya Daggubati
Harsha Priya Daggubati 2020 年 5 月 11 日

0 投票

Hi,
Currently there is no support for arcface or sphereface loss in MATLAB.
xingxingcui
xingxingcui 2020 年 11 月 21 日
編集済み: xingxingcui 2021 年 1 月 13 日

0 投票

6 件のコメント

Syed Sameed Husain
Syed Sameed Husain 2020 年 11 月 21 日
Hi Cui
I developed my own arcface layer which works well for image retrieval task. I used a pretrained ResNet101 and removed FC and loss layer. Then I added the my own FC layer and arcface loss layer to lgraph by using following script, where num_classes is the number of classes in training datat:
num_classes=20000;
in=2048;
out=num_classes;
sc = sqrt(3/(1*1*in)) ;
weights = (rand(out,in, 'single')*2 - 1)*sc ;
CFC = cosineFC('CFC',weights);
CFC=setLearnRateFactor(CFC,'Weights',10);
factor1=getLearnRateFactor(CFC,'Weights');
lgraph = addLayers(lgraph,CFC);
lgraph = connectLayers(lgraph,'gap','CFC');
The cosineFC layer computes the dot product between L2-normalized weights and L2-normalised features
classdef cosineFC < nnet.layer.Layer
% Example custom PReLU layer.
properties (Learnable)
% Layer learnable parameters
% Scaling coefficient
Weights
end
methods
function layer = cosineFC(name,Weights)
layer.Name = name;
% Set layer description.
layer.Description = "cosineFC ";
% Initialize scaling coefficient.
layer.Weights = Weights;
end
function Z = predict(layer, X)
% Z = predict(layer, X) forwards the input data X through the
X=L2_Norm(X,3);
layer.Weights=L2_Norm(layer.Weights,2);
bias = zeros(size(layer.Weights,1),1);
Z = fullyconnect(X,layer.Weights,bias,'DataFormat','SSCB');
Z=permute(Z,[3 4 1 2]);
end
end
Finally I modified regression loss for arcface loss optimization
classdef arcloss < nnet.layer.RegressionLayer
% Example custom regression layer with mean-absolute-error loss.
methods
function layer = arcloss(name)
% layer = maeRegressionLayer(name) creates a
% mean-absolute-error regression layer and specifies the layer
% name.
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = 'arcface loss';
end
function loss = forwardLoss(layer, cosine, Y)
cosine=dlarray(squeeze(cosine),'CB');
Y=squeeze(Y);
m=0.3;
s=30;
cos_m = cos(m);
sin_m = sin(m);
th = cos(pi - m);
mm = sin(pi - m) * m;
cs=(1-cosine.^2);
cs_limit=max(min(cs,1),0);
sine=sqrt(cs_limit);
phi = cosine * cos_m - sine * sin_m;
cos_th=cosine-mm;
idx=cosine<th;
phi(idx) = cos_th(idx);
output = (Y .* phi) + ((1 - Y) .* cosine);
output = output*s;
dlYPred = softmax(output);
loss = crossentropy(dlYPred,Y);
end
end
end
It works very well on Google landmarks retrieval v2 dataset.
xingxingcui
xingxingcui 2020 年 11 月 22 日
How do you input the value format of label in the "trainNetwork" function? Can you post your code here, thank you!"Regression network" requires discrete values, I don’t know how to input.
Syed Sameed Husain
Syed Sameed Husain 2020 年 11 月 22 日
Hi Cui
Yes we have to create our datastore for regression net. Here is the sample code
% delete old pool
poolobj=gcp('nocreate');
delete(poolobj);
%% convert net to layer graph
lgraph=layerGraph(net); clear net
%% Get database for regression problem
imds = imageDatastore('landmarks','LabelSource','foldernames','IncludeSubfolders',true);
Predictor=imds.Files;
lb=single(imds.Labels);
num_classes=size(unique(lb),1);
Y = zeros(length(lb), num_classes, 'single');
for i=1:length(lb)
Y(i,lb(i))=1;
end
responseName=Y;
T=table(Predictor,responseName);
auimds=augmentedImageDatastore([224 224 3],T,'responseName');
%% train network
miniBatchSize = 32;
options = trainingOptions('sgdm', ...
'Momentum',0.9, ...
'InitialLearnRate',1e-3, ...
'MaxEpochs',5, ...
'MiniBatchSize',miniBatchSize, ...
'ExecutionEnvironment','multi-gpu', ...
'CheckpointPath','/scratch/');
net = trainNetwork(auimds,lgraph,options);
xingxingcui
xingxingcui 2020 年 11 月 23 日
@Syed Sameed Husain
Thank you very much for your useful code!
Dunil Kasturiratna
Dunil Kasturiratna 2022 年 4 月 28 日
In your cosineFC layer what is the L2_Norm function? may I have the code. Thank You
Dunil Kasturiratna
Dunil Kasturiratna 2022 年 4 月 28 日
In your cosineFC layer what is the L2_Norm function? may I have the code. Thank You

サインインしてコメントする。

製品

リリース

R2020a

タグ

質問済み:

2020 年 5 月 8 日

コメント済み:

2022 年 4 月 28 日

Community Treasure Hunt

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

Start Hunting!

Translated by