답변이 달리지는 않았지만 거의 해결한 것 같습니다.
혹 저와 같은 문제를 겪는 분들을 위해 코멘트를 남깁니다.
trainingOptions 함수에서 validation patience 옵션을 설정하지 않고,
OutputFcn을 옵션과 커스텀 조기 종료 함수를 선언하니 정상적으로 훈련이 지속됩니다.
아래 저의 코드를 남깁니다.
function output = ver_1120_training1(params, monitor)
load('C:\Users\UserPc\OneDrive\Master\Main project\2. AST\2. Extracting the color of PDA beads/Label data/ver_1116/polygonLabel.mat','polygonTable','detector');
load('C:\Users\UserPc\OneDrive\Master\Main project\2. AST\2. Extracting the color of PDA beads/Label data/ver_1120/polygonLabel.mat');
trainDs = transform(arrayDatastore(polygonTable,'OutputType','same'),@trainingDataTransformFcn);
validDs = transform(arrayDatastore(test,'OutputType','same'),@validationDataTransformFcn);
options = trainingOptions(params.solver,"Momentum",params.momentum,...
"MaxEpochs",100,"MiniBatchSize",2,"ExecutionEnvironment","multi-gpu",...
"Shuffle","every-epoch","InitialLearnRate",params.initLearnRate,"LearnRateSchedule","piecewise",...
"LearnRateDropPeriod",params.dropPeriod,"LearnRateDropFactor",params.dropFactor,...
"ValidationData",validDs,"ValidationFrequency",50,...
"OutputNetwork","best-validation-loss",...
"BatchNormalizationStatistics","moving","ResetInputNormalization",false,...
"OutputFcn",@(info)stopFcn(info,10,params.initLearnRate));
[trainedDetector, info] = trainMaskRCNN(trainDs,detector,options,"ExperimentMonitor",monitor);
output.trainedDetector = trainedDetector;
output.info = info;
end
% validation patience를 대체하는 커스텀 조기 종료 함수
function stop = stopFcn(info, N, C)
stop = false;
persistent bestValLoss
persistent count
start = C;
% info.State 변수가 없으므로,
% 훈련 시작 시 count를 초기화 하는 조건에 initial learning rate를 이용한다.
% initial learning rate value가 유지되는 동안에는 훈련이 유지된다.
if start == info.LearnRate
bestValLoss = inf;
count = 0;
% 검증 손실값이 최저값을 갱신하면 count를 초기화한다.
elseif info.ValidationLoss < bestValLoss
bestValLoss = info.ValidationLoss;
count = 0;
% 검증 손실값이 같거나 증가하면 count에 1을 더한다.
else
count = count + 1;
end
% count가 지정된 임계값 (= validation patience) 이상이 되면 훈련을 중지한다.
if count >= N
stop = true;
end
end