如果我没有足够的数据,如何训练神经网络?

人工智能 神经网络 反向传播 优化 matlab
2021-11-03 03:18:29

我创建了一个能够识别数字 1-5 的图像的神经网络。问题是我有一个 16x5 图像的数据库,不幸的是,由于神经网络在测试集中失败,因此证明不够。有没有办法在不使用更多数据的情况下提高神经网络的性能?ANN 在训练集上的准确率约为 90%,在测试集上的准确率约为 50%。

代码:

clear
graphics_toolkit("gnuplot")
sigmoid = @(z) 1./(1 + exp(-z));
sig_der = @(y) sigmoid(y).*(1-sigmoid(y));


parse_image;   % This external f(x) loads the images so that they can be read. 
%13x14
num=0;
for i=1:166
  if mod(i-1,10)<=5 && mod(i-1,10) > 0
    num=num+1;
    data(:,num) = dlmread(strcat("/tmp/",num2str(i)))(:);
  end
end



function [cost, mid_layer, last_layer] = forward(w1,w2,data,sigmoid,i)
  mid_layer(:,1)=sum(w1.*data(:,i));
  mid_layer(:,2)=sigmoid(mid_layer(:,1));
  last_layer(:,1)=sum(mid_layer(:,2).*w2);
  last_layer(:,2)=sigmoid(last_layer(:,1));
  exp_res=rem(i,5);
  if exp_res==0
    exp_res=5;
  end
  exp_result=zeros(5,1); exp_result(exp_res)=1;
  cost = exp_result-last_layer(:,2);
end

function [w1, w2] = backprop(w1,w2,mid_layer,last_layer,data,cost,sig_der,sigmoid,i)
  delta(1:5) = cost;
  delta(6:20) = sum(cost' .* w2,2);
  w2 = w2 + 0.05 .* delta(1:5) .* mid_layer(:,2) .* sig_der(last_layer(:,1))';
  w1 = w1 + 0.05 .* delta(6:20) .* sig_der(mid_layer(:,1))' .* data(:,i);
end

w1=rand(182,15)./2.*(rand(182,15).*-2+1);
w2=rand(15,5)./2.*(rand(15,5).*-2+1);

for j=1:10000
  for i=[randperm(85)]
    [cost, mid_layer, last_layer] = forward(w1,w2,data,sigmoid,i);
    [w1, w2] = backprop(w1,w2,mid_layer,last_layer,data,cost,sig_der,sigmoid,i);
    cost_mem(j,i,:)=cost;
  end
end
2个回答

您可以综合增加样本数量。例如增强或无监督适应(自我训练)。通过增强,您可以使系统更加稳健,所以我真的会推荐这个。例如这个github如此小的数据库大小的问题是您的测试集也非常小,如果您的网络泛化良好或只是过拟合,您将无法正确测试。

您可以尝试使用另一个更大的网络进行迁移学习,以适应这些特征提取器并将它们用于您的问题。这可能比使用标签较少的图像从头开始训练一个新的效果更好。希望我能帮上一点忙,敬请期待。

理论上,是的,使用合成数据生成。这涉及对原始图像应用转换以生成新的“独特”图像。一些标准技术包括旋转、翻转、拉伸、缩放或增亮。显然,根据数据,并非所有这些都有意义。在您的问题中,可以使用缩放、拉伸和增亮,但不应该使用翻转。旋转可以工作,但只适用于小角度。

通常这是通过替换每个训练时期的数据集来实现的。因此,每次训练迭代中使用的图像数量相同,但图像本身已被更改。

在实践中,它不是灵丹妙药。较大的数据集通常会产生更好的模型的原因是因为新特征落在训练数据的特征分布中的概率更高。通过合成数据生成,新特征与原始特征仅略有不同,因此即使要训练的图像数量增加,特征分布也没有那么不同。手写数字有很多变化,所以如果不尝试的话,很难猜测这会有多有效。