📄 nf_train1.m
字号:
%***Novelty Detection
%***Training nf
%***Iput File: 1.prepared data file
% or 2.Abaqus Data file '*.dat'
%***Then, Save trained NN and traing phase data on disk for testing use
%***for data from Abaqus data file,currently,only use the first 'inout_node' natural freq.
%clear;clc;
%=====below can be changed by user====
alpha=3.0;
inout_node=12; %input layer and output layer nodes number of NN
hide_node1=6; %nodes number of the first hiden layer of NN
hide_node2=6; %nodes number of the second hiden layer of NN
structure='12-6-6-12'; %only for recording nn structure in .m file
train_epochs =25;
train_goal = 0.00001;
noise=0/100;
data_from=1;
data_file='DF_MS500.txt'; %%when data_from=1:get data from prepared data file
%data_file='ksm1MS.dat'; %%when data_from=2:get data from Abaqus Data file '*.dat'
nf_name='nftest_ksm1MS'; %mat filename of nf trained and data related for saveing on disk
sample_train=500;
sample_test=500;
%=====above can be changed by user====
lamda_train=zeros(1,sample_train);
lamda_test=zeros(1,sample_test);
if data_from==1 %1.get data from prepared data file
fid=fopen(data_file,'r');
f=fscanf(fid,'%g',[inout_node,sample_train]);
%read in order of column by column,
%element number in a column is "inout_node"
%total number of columns is "sample_train"
fclose(fid);
end %1.get data from prepared data file
if data_from==2
%***read freq from abaqus.dat file and then add noise to form freq set
fin=fopen(data_file,'r');
number=-1;
while number<=0
line=fgetl(fin);
matches=findstr(line,'CYCLES');
number=length(matches);
end
line=fgetl(fin);
line;
for i=1:1:inout_node
mode=fscanf(fin,'%d',1);
x=fscanf(fin,'%g', 2);
freq(i)=fscanf(fin,'%g', 1);
z=fscanf(fin,'%g', 2);
end
fclose(fin);
freq=freq'; %change row to column
%add noise to freq to form data set
for i=1:1:inout_node
ranf=sprandn([1:sample_train]); maxf=max(abs(ranf));
ranf=ranf/maxf;
for j=1:1:sample_train
f(i,j)=freq(i)+noise*ranf(j)*freq(i);
end
end
%******f is inout_node rows and samlp_train columns***********************************
end %data_from=2:setup train data f from Abaqus data file
%=====training New NN=============
for i=1:1:inout_node
m=mean(f(i,:));
y(i,:)=(f(i,:)-m)*alpha+m;
end
for i=1:1:inout_node
f_range(i,1)=min(f(i,:));
f_range(i,2)=max(f(i,:));
end
novelty_filter = newff(f_range,[inout_node hide_node1 hide_node2 inout_node],{'purelin','purelin','tansig' 'purelin'},'trainlm');
novelty_filter.trainParam.epochs = train_epochs;
novelty_filter.trainParam.goal = train_goal;
novelty_filter = train(novelty_filter,f,y);
%=================================
%=====feed f into trained NN again
% to generate lamda in training phase=============
y1 = sim(novelty_filter,f);
for j=1:1:sample_train
sum=0.0;
for i=1:1:inout_node
sum=sum+(y1(i,j)-y(i,j))^2.0;
end
lamda_train(j)=sqrt(sum);
end
threshold=mean(lamda_train)+4*std(lamda_train);
%*********testing, here use f too means undamage case*******
ft=f;
for i=1:1:inout_node
mt=mean(ft(i,:));
yt(i,:)=(ft(i,:)-mt)*alpha+mt;
end
yt1=sim(novelty_filter,ft);
for j=1:1:sample_test
sum=0.0;
for i=1:1:inout_node
sum=sum+(yt1(i,j)-yt(i,j))^2.0;
end
lamda_test(j)=sqrt(sum);
end
%*****************************************************
lamda=[lamda_train,lamda_test];
figure(2);
plot(lamda);
hold on;
plot([1,sample_train+sample_test],[threshold threshold],'-.k');
xlabel('Training / testing data');
ylabel('Novelty index');
hold off;
%***save trained network and all data for later use
save(nf_name,'novelty_filter','structure','data_file','f','alpha','noise','train_epochs','train_goal','sample_train','inout_node');
%this information can be shown after loading .mat file saved
%some data saved here are used by nf_test
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -