【问题标题】:Transfer Learning for Regression in MatlabMatlab中回归的迁移学习
【发布时间】:2020-03-10 21:08:00
【问题描述】:

我正在尝试实现一个模型,该模型将图像作为输入并给出 26 个数字的向量。我此时正在通过以下Matlab代码使用VGG-16:

analyzeNetwork(net);
NUM_OUTPUT = 26;
layers = net.Layers;
%output = fullyConnectedLayer(NUM_OUTPUT, ...
%                             'Name','output_layer', ...
%                             'WeightLearnRateFactor',10, ...
%                             'BiasLearnRateFactor',10);
layers = [
    layers(1:38)
    fullyConnectedLayer(NUM_OUTPUT)
    regressionLayer];

%layers(1:67) = freezeWeights(layers(1:67));
miniBatchSize  = 5;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions('sgdm',...
    'InitialLearnRate',0.001, ...
    'ValidationData',{XValidation,YValidation},...
    'Plots','training-progress',...
    'Verbose',false);

net = trainNetwork(XTrain,YTrain,layers,options);
YPred = predict(net,XValidation);
predictionError = YValidation - YPred;
thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numImagesValidation = numel(YValidation);

accuracy = numCorrect/numImagesValidation;
rmse = sqrt(mean(predictionError.^2));

XTrain 和 YTrain 的形状如下:
XTrain: 224 224 3 140
YTrain: 26 140

通过运行上面的代码(它是代码的一部分而不是全部)我得到以下错误:

使用 trainNetwork 时出错(第 170 行) X 和 Y 中的观察数不一致。

如果有人能帮助我找出问题所在,我将不胜感激,因为据我所知,两者中的样本数量是相等的,其余维度没有必要相等。

【问题讨论】:

    标签: matlab regression transfer-learning


    【解决方案1】:

    将 YTrain 转置为 140x26。

    为您的新图层命名,并将它们命名为layerGraph

    回归很容易变得不稳定,因此如果你得到一些 nan,请降低学习率或增加批量大小。

    net = vgg16 ; % analyzeNetwork(net);
    LAYERS_FREEZE_UNTIL=35;
    LAYERS_COPY_UNTIL=38;
    
    
    NUM_TRAIN_SAMPLES = size(YTrain,1);
    NUM_OUTPUT = size(YTrain,2);
    
    
    my_layers =layerGraph([
        freezeWeights(net.Layers(1:LAYERS_FREEZE_UNTIL))
        net.Layers(LAYERS_FREEZE_UNTIL+1:LAYERS_COPY_UNTIL)
        fullyConnectedLayer(NUM_OUTPUT*2,'Name','my_fc1')
        fullyConnectedLayer(NUM_OUTPUT,'Name','my_fc2')
        regressionLayer('Name','my_regr')
        ]);
    % figure; plot(my_layers), ylim([0.5,6.5])
    % analyzeNetwork(my_layers);
    
    MINI_BATCH_SIZE = 16;
    
    options = trainingOptions('sgdm', ...
        'MiniBatchSize',MINI_BATCH_SIZE, ...
        'MaxEpochs',20, ...
        'InitialLearnRate',1e-4, ...
        'Shuffle','every-epoch', ...
        'ValidationData',{XValidation,YValidation}, ...
        'ValidationFrequency',floor(NUM_TRAIN_SAMPLES/MINI_BATCH_SIZE), ...
        'Verbose',true, ...
        'Plots','training-progress');
    
    my_net = trainNetwork(XTrain,YTrain,my_layers,options);
    

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2018-01-21
      • 2021-05-01
      • 2017-09-14
      • 2020-05-13
      • 2018-10-04
      • 2019-12-17
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多