Я уже некоторое время работал над программой распознавания символов в 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." Эта программа отлично работает, если у меня есть только одна буква на входном изображении. Любые предложения будут ценны.
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 (для одной буквы).
Пожалуйста, покажите, как вы добираетесь от [10 10 4] до [4 100]. Может быть, вы делаете транспонирование, чего не хотите? – Floris
@Floris Я отредактировал мое сообщение для перестройки. Я ошибался, что использовал оператор (:). Для меня это другое кодирование, которое я включил в пример. – roldy
Я считаю, что нашел решение. Мне нужно добавить строки нулей во входную матрицу так, чтобы она была того же размера, что и целевая/обучающая матрица. Мне придется проверить это на разных изображениях. – roldy