2015-08-20 7 views
1

Я работаю над набором данных MNIST и с помощью увеличения данных для обучения нейронной сети. У меня есть BatchIterator, который случайным образом извлекает из каждого изображения 24, 24 поддим и использует его как вход для NN.Совокупные прогнозы с увеличением данных в лазаньи

Что касается обучения, все идет штрафом. Но для предсказания, я хочу, чтобы извлечь 5 суб-изображений из данного изображения, и в среднем прогнозы, но я не могу заставить его работать:

Вот мой BatchIterator:

class CropIterator(BatchIterator): 

    def __init__(self, batch_size, crop=4, testing=False): 
     super(CropIterator, self).__init__(batch_size) 
     self.testing = testing 
     self.crop = crop 


    def transform(self, Xb, yb): 
     crop = self.crop 
     batch_size, channels, width, height = Xb.shape 
     if not self.testing: 
      y_new = yb  
      X_new = np.zeros([batch_size, channels, width - crop, height - crop]).astype(np.float32) 
      for i in range(batch_size): 
       x = np.random.randint(0, crop+1) 
       y = np.random.randint(0, crop+1) 
       X_new[i] = Xb[i, :, x:x+width-crop, y:y+height-crop] 
     else: 
      X_new = np.zeros([5 * batch_size, channels, width - crop, height - crop]).astype(np.float32) 
      y_new = np.zeros(5 * batch_size).astype(np.int32) 
      for i in range(batch_size): 
       for idx, position in enumerate([(0,0), (0, crop), (crop, 0), (crop, crop), (crop//2, crop//2)]): 
        # all extreme cropppings + the middle one 
        x_idx = position[0] 
        y_idx = position[1] 
        X_new[5*i+idx, :] = Xb[i, :, x_idx:x_idx+width-crop, y_idx:y_idx+height-crop] 
        y_new[5*i+idx] = yb[i] 
     return X_new, y_new 

Fitting мою сеть к подготовка данных работает, но когда я делаю net.predict(X_test), я получаю сообщение об ошибке, потому что CropIterator.transform(), я считаю, вызвал с yb, равным None.

вот полный стек вызовов:

/usr/local/lib/python2.7/site-packages/nolearn/lasagne/base.pyc in predict(self, X) 
    526    return self.predict_proba(X) 
    527   else: 
--> 528    y_pred = np.argmax(self.predict_proba(X), axis=1) 
    529    if self.use_label_encoder: 
    530     y_pred = self.enc_.inverse_transform(y_pred) 

/usr/local/lib/python2.7/site-packages/nolearn/lasagne/base.pyc in predict_proba(self, X) 
    518  def predict_proba(self, X): 
    519   probas = [] 
--> 520   for Xb, yb in self.batch_iterator_test(X): 
    521    probas.append(self.apply_batch_func(self.predict_iter_, Xb)) 
    522   return np.vstack(probas) 

/usr/local/lib/python2.7/site-packages/nolearn/lasagne/base.pyc in __iter__(self) 
    78    else: 
    79     yb = None 
---> 80    yield self.transform(Xb, yb) 
    81 
    82  @property 

<ipython-input-56-59463a9f9924> in transform(self, Xb, yb) 
    33      y_idx = position[1] 
    34      X_new[5*i+idx, :] = Xb[i, :, x_idx:x_idx+width-crop, y_idx:y_idx+height-crop] 
---> 35      y_new[5*i+idx] = yb[i] 
    36   return X_new, y_new 
    37 

TypeError: 'NoneType' object has no attribute '__getitem__' 

Любая идея о том, как это исправить в испытательной части CropIterator.transform()?

ответ

1

Глядя на code for nolearn.lasagne.BatchIterator и how it is used по nolearn.lasagne.NeuralNet класса, это выглядит как BatchIterator сек необходимости работать, когда y не предусмотрено, то есть в режиме прогнозирования. Обратите внимание на вызов в line 520, где указывается X, но для y не указано значение, поэтому оно по умолчанию None.

Ваш CropIterator в настоящее время предполагает, что yb всегда имеет значение не None. Я не знаю, имеет ли смысл делать что-нибудь полезное, когда yb не предоставляется, но я предполагаю, что вы можете просто преобразовать Xb и вернуть None для y_new, если yb - None.

+0

Действительно! Я заменил 'y_new [5 * i + idx] = yb [i]' в тестируемой части на 'y_new = np.repeat (yb, 5), если yb не является None else None' (тот же идентификатор, что и 'для i в диапазоне (batch_size):'), и он работает отлично. –