我有一套BP神经网络遥感图像分类的代码,然后我一开始用的是公共数据源的tif文件以及样区tf文件,是可以完全实现的。后期我把公共数据源换成自己的研究数据图像,分类图就出现错误,公共数据源的图像与我的研究数据格式完全相同,明明都是tif文件为啥换个数据就不行了呢??希望得到大家的解答,实在找不到问题,有遇到相同情况的小伙伴吗?
以下为源代码:
clear all;
clc;
%%<----------------------------BPnetwork算法进行遥感图像分类------------------------
%% 读入样本图像1
Y= imread('D:\七类地物样本区.tif');
unique(Y)%查看矩阵中包含的数字种类
%读入待分类遥感图像
I=imread("D:\待分类影像.tif")
%% 输入影像降维
%将彩色图像降维
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
%将矩阵转化为双精度
R=im2double(R);
G=im2double(G);
B=im2double(B);
%% 处理输入影像
[M,N]=size(R);
P=[R;G;B];
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
for i = 1 : M
for j = 1 : N
if (Y(i,j)==1)
T1(:,a1) = I(i,j,:);
a1=a1+1;
elseif (Y(i,j)==2)
T2(:,a2) = I(i,j,:);
a2=a2+1;
elseif (Y(i,j)==3)
T3(:,a3) = I(i,j,:);
a3=a3+1;
elseif (Y(i,j)==4)
T4(:,a4) = I(i,j,:);
a4=a4+1;
elseif (Y(i,j)==5)
T5(:,a5) = I(i,j,:);
a5=a5+1;
elseif (Y(i,j)==6)
T6(:,a6) = I(i,j,:);
a6=a6+1;
elseif (Y(i,j)==7)
T7(:,a7) = I(i,j,:);
a7=a7+1;
elseif (Y(i,j)==8)
T8(:,a8) = I(i,j,:);
a8=a8+1;
end
end
end
T1 = im2double(T1);
T2 = im2double(T2);
T3 = im2double(T3);
T4 = im2double(T4);
T5 = im2double(T5);
T6 = im2double(T6);
T7 = im2double(T7);
P=[T1,T2,T3,T4,T5,T6,T7]; %样区数据
% 输入训练矩阵P归一化
R1=P(1,:);
G1=P(2,:);
B1=P(3,:);
R1=mapminmax(R1, 0, 1);
G1=mapminmax(G1, 0, 1);
B1=mapminmax(B1, 0, 1);
P=[R1;G1;B1];
ismember(1,P)%判断1是否在R中
ismember(0,P)%判断1是否在R中
%% 处理T
% T=eye(8)
[a,b]=size(P);
T=zeros(7,b); %注意修改行数——标记结果
T(1,1:a1-1)=1;
T(2,a1:a1+a2-2)=1;
T(3,a1+a2-1:a1+a2+a3-3)=1;
T(4,a1+a2+a3-2:a1+a2+a3+a4-4)=1;
T(5,a1+a2+a3+a4-3:a1+a2+a3+a4+a5-5)=1;
T(6,a1+a2+a3+a4+a5-4:a1+a2+a3+a4+a5+a6-6)=1;
T(7,a1+a2+a3+a4+a5+a6-5:a1+a2+a3+a4+a5+a6+a7-7)=1;
% T(8,a1+a2+a3+a4+a5+a6+a7-6:a1+a2+a3+a4+a5+a6+a7+a8-8)=1;
%% 训练模型
%建立BP网络,中间层8,输出层3,tansig、purelin分别为中间层、输出层的转换函数,
tic;%开始计时
echo on
net=newff(P,T,[10],{'tansig','purelin'},'traingd');
clc
%设置训练参数
net.trainparam.show=10;
net.trainParam.epochs=100;
net.trainParam.goal=0.001;
net.trainParam.lr=0.01;%学习率
net=init(net);%重新初始化
net.divideFcn = '';
[net,tr]=train(net,P,T);
%% 处理代分类影像
%将彩色图像降维
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
%输入矩阵转化为双精度
R=im2double(R);
G=im2double(G);
B=im2double(B);
%%
[M,N]=size(R);
R=reshape(R',[1 M*N]);
G=reshape(G',[1 M*N]);
B=reshape(B',[1 M*N]);
%% 输入矩阵归一化
R = mapminmax(R, 0, 1); % 归一化。
G = mapminmax(G, 0, 1);
B = mapminmax(B, 0, 1);
X=[R;G;B];
ismember(1,X)%判断1是否在R中
ismember(0,X)%判断1是否在R中
%% 对BP网络进行仿真
IN=sim(net,X);
[max_IN,index]=max(IN);%max_IN最大值数值,index每列最大值所在位置
OUT=index;
Pic=reshape(OUT,M,N);
%% 显示
Pic=uint8(Pic);
Pic= flipud(Pic);%左右翻转
%设置颜色
imagesc(Pic);
colormap(gca,jet);
colorbar
%翻转图像
view(90,90);
title('分类图');
toc;%结束计时
%% 导出文件
% %导出文件
% imwrite(uint8(Pic),'C:\Users\10744\Desktop\39image.tif','tif');
% %检查导出文件
% Test= imread('C:\Users\10744\Desktop\39image.tif');
% unique(Test);
还请提供一下数据
基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):
您好,可能是因为您的数据格式或者数据大小与代码不匹配导致了错误。在您使用自己的研究数据时,需要确保以下几点:
样本图像的格式必须与待分类遥感图像的格式相同。
样本图像和待分类遥感图像的大小必须相同。
如果在读取数据时出现问题,请检查文件路径是否正确,以及文件名是否与实际文件名匹配。
请检查样本图像中包含的数字种类是否与代码中的数字种类相同。如果不同,需要根据实际情况对代码进行修改。
在训练模型之前,需要对训练矩阵进行归一化处理。请检查归一化函数是否正确,并确保传递给该函数的参数类型和数量正确。
在训练过程中,请确保设置了正确的训练参数,如学习率、最小误差等。
在对待分类影像进行分类时,请确保输入矩阵的大小和格式都与训练矩阵相同。并且也需要对输入矩阵进行归一化处理。
希望这些注意事项能够帮助您解决问题。如果还有其他问题,请随时提问。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,需要确认研究数据图像的大小和公共数据源的大小是否一致。如果大小不一致,可能会导致图像数据不完整或存在缺失的情况,进而影响分类结果。如果大小一致,可以考虑以下几点:
Y= imread('D:\七类地物样本区.tif');
unique(Y)
如果样本区像素值的范围在研究数据图像中不存在,则会影响分类结果。
研究数据图像可能跟公共数据源在尺度、相机、光照、旋转等方面存在差异,也可能包含与训练样本不同的类别。因此,可以尝试通过图像增强、数据扩增等方法来改善分类效果。
经过以上两步确认后,如果还存在分类错误,可以考虑继续优化BP神经网络的设置,如增加中间层数、调整迭代次数、改变转换函数等等。
以下是一些可能有用的代码:
(1)查看样本区像素值的范围以及数据规模
Y= imread('D:\七类地物样本区.tif');
unique_Y = unique(Y); % 统计像素值的不同种类
num_classes = length(unique_Y); % 统计类别数
rows = size(Y, 1); % 统计像素行数
cols = size(Y, 2); % 统计像素列数
pixels = rows * cols; % 统计像素总数
fprintf("The sample area contains %d classes\n", num_classes);
fprintf("The sample area contains %d pixels in total\n", pixels);
fprintf("The pixel values range from %d to %d\n", min(min(Y)), max(max(Y)));
(2)归一化输入数据
% 输入矩阵归一化
P_norm = im2double(P); % 将原始数据转换为双精度格式
P_norm = mapminmax(P_norm, 0, 1); % 归一化。
(3)设置训练参数
net.trainparam.show=10; % 每训练10次显示一次结果
net.trainParam.epochs=100; % 最大迭代次数为100次
net.trainParam.goal=0.001; % 训练目标为0.001
net.trainParam.lr=0.01; % 学习率为0.01
(4)对BP网络进行仿真
% 对BP网络进行仿真
X_norm = mapminmax(X, 0, 1); % 先归一化输入数据
IN=sim(net,X_norm);
[max_IN,index]=max(IN); % 找出每列最大值及其索引
OUT=index;
Pic=reshape(OUT,M,N);
最后,如果上述方法不能解决问题,可以考虑提供更多关于研究数据图像和公共数据源的信息,以便更准确地定位错误。
如果我的回答解决了您的问题,请采纳!
result=zeros(100,1); %形成容量为100的初始化矩阵
l = 0.5;
a = 1.2;
n = 100000;
for num = 1:100;
m = 0;
x = rand(1,n) * a/2;
phi = rand(1,n) * pi;
for i = 1:n;
if x(i) <= l/2 * sin(phi(i));
m = m+1;
end;
end;
p = m/n;
mypi = (2 * l)/(a * p);
result(num) = mypi; %试验结果存入矩阵
end;
meanpi = mean(result); %求100次试验均值
disp(['蒙特卡罗方法得到的pi为',num2str(meanpi)]);
aistudio 上查