matlab - Matlab 中回归的迁移学习
问题描述
我正在尝试实现一个模型,该模型将图像作为输入并给出 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 中的观察数不一致。
如果有人可以帮助我找出问题所在,我将不胜感激,因为据我所知,两者中的样本数量是相等的,并且其他维度没有必要相等。
解决方案
将 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);
推荐阅读
- stripe-payments - 如何将 Stripe 的 API 的 risk_score 提高到 99?
- python - 对 Python 数据框中的一列求和
- android - jetpack compose 是否使用 drawable-night 文件夹?
- oracle - 使用总列的动态行到列转换
- reactjs - 在类组件中反应 useTranslation 替代方案
- android - 在数据库android中插入时间戳列
- excel - VBA UserForms noModal和Modal交互问题
- javascript - chrome 扩展通过共享本地存储将多条消息传递到外部站点
- html - 使用固定位置滚动左侧菜单
- javascript - Node.js Express.js 发送 Jquery Ajax Post 抛出常量错误 - 我被卡住了