培训FCN matlab不会减少损失

时间:2018-01-30 22:56:52

标签: matlab neural-network

我有一个基于完全卷积神经网络的神经网络用于语义分割/像素对象检测(FCN)并尝试使用Pascal-Context数据训练它。但是,不是数据集提供的450个类,我只想捕获12 +背景。

我准备了一个包含7000多张图像和标签贴图的数据集,并按照语义分割教程(Semantic Segmentation)进行操作,并按照与呈现的步骤类似的方式执行每一步。

然而,当我训练我的神经网络时,我的小批量丢失保持不变(检查直到前3个时期结束,然后尝试减少图像数量,但仍然是相同的值)和即使我改变学习率或其他参数,也不会改变。培训过程有问题吗?

所以我试图将图像数量减少到400,我得到的是下图。它完全没有改善。

(第一列表示条目编号,第二列迭代编号,第三次经过时间,第四列小批量丢失,批次的第五准确度,最后是学习率)。 Cos

以下是我的代码:

% MAIN FUNCTION %
outputFolder=  fullfile('imade');
imgDir = fullfile('imade','images');
labelDir = fullfile('imade','labels');

imds = imageDatastore(imgDir);

I = readimage(imds, 1);
% I = histeq(I);
% figure
% imshow(I)

classes = [ 
    "bottle"
    "chair"
    "diningtable"
    "person"
    "pottedplant"
    "sofa"
    "tvmonitor" 
    "ground"
    "wall"
    "floor"
    "keyboard"
    "ceiling"
    "background"
    ];
valueSet = { 
    [230 25 75] 
    [60 180 75]
    [255 225 25]
    [0 130 200]
    [245 130 48]
    [145 30 180]
    [128 128 0]
    [210 245 60]
    [250 190 190]
    [0 128 128]
    [170 110 40]
    [128 0 0]
    [0 0 0]
  };
pxds = pixelLabelDatastore(labelDir,classes,valueSet);

% show sample image with overlay
C = readimage(pxds, 1);
cmap = camvidColorMap;
B = labeloverlay(I,C,'ColorMap',cmap);
figure
imshow(B)
pixelLabelColorbar(cmap,classes)

% calculate frequency of class pixels
tbl = countEachLabel(pxds);

% resize images and labels to desired format 
imageFolder = fullfile(outputFolder,'imagesReszed',filesep);
imds = resizeCamVidImages(imds,imageFolder);
labelFolder = fullfile(outputFolder,'labelsResized',filesep);
pxds = resizeCamVidPixelLabels(pxds,labelFolder);

% partition dataset into test and train
[imdsTrain, imdsTest, pxdsTrain, pxdsTest] = partitionCamVidData(imds,pxds);

% create FCN net
imageSize = [225 300];
numClasses = numel(classes);
lgraph = fcnLayers(imageSize,numClasses,'type','16s');
st = fullfile('imade','checkPoint');

% adjust based on occurrence of each class
imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount;
classWeights = median(imageFreq) ./ imageFreq;
pxLayer = pixelClassificationLayer('Name','labels','ClassNames', tbl.Name, 'ClassWeights', classWeights);
lgraph = removeLayers(lgraph, 'pixelLabels');
lgraph = addLayers(lgraph, pxLayer);
lgraph = connectLayers(lgraph, 'softmax' ,'labels');

% set training parameters 
options = trainingOptions('sgdm', ...
    'Momentum', 0.9, ...
    'InitialLearnRate', 1e-3, ...
    'L2Regularization', 0.0005, ...
    'MaxEpochs', 100, ...  
    'MiniBatchSize', 1, ...
    'Shuffle', 'every-epoch', ...
    'VerboseFrequency', 2);

datasource = pixelLabelImageSource(imdsTrain,pxdsTrain);

doTraining = true;
if doTraining
    [net, info] = trainNetwork(datasource,lgraph,options);
else
    data = load (strcat(st,filesep,'convnet_checkpoint__4607__2018_01_27__21_25_03.mat'));
    war = data.net;
    [sp, info] = trainNetwork(datasource,war.Layers,options);
end

0 个答案:

没有答案