我在做一个关于用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);

技术
©2020 ioDraw All rights reserved
自制整人电脑小程序华为鸿蒙系统学习笔记9-开发者生态建设PHP调用shell命令比特币突破8000美元 背后暗藏杀机使用函数实现两个数的交换(C语言)log4j打印异常堆栈信息的方法少儿编程孩子的学习路线分享一场黑客帝国代码雨脚本,简单好玩!三分钟看懂神经网络机器翻译 疫情过后 学哪个编程有前景