Совокупные прогнозы с увеличением данных в лазаньи

Я работаю над набором данных 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

Подгонка моей сети к тренировочным данным работает, но когда я делаю 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 ответ

Решение

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

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

Другие вопросы по тегам