BP神经网络遥感图像分类问题

我有一套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);

img

img

该回答引用ChatGPT
根据您提供的代码和问题描述,可能出现问题的地方有以下几个方面:
1. 数据格式问题:您提到公共数据源的图像与您的研究数据格式完全相同,但是实际上可能存在一些细微的差别,例如数据类型、数据范围等。建议使用MATLAB的imfinfo函数查看两个图像的详细信息,比较它们之间的差异。
2. 样本区问题:您的代码中使用了样本区数据,这些数据可能与您的研究数据不匹配,导致分类错误。建议检查样本区数据是否与研究数据具有相同的空间分辨率、波段数等特征。
3. 神经网络参数问题:您的代码中使用了BP神经网络进行分类,可能存在一些参数设置不当的问题。建议尝试调整神经网络的中间层数、学习率、迭代次数等参数,以获得更好的分类效果。
4. 数据预处理问题:您的代码中对输入影像进行了降维和归一化处理,这些处理可能会影响分类结果。建议检查数据预处理的方法是否合理,是否存在潜在的问题。
综上所述,您可以从以上几个方面入手,逐一排查问题,找到导致分类错误的原因。同时,建议在调试过程中添加一些输出语句,以便更好地理解程序的运行过程和结果。

还请提供一下数据

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):
您好,可能是因为您的数据格式或者数据大小与代码不匹配导致了错误。在您使用自己的研究数据时,需要确保以下几点:

样本图像的格式必须与待分类遥感图像的格式相同。

样本图像和待分类遥感图像的大小必须相同。

如果在读取数据时出现问题,请检查文件路径是否正确,以及文件名是否与实际文件名匹配。

请检查样本图像中包含的数字种类是否与代码中的数字种类相同。如果不同,需要根据实际情况对代码进行修改。

在训练模型之前,需要对训练矩阵进行归一化处理。请检查归一化函数是否正确,并确保传递给该函数的参数类型和数量正确。

在训练过程中,请确保设置了正确的训练参数,如学习率、最小误差等。

在对待分类影像进行分类时,请确保输入矩阵的大小和格式都与训练矩阵相同。并且也需要对输入矩阵进行归一化处理。

希望这些注意事项能够帮助您解决问题。如果还有其他问题,请随时提问。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,需要确认研究数据图像的大小和公共数据源的大小是否一致。如果大小不一致,可能会导致图像数据不完整或存在缺失的情况,进而影响分类结果。如果大小一致,可以考虑以下几点:

  1. 查看样本区像素值的范围是否一致。通过运行以下代码,可以查看样本区像素值的范围:
Y= imread('D:\七类地物样本区.tif');
unique(Y)

如果样本区像素值的范围在研究数据图像中不存在,则会影响分类结果。

  1. 研究数据图像可能跟公共数据源在尺度、相机、光照、旋转等方面存在差异,也可能包含与训练样本不同的类别。因此,可以尝试通过图像增强、数据扩增等方法来改善分类效果。

  2. 经过以上两步确认后,如果还存在分类错误,可以考虑继续优化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;  % 最大迭代次数为100net.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);

最后,如果上述方法不能解决问题,可以考虑提供更多关于研究数据图像和公共数据源的信息,以便更准确地定位错误。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

aistudio 上查