24小时热门版块排行榜    

查看: 1841  |  回复: 4

dy1029

新虫 (正式写手)

[交流] 求助bp神经网络遗传算法出错。 已有1人参与

最近在学习神经网络遗传算法,参照网上的一些代码:
CODE:
% 清空环境变量

clc

clear


%% 网络结构建立
%节点个数

inputnum=1;

hiddennum=5;

outputnum=1;



%训练数据和预测数据

input_train=[1 2 3 4 5 6 7 8 9 10];

input_test=[21 27 29 31 34 36 39 41 49 50];

output_train=[11 12 13 14 15];

output_test=[54 56 59 61 66];



%选连样本输入输出数据归一化

[inputn,inputps]=mapminmax(input_train);

[outputn,outputps]=mapminmax(output_train);



%构建网络

net=newff(inputn,outputn,hiddennum);



%% 遗传算法参数初始化

maxgen=10;                         %进化代数,即迭代次数

sizepop=10;                        %种群规模

pcross=0.3;                       %交叉概率选择,0和1之间

pmutation=0.1;                    %变异概率选择,0和1之间



%节点总数

numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;



lenchrom=ones(1,numsum);        

bound=[-3*ones(numsum,1) 3*ones(numsum,1)];    %数据范围



%------------------------------------------------------种群初始化--------------------------------------------------------

individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %将种群信息定义为一个结构体

avgfitness=[];                      %每一代种群的平均适应度

bestfitness=[];                     %每一代种群的最佳适应度

bestchrom=[];                       %适应度最好的染色体

%初始化种群

for i=1:sizepop

    %随机产生一个种群

    individuals.chrom(i,:)=Code(lenchrom,bound);    %编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)

    x=individuals.chrom(i,:);

    %计算适应度

    individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   %染色体的适应度

end



%找最好的染色体

[bestfitness bestindex]=min(individuals.fitness);

bestchrom=individuals.chrom(bestindex,:);  %最好的染色体

avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度

% 记录每一代进化中最好的适应度和平均适应度

trace=[avgfitness bestfitness];



%% 迭代求解最佳初始阀值和权值

% 进化开始

for i=1:maxgen

    i

    % 选择

    individuals=Select(individuals,sizepop);

    avgfitness=sum(individuals.fitness)/sizepop;

    %交叉

    individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);

    % 变异

    individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);

   

    % 计算适应度

    for j=1:sizepop
x=individuals.chrom(j,:);
        x=individuals.chrom(j,:); %解码

        individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   

    end

   

  %找到最小和最大适应度的染色体及它们在种群中的位置

    [newbestfitness,newbestindex]=min(individuals.fitness);

    [worestfitness,worestindex]=max(individuals.fitness);

    % 代替上一次进化中最好的染色体

    if bestfitness>newbestfitness

        bestfitness=newbestfitness;

        bestchrom=individuals.chrom(newbestindex,:);

    end

    individuals.chrom(worestindex,:)=bestchrom;

    individuals.fitness(worestindex)=bestfitness;

   

    avgfitness=sum(individuals.fitness)/sizepop;

   

    trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度



end

%% 遗传算法结果分析

figure(1)

[r c]=size(trace);

plot([1:r]',trace(:,2),'b--');

title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);

xlabel('进化代数');ylabel('适应度');

legend('平均适应度','最佳适应度');

disp('适应度变量');

x=bestchrom;



%% 把最优初始阀值权值赋予网络预测

% %用遗传算法优化的BP网络进行值预测

w1=x(1:inputnum*hiddennum);

B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);

w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);

B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);



net.iw{1,1}=reshape(w1,hiddennum,inputnum);

net.lw{2,1}=reshape(w2,outputnum,hiddennum);

net.b{1}=reshape(B1,hiddennum,1);

net.b{2}=B2;



%% BP网络训练

%网络进化参数

net.trainParam.epochs=100;

net.trainParam.lr=0.1;

%net.trainParam.goal=0.00001;



%网络训练

[net,per2]=train(net,inputn,outputn);



%% BP网络预测

%数据归一化

inputn_test=mapminmax('apply',input_test,inputps);

an=sim(net,inputn_test);

test_simu=mapminmax('reverse',an,outputps);

error=test_simu-output_test;  

[ Last edited by jjdg on 2018-7-28 at 00:40 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dy1029

新虫 (正式写手)

运行matlab后,出现:
错误使用 network/train (line 340)
Inputs and targets have different numbers of samples.

出错 fun (line 66)
net=train(net,inputn,outputn);

出错 main2 (line 92)
    individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   %染色体
    的适应度

三个问题,求助哪里有问题
2楼2018-07-27 13:08:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dy1029

新虫 (正式写手)

利用遗传算法计算出神经网络的最佳权值,是输入输出数据维数出现问题吗?
还是适应度函数fun有问题?
3楼2018-07-27 13:09:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gemz10186

至尊木虫 (知名作家)

★ ★
小木虫: 金币+0.5, 给个红包,谢谢回帖
jjdg: 金币+1, 感谢参与 2018-07-28 00:41:11
输入输出维数不一致

发自小木虫IOS客户端
在小木虫顶帖是中华民族的美德
4楼2018-07-27 15:21:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dy1029

新虫 (正式写手)

错误使用 network/subsasgn>network_subsasgn (line 550)
net.b{2} must be a 1-by-1 matrix.

出错 network/subsasgn (line 10)
net = network_subsasgn(net,subscripts,v,netname);

出错 GA-bp (line 117)
net.b{2}=B2;
5楼2018-07-28 00:32:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dy1029 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见