ВУЗ:
Составители:
49
Sum: real // Взвешенная сумма входов
end;
const SourceSize=100; // Размер стороны исходного изображения
DestSize=40; // Размер стороны изображения для распознавания
N=DestSize*DestSize; // Сколько входов
m=10; // Сколько образов
e=-1/(M*2); // Вес синапсов второго слоя
var InputRow: array[1..m] of InputNeiron//Первый слой нейронов
SecondRow: array[1..m] of Neiron//Второй слой нейронов
I1,I2: TImage;//Эталонный и масштабированный образы
Outputs=array[1..m] of real; // Копия выходов предыдущего прохода
i,j,x,y,count,max, index:integer;
Алгоритм обучения сети Хэмминга , адаптированный для данной задачи, выглядит
следующим образом .
1. Выбирается i-й входной образ.
2. Изображение локализуется и приводится к нужному масштабу.
3. Образ поточечно подаётся на входы i-го нейрона . Если k-я точка образа
чёрная, то весу k-го входа присваивается значение 0.5, в противном случае -0.5 .
4. Переход на шаг 1, пока не будут исчерпаны все эталонные образы .
Программный код алгоритма обучения:
I1:=TImage.Greate(self);
I2:=TImage.Greate(self);
I2.Width:=DestSize;
I2.Height:=DestSize;
for i:=1 to m do
begin
I1.Picture.LoadFromFile(IntToStr(i-1)+’.bmp’);
vScale(I1,I2); // Читаем и масштабируем образ
end;
for x:=1 to DestSize do
for y:=1 to DestSize do // Перебираем поточечно
if(I2.Canvas.Pixels[x-1,y-1]=clBlack)then InputRow[i].W[x*DestSize+y]=0.5;
else InputRow[i].W[x*DestSize+y]=-0.5;
Для успешной работы нужно выяснить точный размер и местоположение образа
цифры. После локализации — приводим образ к размеру 40*40 (масштабирова -
ние). Эти операции выполняет функция vScale(I1:TImage, var I2:TImage)- как
на этапе обучения сети, так и на этапе распознавания. Для эталона , ввиду
отсутствия помех, локализацию провести очень просто: достаточно последова -
тельно просмотреть все точки образа и найти границы цифры.
Локализация и масштабирование:
var MinX,MinY,MaxX,MaxY:integer; // Границы локализованной цифры
ScaleX, ScaleY: real//// Коэффициенты сжатия
begin
MinX:= SourceSize+1;
MinY= MinX;
MaxX= -1;
MaxY= -1;
for x:=0 to SourceSize-1 do//массив Pixels нумеруется с 0
for y:=0 to SourceSize-1 do
if I1.Canvas.Pixels[x,y]=clBlack then begin
if x<MinX then MinX=x;
if y<MinY then MinY=y;
if x>iMaxX then MaxX=x;
if y>iMaxY then MaxY=y end;
49 Sum: real // Взвешенная сумма входов end; const SourceSize=100; // Размер стороны исходного изображения DestSize=40; // Размер стороны изображения для распознавания N=DestSize*DestSize; // Сколько входов m=10; // Сколько образов e=-1/(M*2); // Вес синапсов второго слоя var InputRow: array[1..m] of InputNeiron// Первый слой нейронов SecondRow: array[1..m] of Neiron//Второй слой нейронов I1,I2: TImage;//Эталонный и масштабированный образы Outputs=array[1..m] of real; // Копия выходов предыдущего прохода i,j,x,y,count,max, index:integer; Алгоритм обучения сети Хэмминга, адаптированный для данной задачи, выглядит следующим образом. 1. Выбирается i-й входной образ. 2. Изображение локализуется и приводится к нужному масштабу. 3. Образ поточечно подаётся на входы i-го нейрона. Если k-я точка образа чёрная, то весу k-го входа присваивается значение 0.5, в противном случае -0.5 . 4. Переход на шаг 1, пока не будут исчерпаны все эталонные образы. Программный код алгоритма обучения: I1:=TImage.Greate(self); I2:=TImage.Greate(self); I2.Width:=DestSize; I2.Height:=DestSize; for i:=1 to m do begin I1.Picture.LoadFromFile(IntToStr(i-1)+’.bmp’); vScale(I1,I2); // Читаем и масштабируем образ end; for x:=1 to DestSize do for y:=1 to DestSize do // Перебираем поточечно if(I2.Canvas.Pixels[x-1,y-1]=clBlack)then InputRow[i].W[x*DestSize+y]=0.5; else InputRow[i].W[x*DestSize+y]=-0.5; Для успешной работы нужно выяснить точный размер и местоположение образа цифры. После локализации — приводим образ к размеру 40*40 (масштабирова- ние). Эти операции выполняет функция vScale(I1:TImage, var I2:TImage)- как на этапе обучения сети, так и на этапе распознавания. Для эталона, ввиду отсутствия помех, локализацию провести очень просто: достаточно последова- тельно просмотреть все точки образа и найти границы цифры. Локализация и масштабирование: var MinX,MinY,MaxX,MaxY:integer; // Границы локализованной цифры ScaleX, ScaleY: real//// Коэффициенты сжатия begin MinX:= SourceSize+1; MinY= MinX; MaxX= -1; MaxY= -1; for x:=0 to SourceSize-1 do//массив Pixels нумеруется с 0 for y:=0 to SourceSize-1 do if I1.Canvas.Pixels[x,y]=clBlack then begin if xiMaxX then MaxX=x; if y>iMaxY then MaxY=y end;