【发布时间】:2019-01-31 20:07:45
【问题描述】:
我有多个数据集,即 x y 数据,每个数据集代表同一个类,我还有其他 2 个类的多个数据集。
我需要对合并的 x y 数据进行训练,还是需要为每个数据集调用训练函数,注意每个数据集是同一类?每个类类型都有多个数据集。
第 1 类有 150 x y 数据集,第 2 类有 68 个数据集,第 3 类有 55 个数据集。如何在 matlab 中训练支持向量机 (SVM)?
【问题讨论】:
标签: matlab
我有多个数据集,即 x y 数据,每个数据集代表同一个类,我还有其他 2 个类的多个数据集。
我需要对合并的 x y 数据进行训练,还是需要为每个数据集调用训练函数,注意每个数据集是同一类?每个类类型都有多个数据集。
第 1 类有 150 x y 数据集,第 2 类有 68 个数据集,第 3 类有 55 个数据集。如何在 matlab 中训练支持向量机 (SVM)?
【问题讨论】:
标签: matlab
据我了解您的项目,您希望在包含 3 个不同类的数据集上训练分类器。
通常,您希望使用您希望网络学习的类来标记您的数据,这样它就可以在训练中检查在“猜测”之后它仍然偏离解决方案的程度,以便它可以优化下一次迭代的权重。
您还希望将您的数据集拆分为一个训练集,用于学习,以及两个具有不同数据的部分,网络还不“知道”,并将提供一个很好的参考。 这两个是一个验证集,用于在训练期间进行额外的验证,另一个是一个测试集,用于在训练后测试准确性。
可以这样进行:
在 4D 矩阵 A 中累积训练数据,其中第一个二维是您的 x 和 y 的值,第三个维度是 XY 矩阵的索引。你可以使用A = horzconcat(x,y)
使用第 4 个维度根据您的班级标记您的数据。在你的情况下,在前 150 个元素中写 1,在后面的 68 中写 2,在最后 55 中写 3
随机播放您的标记数据集。你可以使用randperm创建一个随机索引,然后遍历集合
将数据集拆分为训练、验证和测试部分。 (通常60%、20%、20%是合理的)
将这些集合分别拆分为一个包含您的训练数据的 3D X 矩阵和一个包含每个训练数据的解的 Y 向量。
在您的训练选项中,使用您的验证部分指定您的验证数据,例如:
training_options = trainingOptions ...
('sgdm', ...
'Verbose', 1 ,...
'VerboseFrequency' , 20, ...
'MaxEpochs', 30, ...
'MiniBatchSize', 128, ...
'Shuffle', 'every-epoch', ...
**'ValidationData', {X_validate, categorical(Y_validate)},...**
'ValidationFrequency', 20, ...
'ValidationPatience', 5, ...
'InitialLearnRate', 0.001, ...
'L2Regularization', 0, ...
'Momentum', 0, ...
'ExecutionEnvironment', 'cpu', ...
'Plots','training-progress');
训练你的神经网络 Matlab 对象
[nn, nn_info] = trainNetwork(X_train, categorical(Y_train), ...
layers, training_options);
检索训练网络的准确率:
acurracy = sum(Y_test_predictions == categorical(Y_test) )/ ...
size(Y_test, 1)
我将此方法应用于卷积网络,效果很好。 希望这会有所帮助,
一切顺利, 西蒙
【讨论】: