title: Training neural network for image segmentation
body: <p>I have one set of original image patches (101x101 matrices) and another corresponding set of image patches (same size 101x101) in binary which are the 'answer' for training the neural network. I wanted to train my neural network so that it can learn, recognize the shape that it's trained from the given image, and produce the image (in same matrix form 150x10201 maybe?) at the output matrix (as a result of segmentation).</p>
  
  <p>Original image is on the left and the desired output is on the right.</p>
  
  <p><img src="https://i.stack.imgur.com/v6ajq.jpg" alt="enter image description here"> <img src="https://i.stack.imgur.com/LWCsA.jpg" alt="enter image description here"></p>
  
  <p>So, as for pre-processing stage of the data, I reshaped the original image patches into vector matrices of <code>1x10201</code> for each image patch. Combining 150 of them i get a <code>150x10201</code> matrix as my input, and another <code>150x10201</code> matrix from the binary image patches. Then I provide these input data into the deep learning network. I used Deep Belief Network in this case.</p>
  
  <p>My Matlab code for setup and train DBN as below:</p>
  
  <p>%train a 4 layers 100 hidden unit DBN and use its weights to initialize a NN</p>
  
  <pre><code>rand('state',0)
  </code></pre>
  
  <p>%train dbn</p>
  
  <pre><code>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);
  </code></pre>
  
  <p>%unfold dbn to nn</p>
  
  <pre><code>nn = dbnunfoldtonn(dbn, 10201);
  nn.activation_function = 'sigm';
  </code></pre>
  
  <p>%train nn</p>
  
  <pre><code>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') &amp;&amp; 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))&gt;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
  </code></pre>
  
  <p>Can anyone let me know, is the training for the NN like this enable it to do the segmentation work? or how should I modify the code to train the NN so that it can generate the output/result as the image matrix in <code>150x10201</code> form?</p>
  
  <p>Thank you so much..</p>