2013-05-03 3 views
0

Я уже некоторое время работал над программой распознавания символов в MATLAB и задал пару вопросов о stackoverflow и получил хорошую обратную связь. Поэтому я решил, что снова попробую удачу.Проблемы с размером сетевого ввода

Проблема: я получаю эту ошибку в своем поезде сети.

«Размер ввода 1 не соответствует net.inputs {1} .size."

Я использую приведенные ниже рисунки. Я хочу обучить свою сеть, используя изображение 1, чтобы распознать содержимое на картинке 2. Прежде чем я смогу обучить сеть, я предварительно обрабатываю изображения. Я написал программу для извлечения каждой буквы на изображении и преобразования изображения в двоичную матрицу. Например, если моя сетка для каждой буквы 10x10, то на моем первом изображении у меня будет матрица 10x10x4 и второе изображение 10x10x2.

Итак, теперь у меня есть целевая матрица 10x10x4 и матрица ввода 10x10x2.

Для обучения сети мне нужно изменить каждый слой 10x10 на изображениях, чтобы каждый слой «преобразовывался» в строку, используя оператор (:). Итак, теперь целевая матрица имеет размер 4x100 и матрицу ввода размером 2x100.

Обучение: Я понимаю, что для того, чтобы сеть обучалась распознавать персонажей в первом изображении (цели), мне нужно обучить сеть этим целям. Таким образом, я использую следующий код.

[net, tr] = trainNNet(100, train, targets); 

Для выполнения фактического распознавания я имитирую сеть для каждой строки в своей входной матрице и записываю выходные данные с использованием индексов. Поэтому я перехожу через входную матрицу по строкам, используя for/loop, имитирую сеть и отправляю выходные данные в свою функцию findmatch. Эта функция предназначена для поиска строк в целевых объектах, где соответствует входной массив. Это не очень важно для этой ошибки.

[r c d] = size(input); 

for k = 1:d 
    input = input(k,:); 
    outputs = round(sim(net,input)); 

    [matched(:,k), ind(:,k)] = findmatch(outputs, targets); 
end 

Я хотел бы знать, почему я получаю ошибку "Input 1 размер не соответствует net.inputs {1} .size." Эта программа отлично работает, если у меня есть только одна буква на входном изображении. Любые предложения будут ценны.

targets

input

Edit: я уже упоминал выше, что я использовал (:) оператора. Это ошибка. Я использую следующий код, чтобы изменить матрицу на то, что мне нужно.

[r c d] = size(input); 
C = permute(input,[3 2 1]); 
newinput = reshape(C,d,r*c,1); 

Так, например, учитывая следующую матрицу:

input(:,:,1) = [1 2;3 4]; 
input(:,:,2) = [5 6;7 8]; 
input(:,:,3) = [9 10;11 12]; 

Вы получите:

newinput = [1,2,3,4;5,6,7,8;9,10,11,12]; 

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

[net, tr] = trainNNet(100, input, targets); 

, где ввод будет 1x100 (для одной буквы).

+0

Пожалуйста, покажите, как вы добираетесь от [10 10 4] до [4 100]. Может быть, вы делаете транспонирование, чего не хотите? – Floris

+0

@Floris Я отредактировал мое сообщение для перестройки. Я ошибался, что использовал оператор (:). Для меня это другое кодирование, которое я включил в пример. – roldy

+0

Я считаю, что нашел решение. Мне нужно добавить строки нулей во входную матрицу так, чтобы она была того же размера, что и целевая/обучающая матрица. Мне придется проверить это на разных изображениях. – roldy

ответ

0

Предполагая, что я понимаю, что для обучения сети я использую целевые значения в качестве целей, а также как входы, я нашел способ сделать имитацию.

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

Смежные вопросы