Конфигурация Caffe для набора данных Cohn-Kanade

Я пытаюсь создать распознаватель выражения лица, используя Caffe и базу данных Cohn-Kanade.

Это моя конфигурация протокола поезда:

def configureTrainProtoTxt(lmdb, batch_size):

n = caffe.NetSpec()
n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb,
                         transform_param=dict(scale= 1 / 126.0), ntop=2)

n.conv1 = L.Convolution(n.data, kernel_size=2, pad=1, param=dict(lr_mult=1), num_output=10, weight_filler=dict(type='xavier'))
n.conv1 = L.Convolution(n.data, kernel_size=2, pad=1, param=dict(lr_mult=1), num_output=10, weight_filler=dict(type='xavier'))
n.conv1 = L.Convolution(n.data, kernel_size=5, pad=0, num_output=20, weight_filler=dict(type='xavier'))
n.pool1 = L.Pooling(n.conv1, kernel_size=5, stride=2, pool=P.Pooling.MAX)
n.conv2 = L.Convolution(n.pool1, kernel_size=3, num_output=10, weight_filler=dict(type='xavier')) 
n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX)
n.ip1 = L.InnerProduct(n.pool2, num_output=100, weight_filler=dict(type='xavier'))
n.relu1 = L.ReLU(n.ip1, in_place=True)
n.ip2 = L.InnerProduct(n.relu1, num_output=2, weight_filler=dict(type='xavier'))
n.loss = L.SoftmaxWithLoss(n.ip2, n.label)

return n.to_proto()

Это моя функция обучения, которую я получил из примера lenet:

def train(solver):

niter = 200
test_interval = 10 

train_loss = zeros(niter)
test_acc = zeros(int(np.ceil(niter / test_interval)))
output = zeros((niter, 32, 2))

for it in range(niter):
    solver.step(1)  

    train_loss[it] = solver.net.blobs['loss'].data

    solver.test_nets[0].forward(start='conv1')
    output[it] = solver.test_nets[0].blobs['ip2'].data[:32]

    if it % test_interval == 0:
        print 'Iteration', it, 'testing...'

        correct = 0

        for test_it in range(100):
            solver.test_nets[0].forward()
            correct += sum(solver.test_nets[0].blobs['ip2'].data.argmax(1) == solver.test_nets[0].blobs['label'].data)

        test_acc[it // test_interval] = correct / 1e4


_, ax1 = subplots()
ax2 = ax1.twinx()
ax1.plot(arange(niter), train_loss)
ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r')
ax1.set_xlabel('iteration')
ax1.set_ylabel('train loss')
ax2.set_ylabel('test accuracy')
show()

Я использую только Нейтральное и Удивленное лица (если я решу свою проблему, я буду использовать больше эмоций). Но моя сеть имеет только 28% точности. Я хотел бы знать, что низкая точность связана с проблемой в конфигурации сети, с логикой внутри моей функции обучения или с тем, что моя обучающая база данных слишком мала? Это описание моего набора данных:

Набор данных Train: 56 изображений нейтральных лиц. 60 изображений удивленных лиц. Тестовый набор данных: 15 изображений нейтральных лиц. 15 изображений удивленных лиц.

Все изображения 32x32 и в оттенках серого. И мой размер_пакета равен 32.

Пожалуйста, может кто-нибудь помочь мне узнать, в чем моя проблема?


comment
Уточните, пожалуйста, размер ваших обучающих и тестовых наборов. Предоставленная вами ссылка содержит файлы MS Access, которые некоторым людям (включая меня) трудно открыть.   -  person Flavio Ferrara    schedule 12.11.2015
comment
Кроме того, вы не указали размер партии.   -  person Flavio Ferrara    schedule 12.11.2015
comment
Спасибо, Флавио Феррара, я отредактировал свой вопрос.   -  person Pasdf    schedule 12.11.2015
comment
Вы пытались изменить размер пакета?   -  person Caaarlos    schedule 17.11.2015
comment
Да, я пытался. Но, как я уже сказал по этому вопросу, я получаю большую точность, чем 100 процентов. Я думаю, что моя проблема связана с моей функцией поезда. Но я не знаю, где.   -  person Pasdf    schedule 17.11.2015