我正在尝试使用MATCONVNET构建自己的CNN(Alexnet模型)进行交通标志识别。我使用德国交通标志识别基准(GTSRB)网站(http://benchmark.ini.rub.de/?section=gtsrb&subsection=datase)的图像数据集来创建我自己的IMDB,其中包括43种道路交通标志的标记良好的训练,验证和测试数据。
现在我遇到了两个挑战。
我的网络没有收敛。我的稳定误差为0.977
我正在尝试评估我训练有素的网络,即使有这个错误率,但那是我最大的挑战。我还没有弄清楚如何在MATCONVNET中评估自我训练的网络,而且很少有帮助的材料可以提供帮助。
如果您对我需要改变或做得更好有所了解,请有人帮忙吗?
答案 0 :(得分:0)
我对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(...)
,您可以代表所有可能的配置,并测试每个配置以进行列车测试。很快变得不可思议。选择任意的,大量的这些配置也是有效的。如果您的观察数字非常低,则可以低成本使用,尤其是在使用bootstrapping进行验证时。可能与您的分析无关。