У меня есть один набор исходных патчей изображений (матрицы 101x101) и другой соответствующий набор патчей изображений (одинаковый размер 101x101) в двоичном формате, которые являются «ответом» для обучения нейронной сети. Я хотел обучить свою нейронную сеть так, чтобы она могла учиться, распознавать форму, которую она обучала из данного изображения, и производить изображение (в той же матричной форме 150x10201, возможно?) На выходной матрице (в результате сегментации).Тренировочная нейронная сеть для сегментации изображений
Оригинальное изображение находится слева, а нужный выход - справа.
Таким образом, как и для этапа предварительной обработки данных, я видоизмененная исходные участки изображения в векторные матрицы 1x10201
для каждого фрагмента изображения. Сочетая 150 из них, я получаю матрицу 150x10201
в качестве моего ввода и другую матрицу 150x10201
из двоичных патчей изображения. Затем я предоставляю эти входные данные в сеть глубокого обучения. В этом случае я использовал Deep Verief Network.
Мой Matlab код для установки и обучить ДБН, как показано ниже:
% поезд скрытый блок ДБН 4 слоев 100 и использовать его веса для инициализации 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);
% разворачиваться ДБН Н. Н.
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
?
Большое вам спасибо.