我在做一个关于用BP神经网络给高光谱图像分类的算法,一个像素有220个光谱数据,每个像素对应了一类,已知的是一共有17类,现在我将每类数据都找到,并在其中选出训练集和测试集。训练集对应的输出就是类别号,如1,2,3,4等。训练好网络之后我将类别1的测试集带入到网络中,计算出的输出却和1相差甚远。下面附上图和源代码,麻烦各路大神帮忙看看,本人也是刚接触这方面的知识。
clc; clear all; close all; %1.导入数据
load('C:\Users\胡磊\Desktop\Indian_pines.mat')
load('C:\Users\胡磊\Desktop\Indian_pines_gt.mat') %将145*145*220的3维数据变为2维矩阵 x =
reshape(indian_pines,145*145,220); y = reshape(indian_pines_gt,145*145,1);
%将所有的分类找到,并分出训练集与测试集 %A1代表了类别为1的所在的行,B1代表了第1类所对应的波段 A1 = find(y == 1); B1 =
x(A1,:); %A2代表了类别为2的所在的行,B2代表了第2类所对应的波段 A2 = find(y==2); B2 = x(A2,:);
%A3代表了类别为3的所在的行,B3代表了第3类所对应的波段 A3 = find(y == 3); B3 = x(A3,:);
%A4代表了类别为4的所在的行,B4代表了第4类所对应的波段 A4 = find(y == 4); B4 = x(A4,:);
%A5代表了类别为5的所在的行,B5代表了第5类所对应的波段 A5 = find(y == 5); B5 = x(A5,:);
%A6代表了类别为6的所在的行,B6代表了第6类所对应的波段 A6 = find(y == 6); B6 = x(A6,:);
%A7代表了类别为7的所在的行,B7代表了第7类所对应的波段 A7 = find(y == 7); B7 = x(A7,:);
%A8代表了类别为8的所在的行,B8代表了第8类所对应的波段 A8 = find(y == 8); B8 = x(A8,:);
%A9代表了类别为9的所在的行,B9代表了第9类所对应的波段 A9 = find(y == 9); B9 = x(A9,:);
%A10代表了类别为10的所在的行,B10代表了第10类所对应的波段 A10 = find(y == 10); B10 = x(A10,:);
%A11代表了类别为11的所在的行,B11代表了第11类所对应的波段 A11 = find(y == 11); B11 = x(A11,:);
%A12代表了类别为12的所在的行,B12代表了第12类所对应的波段 A12 = find(y == 12); B12 = x(A12,:);
%A13代表了类别为13的所在的行,B13代表了第13类所对应的波段 A13 = find(y == 13); B13 = x(A13,:);
%A14代表了类别为14的所在的行,B14代表了第14类所对应的波段 A14 = find(y == 14); B14 = x(A14,:);
%A15代表了类别为15的所在的行,B15代表了第15类所对应的波段 A15 = find(y == 15); B15 = x(A15,:);
%A16代表了类别为16的所在的行,B16代表了第16类所对应的波段 A16 = find(y == 16); B16 = x(A16,:);
%A0代表了类别为0的所在的行,B0代表了第0类所对应的波段 A0= find(y == 0); B0= x(A0,:);
%取每个样本的前70%作为训练集,后30%作为测试集。 %C1代表了选取第一类的前32个样本呢作为训练集,C2代表了选取第2类的前1000个作为训练集
%C3代表了选取第3类的前581个作为训练集,C4代表了选取第4类的前166个作为训练集
%C5代表了选取第5类的前338个样本呢作为训练集,C6代表了选取第6类的前511个作为训练集
%C7代表了选取第7类的前20个作为训练集,C8代表了选取第8类的前334个作为训练集
%C9代表了选取第9类的前14个样本呢作为训练集,C10代表了选取第10类的前680个作为训练集
%C11代表了选取第11类的前1718个作为训练集,C12代表了选取第12类的前415个作为训练集
%C13代表了选取第13类的前143个作为训练集,C14代表了选取第14类的前885个作为训练集
%C15代表了选取第15类的前270个样本呢作为训练集,C16代表了选取第16类的前65个作为训练集 %C0代表了选取第0类的前7543个作为训练集 C1 =
B1(1:32,:); C2 = B2(1:1000,:); C3 = B3(1:581,:); C4 = B4(1:166,:); C5 =
B5(1:338,:); C6 = B6(1:511,:); C7 = B7(1:20,:); C8 = B8(1:334,:); C9 =
B9(1:14,:); C10 = B10(1:680,:); C11 = B11(1:1718,:); C12 = B12(1:415,:); C13 =
B13(1:143,:); C14 = B14(1:885,:); C15 = B15(1:270,:); C16 = B16(1:65,:); C0 =
B0(1:7543,:);
%D代表了由C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C0所组成的训练集; D =
[C0;C1;C2;C3;C4;C5;C6;C7;C8;C9;C10;C11;C12;C13;C14;C15;C16]; %设置测试集 M=
zeros(1,14715); M(1,1:7543) = 0; M(1,7544:7575) = 1; M(1,7576:8575) = 2;
M(1,8576:9156) = 3; M(1,9157:9322) = 4; M(1,9323:9660) = 5; M(1,9661:10171) =
6; M(1,10172:10191) = 7; M(1,10192:10525) = 8; M(1,10526:10539) = 9;
M(1,10540:11219) = 10; M(1,11220:12937) = 11; M(1,12938:13352) = 12;
M(1,13353:13495) = 13; M(1,13496:14380) = 14; M(1,14381:14650) = 15;
M(1,14651:14715) = 16; %2.选择训练集与测试集 %训练集 P_train_1 = D'; I_train_1 = M; %测试集
P_test_1 = (B1(33:46,:))' P_test_2 = (B2(1001:1400,:))' %数据归一化
[P_train_1,ps_input]=mapminmax(P_train_1,0,1);
[I_train_1,ps_ouput]=mapminmax(I_train_1,0,1);
[P_test_1,ps_input]=mapminmax(P_test_1,0,1);
[P_test_2,ps_input]=mapminmax(P_test_2,0,1); %创建网络
net=newff(P_train_1,I_train_1,15,{'tansig','purelin'},'traingd');
net.trainParam.epochs=20000; net.trainParam.goal=0.0001; net.trainParam.lr =
0.01; net = train(net,P_train_1,I_train_1); %测试第一类的训练集 t_sim1 =
sim(net,P_test_1); %数据反归一化 I_sim1 = mapminmax('reverse',t_sim1,ps_ouput);
%测试第2类的训练集 t_sim2 = sim(net,P_test_2); %数据反归一化 I_sim2 =
mapminmax('reverse',t_sim2,ps_ouput);