我正在尝试使用MATCONVNET构建自己的CNN(Alexnet模型)用于交通标志识别。我使用德国交通标志识别基准 (GTSRB) 网站 (http://benchmark.ini.rub.de/?section=gtsrb&subsection=datase) 的图像数据集创建了我自己的 IMDB,其中包括 43 类道路交通标志的标记良好的训练、验证和测试数据。
现在我面临两个挑战。
-
我的网络没有收敛。我的稳定误差约为 0.977
-
即使有这样的错误率,我也在尝试评估我训练好的网络,但这是我面临最大挑战的地方。我一直无法弄清楚如何在MATCONVNET中评估自我训练的网络,并且几乎没有有用的材料可以提供帮助。
如果您对我需要改变或做得更好的想法,请有人帮忙?
我对 MATCONVNET 不太熟悉,所以我可能误解了您的问题,但评估分类器的一般规则是交叉验证(即在不同的子集上进行训练和测试,并在多个子集配置中重复)。
对于一种配置
生成一个可以使用的数据配置
nObservations = size(data,1);
y_act = ... ; % class labels for each observation
ratio = .5;
net = ... %your net definition
[Train,Test] = crossvalind('HoldOut',nObservations,ratio);
[net,...] = train(net,data(Train,:))
y_exp = predict(net,data(Test,:))
rate = length(find(y_exp == y_act(Test)))/...
numel(y_act(Test));
比率是比原始指标更好的指标。根据您的模型,您可能希望确保类以均匀的比例分布(甚至可能是相等的数量,这将需要您抛出一些观察值,以便您获得相等的类总数)。为了确保这一点,您可以使用crossvalind
独立划分每个类,然后合并以形成训练/测试集。
你也可以玩你的训练:测试比率.5是一个很好的起点。如果您在对测试集进行分类时遇到困难,请逐渐增加。
排列配置
此分析的一个问题是仅评估一个配置。对于泛化不重要的海量数据集或集,这可能没问题。但是你可以通过将上述分析排列在一起来解决这个问题。
集合配置中的所有组合
假设您将数据集分为 A、B、C 和 D。你可以训练([A,B,C])-测试(D), 训练(A,B,D)-测试(C), ...训练(B,C,D)-测试(A)和平均预测率
这通常是"足够好"的,但你必须承认,在小数据集中,你的一个集合中可能会有一个倾斜的表示
。集合中的所有可能配置
使用
nchoosek(...)
您可以表示所有可能的配置并测试每个配置以进行训练测试。变得不可思议的长得非常快。选择任意的大量这些配置也可以。如果您的观察值非常低,那么这在低成本下很有用,尤其是在使用自举进行验证时。可能与您的分析无关。