训练神经网络用于图像分割

3
我有一组原始图像补丁(101x101矩阵),另一组相应的二进制图像补丁(同样大小101x101)用于训练神经网络。我想训练我的神经网络,使其能够学习和识别给定图像中训练的形状,并在输出矩阵中生成该图像(可能是150x10201的同一矩阵形式作为分割结果)。
左侧是原始图像,右侧是期望的输出。
因此,在数据的预处理阶段,我将原始图像补丁重新调整为每个图像补丁的向量矩阵1x10201。将它们中的150个组合起来,得到一个150x10201的矩阵作为我的输入,以及另一个150x10201的矩阵从二进制图像补丁中提取。然后将这些输入数据提供给深度学习网络。在这种情况下,我使用了深度置信网络。
我在Matlab中设置和训练DBN的代码如下:
%训练具有4层100个隐藏单元的DBN并使用其权重初始化NN
rand('state',0)

%训练深度信念网络

dbn.sizes = [100 100 100 100];
opts.numepochs =   5;
opts.batchsize =   10;
opts.momentum  =   0; 
opts.alpha     =   1;
dbn = dbnsetup(dbn, train_x, opts);
dbn = dbntrain(dbn, train_x, opts);

将DBN展开成NN

nn = dbnunfoldtonn(dbn, 10201);
nn.activation_function = 'sigm';

%训练神经网络

opts.numepochs =  1;
opts.batchsize = 10;

assert(isfloat(train_x), 'train_x must be a float');
assert(nargin == 4 || nargin == 6,'number ofinput arguments must be 4 or 6')

loss.train.e               = [];
loss.train.e_frac          = [];
loss.val.e                 = [];
loss.val.e_frac            = [];
opts.validation = 0;
if nargin == 6
    opts.validation = 1;
end

fhandle = [];
if isfield(opts,'plot') && opts.plot == 1
    fhandle = figure();
end

m = size(train_x, 1);

batchsize = opts.batchsize;
numepochs = opts.numepochs;

numbatches = m / batchsize;

assert(rem(numbatches, 1) == 0, 'numbatches must be a integer');

L = zeros(numepochs*numbatches,1);
n = 1;
for i = 1 : numepochs
tic;

kk = randperm(m);
for l = 1 : numbatches
    batch_x = train_x(kk((l - 1) * batchsize + 1 : l * batchsize), :);

    %Add noise to input (for use in denoising autoencoder)
    if(nn.inputZeroMaskedFraction ~= 0)
        batch_x = batch_x.*(rand(size(batch_x))>nn.inputZeroMaskedFraction);
    end

    batch_y = train_y(kk((l - 1) * batchsize + 1 : l * batchsize), :);

    nn = nnff(nn, batch_x, batch_y);
    nn = nnbp(nn);
    nn = nnapplygrads(nn);

    L(n) = nn.L;

    n = n + 1;
end

t = toc;

if opts.validation == 1
    loss = nneval(nn, loss, train_x, train_y, val_x, val_y);
    str_perf = sprintf('; Full-batch train mse = %f, val mse = %f',
loss.train.e(end), loss.val.e(end));
else
    loss = nneval(nn, loss, train_x, train_y);
    str_perf = sprintf('; Full-batch train err = %f', loss.train.e(end));
end
if ishandle(fhandle)
    nnupdatefigures(nn, fhandle, loss, opts, i);
end

disp(['epoch ' num2str(i) '/' num2str(opts.numepochs) '. Took ' num2str(t) '  seconds' '. Mini-batch mean squared error on training set is ' num2str(mean(L((n-numbatches):(n-1)))) str_perf]);
nn.learningRate = nn.learningRate * nn.scaling_learningRate;
end

请问,像这样的NN训练是否能使其进行分割工作?或者我应该如何修改代码来训练NN,以便它可以生成形式为150x10201的图像矩阵输出/结果?

非常感谢。

1个回答

1
你的输入太大了。你应该尝试使用从19x19到最大30x30的较小补丁(这已经代表了900个神经元进入输入层)。
然后是你的主要问题:你只有150张图片!当你训练一个神经网络时,你需要至少三倍于你的神经网络中的权重的训练实例。所以非常小心地选择你的体系结构。
卷积神经网络可能更适合你的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接