2016-09-06 1 views
0

Я тренирую CNN в Caffe, выход которого является либо одним из двух классов (двоичная проблема).Caffe: классы балансировки внутри пакета с слоем ImageData

Я использую слой ImageData в качестве входного слоя, передавая два .txt с набором для обучения и проверки. Эти файлы сбалансированы, i.e., количество примеров одинаково для обоих классов. В этом слое я также использую параметр «shuffle».

По этому поводу у меня есть два сомнения:

1. Как партия оцифровывается/выбирается из .txt файлов?

построен ли он, получив первые N примеров (скажем, N является размером партии) файла, перетасовки их и кормить их к сети? В этом смысле сама партия не может быть сбалансирована. Это влияет на обучение/точную настройку?

Другим способом будет случайным образом образца N/2 примеров из одного класса и N/2 от других, но я не думаю, что Caffe делает это.

2. Порядок примеров в .txt-файлах заключается в том, как устроена партия?

Было бы неплохо создать файл .txt так, чтобы партия была сбалансирована (например, каждая нечетная строка имеет один класс, а каждый четный - другой)?

Благодарим за помощь!

ответ

1

(1) Да, перетасовать будет рандомизировать порядок примеров ввода, при условии, , что примеры надлежащим образом разграничены - например, с помощью линии каналы для разделения предложений на отдельные примеры. Caffe не беспокоится о балансировке каждой партии по классам.

Это оказывает незначительное влияние на обучение, но должно быть в конечном итоге в конечном итоге. Важно, чтобы каждый пример представлялся ровно один раз за эпоху.

(2) Предварительная балансировка не имеет значения: shuffle изменяет порядок по своему усмотрению (генерирование случайных чисел).

+0

Полезно знать, @Prune! Большое спасибо за ваш ответ! – rafaspadilha

+0

Рад помочь. Спасибо, что приняли ответ - это помогает СО правильно архивировать вопрос. – Prune

1

У вас есть два варианта:

1- Предварительно уравновешивании данные и отключить случайный порядок.

2- Создайте свои собственные партии «на лету»: на python вы можете создать свою собственную партию в виде массива numpy и передать ее в сеть. Проверьте this post, чтобы узнать, как вводить данные с помощью интерфейса python. В этом случае вы можете создать любую партию, которая соответствует вашим потребностям, и вы также можете ее сбалансировать. при использовании раствора Deploy (третье решение в данной должности), вы можете подать в данных следующим образом: При использовании версии Deploy, вы можете установить входные данные для вашей сети, как это:

x = data; 
y = labels; 
solver.net.blobs['data'].data[...] = x 
net.blobs['label'].data[...] = y 

Вы затем может вызвать solver.net.step(1) для запуска сети для одной итерации (forward + backpropagation).