Commit 11fb15bd authored by Stanislav Paláček's avatar Stanislav Paláček

v1.0

parent 8b551f2e
......@@ -18,6 +18,8 @@ Testovací (kontrolní) data jsou defaultně načítána ze souboru "kontrolnida
- Tato data musí mít v prvních N sloupcích vstupy a v následujících M sloupcích výstupy, kde N je počet vstupních a M je počet výstupních neuronů
Spouštění se vstupními argumenty:
"-h" nebo "--help" - zobrazí nápovědu
"-eval nazevsoboru.dat" - vyčíslí síť pro vstupy uložené v souboru "nazevsouboru.dat"
"-ini nazevsouboru.ini" - načte specifikaci sítě ze souboru "nazevsouboru.ini"
"-dat nazevsouboru.dat" - načte učící data ze souboru "nazevsouborul.dat"
"-tdat nazevsouborut.dat" - načte testovací data ze souboru "nazevsouborut.dat"
......@@ -29,3 +31,10 @@ Spouštění se vstupními argumenty:
!/>
Přidat:
Simulované žíhání
Basin hopping
parallel tempering
Zkusit druhé mocniny vzdáleností u N2He
......@@ -4,7 +4,7 @@ program neuron4dyn
implicit none
character(len=:),allocatable :: ucdata,testdata
character(len=:),allocatable :: ucdata,testdata,vycislidata
type(network) :: a
integer :: i,j,k,l
type(learn_dataset) :: ucicidata,kontrolnidata
......@@ -24,7 +24,7 @@ program neuron4dyn
! Inicializace programu a sítě
call inicializace(a,ucdata,testdata)
call inicializace(a,ucdata,testdata,vycislidata)
!Interface pro subroutinu nacti_data:
......@@ -48,59 +48,43 @@ program neuron4dyn
! pokud chceme pouze vyčíslit naučenou síť, může být datovasada datového typu dataset
! Chceme li však síť učit, musí být datového typu learn_dataset
if (.not. a%vycislidata) then
call nacti_data(a,ucdata,ucicidata)
call nacti_data(a,testdata,kontrolnidata)
call initscale(a,ucicidata)
call initscale(a,ucicidata) !načtení počáteční škály
else
call nacti_data(a,vycislidata,vycislenisite)
end if
!škálování učící sady dat na intervaly [-1,1]
!škálování učící sady dat na intervaly [-1,1]
if (.not. a%vycislidata) then
call skalujlearndata(a,ucicidata)
call skalujlearndata(a,kontrolnidata)
else
call skalujvstupy(a,vycislenisite)
call vycisli_sit(a,vycislenisite,sigmoid,linear)
!Zpětné škálování vstupů datového souboru rypu danaset na původní rozměry
call skalujvstupyzpet(a,vycislenisite)
!Zpětné škálování výstupů na původní jendnotky
call skalujvystupy(a,vycislenisite)
!uložení vypočtených dat
call ulozdata(vycislenisite,vycislidata)
end if
! argumenty zpětné propagace (type(network)-parametry sítě,type(learn_dataset)-data na naučení,type(learn_dataset)-data na kontrolu
! učení,přechodová funkce vnitřních vrstec, přechodová funkce poslední vrstvy, derivace přechodové funkce vnitřní vrstvy, derivace
! přechodové funkce poslední vrstvy,derivace chybové funkce)
!call backpropagation3(a,ucicidata,kontrolnidata,sigmoid,linear,dsigmoid,dlinear,kvchybfun,gradkvchybfun)
call GEKF(a,ucicidata,kontrolnidata,sigmoid,linear,dsigmoid,dlinear,kvchybfun,gradkvchybfun)
call ulozvahy(a)
!call simulated_annealing(a,ucicidata,kontrolnidata,sigmoid,linear,kvchybfun)
!call ulozvahy(a,inisoubor)
call constr_dataset(a,vycislenisite,ucicidata%nprvku)
xdolni=0.0
xhorni=20.0
dx=0.01
nprvkukrivka=nint((xhorni-xdolni)/dx)
vycislenisite%nprvku=nprvkukrivka
call constr_dataset(a,vycislenisite,nprvkukrivka)
do i=1,nprvkukrivka
vycislenisite%vstupy(1,i)=xdolni+dx*(i-1)
end do
!škálování vstupů datového souboru typu dataset na interval [-1,1]
call skalujvstupy(a,vycislenisite)
call vycisli_sit(a,vycislenisite,sigmoid,linear)
!Zpětné škálování vstupů datového souboru rypu danaset na původní rozměry
call skalujvstupyzpet(a,vycislenisite)
!Zpětné škálování výstupů na původní jendnotky
call skalujvystupy(a,vycislenisite)
open(42,file="krivka.txt")
do i=1,nprvkukrivka
write(42,fmt=*) vycislenisite%vstupy(:,i),vycislenisite%vystupy(:,i)
end do
close(42)
if (.not. a%vycislidata) then
!call backpropagation3(a,ucicidata,kontrolnidata,sigmoid,linear,dsigmoid,dlinear,kvchybfun,gradkvchybfun)
call GEKF(a,ucicidata,kontrolnidata,sigmoid,linear,dsigmoid,dlinear,kvchybfun,gradkvchybfun)
call ulozvahy(a)
!call simulated_annealing(a,ucicidata,kontrolnidata,sigmoid,linear,kvchybfun)
!call ulozvahy(a,inisoubor)
end if
open(42,file="puvodnikrivka.txt")
do i=1,ucicidata%nprvku
write(42,fmt=*) ucicidata%vstupy(:,i),ucicidata%vzorvystupy(:,i)
end do
close(42)
end program neuron4dyn
......@@ -24,7 +24,8 @@ private
integer :: nbiasvah
real,dimension(:),allocatable :: inpmax,inpmin,outmax,outmin
logical :: loadedscale=.false.
contains
logical :: vycislidata=.false.
contains
procedure,pass :: createnetw
procedure,pass :: destroynetw
procedure,pass :: createnetwp
......
......@@ -6,7 +6,7 @@ implicit none
private
!veřejné procedury a funkce
public :: inicializace,vycisli_sit,sigmoid,linear,dsigmoid,dlinear !>> Datový typ obsahující parametry sítě
public :: kvchybfun,gradkvchybfun
public :: kvchybfun,gradkvchybfun,ulozdata
public :: constr_signals,nacti_data,ulozvahy,constr_dataset,backpropagation,backpropagation2,backpropagation3,backpropagation4
public :: simulated_annealing,skalujlearndata,skalujvstupy,skalujvstupyzpet,skalujvystupy,initscale,GEKF
INTERFACE vycisli_sit
......@@ -67,7 +67,7 @@ implicit none
type(network),intent(in) :: sit
mnozinadat%nprvku=ndat
allocate(mnozinadat%vstupy(sit%vrstvy(1)%Nneuronu,ndat))
allocate(mnozinadat%vystupy(sit%vrstvy(sit%pocetvrstev)%Nneuronu,ndat))
......@@ -79,7 +79,7 @@ implicit none
type(network),intent(in) :: sit
mnozinadat%nprvku=ndat
allocate(mnozinadat%vstupy(sit%vrstvy(1)%Nneuronu,ndat))
allocate(mnozinadat%vystupy(sit%vrstvy(sit%pocetvrstev)%Nneuronu,ndat))
allocate(mnozinadat%vzorvystupy(sit%vrstvy(sit%pocetvrstev)%Nneuronu,ndat))
......@@ -97,9 +97,9 @@ implicit none
!# # # # # #### # # # ###### # ###### # # #### ###### #
!# #
!######################################################################
subroutine inicializace(sit,vzorovadata,testovacidata) !konstruktor pro network
subroutine inicializace(sit,vzorovadata,testovacidata,vycislidata) !konstruktor pro network
type(network),intent(inout) :: sit
character(len=:),allocatable,optional,intent(out) :: vzorovadata,testovacidata
character(len=:),allocatable,optional,intent(out) :: vzorovadata,testovacidata,vycislidata
integer :: fileid,readstat,alocerr,i,j,k,l
logical :: existuje
......@@ -147,9 +147,39 @@ implicit none
testovacidata=buffer
deallocate(buffer)
end if
case("-eval")
if (present(vycislidata)) then
deallocate(buffer)
call get_command_argument(i+1,length=arglen)
allocate(character(len=arglen) :: buffer)
call get_command_argument(i+1,buffer)
vycislidata=buffer
deallocate(buffer)
sit%vycislidata=.true.
end if
case("-newini")
deallocate(buffer)
newini=.true.
case("-h","--help")
write(*,*) 'Nápověda k programu "neuron4dyn"'
write(*,*)
write(*,*) 'Použití:'
write(*,*) 'Program vyžaduje následující sobory:'
write(*,*) '"specifikacesite.ini" - specifikuje topologii feed-forward sítě a &
po natrénovaní také její vnitřní parametry'
write(*,*) '"ucicidata.dat" - obsahuje trénovací sadu dat'
write(*,*) '"kontrolnidata.dat" - obsahuje kontrolní sadu dat pro trénování sítě'
write(*,*)
write(*,*) 'Přepínače aplikace:'
write(*,*) '-h,--help Zoobrazit nápovědu'
write(*,*) '-eval nazevsouboru.dat Vyčíslí síť pro vstupy uložené v souboru "nazevsouboru.dat"'
write(*,*) '-ini nazevsouboru.ini Načte specifikaci sítě ze souboru "nazevsouboru.ini"'
write(*,*) '-dat nazevsouboru.dat Učící data načte ze souboru "nazevsouboru.dat"'
write(*,*) '-tdat nazevsouborut.dat Kontrolní data načte ze souboru "nazevsouboru.dat"'
write(*,*) '-newini Parametry natrénované sítě se uloží do nového inicializačního &
souboru s příponou "_learned.ini"'
STOP
case default
deallocate(buffer)
end select
......@@ -447,6 +477,11 @@ implicit none
end do lloop2
close(fileid)
end subroutine ulozvahy
!##################################################################
!# #
!# # # # # #### # #### # # #### # ##### #
......@@ -719,12 +754,12 @@ end function
!# #
!#####################################################################
subroutine nacti_datas(sit,nazevsouboru,datovasada)
type(network) :: sit
character(len=50) :: nazevsouboru
type(dataset) :: datovasada
type(network) :: sit
character(len=:),allocatable :: nazevsouboru
type(dataset) :: datovasada
integer :: i,fileid,ierr
logical :: ex
integer :: i,fileid,ierr
logical :: ex
fileID=997
datovasada%nprvku=0
......@@ -741,7 +776,7 @@ end function
end subroutine nacti_datas
subroutine nacti_dataf(sit,nazevsouboru,datovasada)
character(len=50) :: nazevsouboru
character(len=:),allocatable :: nazevsouboru
type(learn_dataset) :: datovasada
type(network) :: sit
......@@ -760,7 +795,7 @@ end function
end subroutine nacti_dataf
function pocetradku(soubor)
character(len=50),intent(in) :: soubor
character(len=:),allocatable,intent(in) :: soubor
integer :: pocetradku
logical :: ex
......@@ -771,7 +806,7 @@ end function
!ujištění, že soubor existuje
inquire(file=soubor,exist=ex)
if (.not. ex) then
write(*,*) 'File',adjustr(soubor),'was not found'
write(*,*) 'File ',adjustr(soubor),' was not found'
STOP
end if
......@@ -790,6 +825,25 @@ end function
!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end function pocetradku
subroutine ulozdata(data,nazevsouboru)
type(dataset),intent(in) :: data
character(len=:),allocatable :: nazevsouboru
integer :: fileid,i
fileid=42
open(fileid,file=nazevsouboru)
do i=1,data%nprvku
write(fileid,fmt=*) data%vstupy(:,i),data%vystupy(:,i)
end do
close(fileid)
end subroutine ulozdata
!######################################################################
!# #
!# ###### ##### ###### ##### # # ## #
......@@ -1875,10 +1929,26 @@ end function
real :: chybatestn
!Načtení parametrů pro Kallmanův filtr
call nactiparametr('inifiles/kallman.par','eps',eps)
call nactiparametr('inifiles/kallman.par','lambda0',lambda0)
call nactiparametr('inifiles/kallman.par','lambda',lambda)
logical :: ex
character(len=:),allocatable :: kalmanparfile
real :: targeterr
kalmanparfile='inifiles/kallman.par'
inquire(file=kalmanparfile,exist=ex)
if (.not. ex) then
call system('mkdir -p inifiles')
call createparfilekallman(kalmanparfile)
end if
!Načtení parametrů pro Kallmanův filtr
call nactiparametr(kalmanparfile,'eps',eps)
call nactiparametr(kalmanparfile,'lambda0',lambda0)
call nactiparametr(kalmanparfile,'lambda',lambda)
call nactiparametr(kalmanparfile,'targeterr',targeterr)
!přiřazení počtu prvků datai
datai%nprvku=1
......@@ -1990,7 +2060,7 @@ end function
end do !/konec smyčky přes vrstvy - k
!Pkud uplynula epocha, pak:
!Pokud uplynula epocha, pak:
if (i==vzordata%nprvku) then
nepoch=nepoch+1
......@@ -2005,7 +2075,7 @@ end function
print*,"chyba ucicich dat=",sit%chybasite, "chyba testovacich dat=",chybatestn
if (sit%chybasite < 1e-8) exit
if (sit%chybasite < targeterr) exit
end if
......@@ -2014,6 +2084,23 @@ end function
print*,"Počet proběhnutých epoch=",nepoch
end subroutine GEKF
subroutine createparfilekallman(parfile)
character(len=:),allocatable,intent(in) :: parfile
integer :: fileid
open(fileid,file=parfile)
write(fileid,fmt=*) ' eps=1000'
write(fileid,fmt=*) ' lambda0=0.99'
write(fileid,fmt=*) ' lambda=0.95'
write(fileid,fmt=*) ' targeterr=1e-5 !cílová chyba sítě, které chceme dosáhnout(v normovaném stavu)'
close(fileid)
end subroutine createparfilekallman
!funce invert pro nalezení inverzní matice: založena na Gauss-Jordanově eliminaci
!(N-dimenze matice,a-vstupní matice, inva-výstupní inverzní matice
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment