Commit 3cc817bb authored by Stanislav Paláček's avatar Stanislav Paláček

v1.32

přidána kompilace s openblas v CMake
parent fd6ce8ff
......@@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 14)
if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel")
set(dialect "-r8")
if(NOT CMAKE_Fortran_FLAGS_RELEASE)
set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -xhost" CACHE STRING "" FORCE)
set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -xhost" CACHE STRING "" FORCE)
endif()
set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -check noarg_temp_created -C -traceback" CACHE STRING "" FORCE)
set(CMAKE_Fortran_FLAGS_DEBUGHEAVY "${CMAKE_Fortran_FLAGS_DEBUG} -check noarg_temp_created -fpe0 -warn alignments -warn declarations -warn general -warn interfaces -warn truncated_source -warn uncalled -warn uninitialized -warn usage -common_args -warn unused -fp-stack-check -check bounds -check uninit -check format" CACHE STRING "" FORCE)
......@@ -18,10 +18,11 @@ endif()
if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU")
set(dialect "-fdefault-real-8 -fopenmp -O2")
set(dialect "-fdefault-real-8 -fopenmp -O3 -lopenblas -fexternal-blas")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${dialect}")
add_executable(neuron4dyn src/mod_randomnumbers.f90 src/neurondatatypes.f90 src/neuronka.f90 src/neuron4dyn.f90)
add_executable(neuron4dynstruc src/mod_randomnumbers.f90 src/neurondatatypes.f90 src/neuronka.f90 src/neuron4dynstruc.f90)
endif()
......@@ -29,7 +29,9 @@ Spouštění se vstupními argumenty:
!>
Podle http://neuralnetworksanddeeplearning.com/chap3.html jsou váhy inicializovány náhodně podle gaussova rozdělení se střední hodnotou 0 a standartní odchylkou 1/sqrt(Počet vstupních neuronů) a biasy z gaussova rozdělení se střední hodnotou 0 a standartní odchylkou 1.
!/>
!> intel fortran v případě segmantation folt zkusit před spuštěním neuron4dyn:
ulimit -s unlimited
Přidat:
Simulované žíhání
......
......@@ -9,8 +9,6 @@ program neuron4dyn
integer :: i,j,k,l
type(learn_dataset) :: ucicidata,kontrolnidata
type(dataset) :: vycislenisite
real :: dx,xdolni,xhorni
integer :: nprvkukrivka
!Interface pro subroutinu inicializace:
......@@ -43,7 +41,7 @@ program neuron4dyn
! type(network) :: sit *
! character(len=50) :: nazevsouboru *
! type(dataset) :: datovasada *
! end subroutine nacti_data *
! end subroutine nacti_data *
! *
!*********************************************************************************
! pokud chceme pouze vyčíslit naučenou síť, může být datovasada datového typu dataset
......
program neuron4dynstruc
use neurondatatypes
use neuronka
implicit none
character(len=:),allocatable :: ucdata,testdata,vycislidata
type(networkstruc) :: a
integer :: i,j,k,l
type(learn_dataset) :: ucicidata,kontrolnidata
type(dataset) :: vycislenisite
! call inicializace(a,ucdata,testdata,vycislidata)
end program neuron4dynstruc
\ No newline at end of file
......@@ -32,7 +32,9 @@ private
procedure,pass :: createnetwp
procedure,pass :: destroynetwp
procedure,pass :: associatenetwp
ENDTYPE network
ENDTYPE network
!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
!>> Datový typ reprezentující vzorová data a kontrolní data
......
......@@ -90,7 +90,7 @@ implicit none
newini=.false.
!načtení názvu inicializačního souboru, souboru sdaty a s testovacími daty
!načtení názvu inicializačního souboru, souboru s daty a s testovacími daty
narg=command_argument_count()
......@@ -1265,7 +1265,7 @@ end function
p = 0
do j=1,N
call random_seed()
call random_number(u)
k = floor(j*u) + 1
p(j) = p(k)
......@@ -1848,6 +1848,7 @@ end function
!>> vygenerování náhodných vah a biasů z intervalu (-1,1)
do i=2,sit%pocetvrstev
call random_seed()
call random_number(oldstate%vrstvy(i)%vahy) !generování z jiného rozdělení může být vhodnější
call random_number(oldstate%vrstvy(i)%biasy)
sit%vrstvy(i)%vahy=oldstate%vrstvy(i)%vahy*2-1
......@@ -1989,6 +1990,7 @@ end function
integer :: minepoch,maxepoch
kalmanparfile='inifiles/kallman.par'
inquire(file=kalmanparfile,exist=ex)
......@@ -2194,7 +2196,7 @@ end function
end interface
!Matice
real :: P(sit%nbiasvah,sit%nbiasvah)
real :: P(sit%nbiasvah,sit%nbiasvah),pomP(sit%nbiasvah,sit%nbiasvah)
real :: H(sit%vrstvy(sit%pocetvrstev)%Nneuronu,sit%nbiasvah)
!H(pocet neuronu ve vyst. vrst.,celkoy pocet vah a biasu)
......@@ -2233,6 +2235,10 @@ end function
real :: inovace,athr
real :: reclambda
real :: t0,t1,t2
kalmanparfile='inifiles/kallman.par'
inquire(file=kalmanparfile,exist=ex)
......@@ -2276,32 +2282,46 @@ end function
nepoch=0
sit%chybasite=0.0
do !začtek iterace
do !začátek iterace
call CPU_TIME(t0)
i = mod(niter,vzordata%nprvku)+1
niter=niter+1
! print*,niter
! call CPU_TIME(t1)
if (i==1) then
call rperm3(vzordata%nprvku,perm)
end if
! call CPU_TIME(t2)
! print*,'Doba rperm',t2-t1
!přiřazení datai
!počet prvků datai se přiřadilo nahoře
!přiřazení pointerů datai na vzordata
! call CPU_TIME(t1)
datai%vstupy => vzordata%vstupy(:,perm(i):perm(i))
datai%vystupy => vzordata%vystupy(:,perm(i):perm(i))
datai%vzorvystupy => vzordata%vzorvystupy(:,perm(i):perm(i))
! call CPU_TIME(t2)
! print*,'Doba prirazeni datai',t2-t1
!zavola dvystup_dvah, které vypočítá matici H
!H - derivace výstupů ze sítě podle vah a biasů
! call CPU_TIME(t1)
call dvystup_dvah(sit,datai,H,funinside,funlast,dfuninside,dfunlast)
! call CPU_TIME(t2)
! print*,'Doba vypočtu matice H',t2-t1
! call CPU_TIME(t1)
inovace=sqrt(sum((datai%vystupy(:,1)-datai%vzorvystupy(:,1))**2))
! print*,perm(i),'inovace',inovace,datai%vystupy,datai%vzorvystupy
! call CPU_TIME(t2)
! print*,'Doba vypočtu inovace ',t2-t1
if (inovace > athr*sit%chybasite) then
! call CPU_TIME(t1)
HP=matmul(H,P)
!K(t)=[H(t)*P(t-1)]^T([H(t)*P(t-1)]*H(t)^T + lambda(t)*R(t))^-1=HP^T*IPK
IPK=matmul(HP,transpose(H)) !IPK=[H(t)*P(t-1)]*H(t)^T
......@@ -2312,8 +2332,14 @@ end function
do j=1,sit%vrstvy(sit%pocetvrstev)%Nneuronu
IPK(j,j)=IPK(j,j)+lambda !IPK=[H(t)*P(t-1)]*H(t)^T + lambda(t)*E
end do
! call CPU_TIME(t2)
! print*,'Doba vypočtu matice IPK',t2-t1
! call CPU_TIME(t1)
!inverze k IPK
IPK=finvert(sit%vrstvy(sit%pocetvrstev)%Nneuronu,IPK)
! call CPU_TIME(t2)
! print*,'Doba vypočtu inverze matice IPK',t2-t1
! print*,"HP:"
! do j=1,sit%vrstvy(sit%pocetvrstev)%Nneuronu
......@@ -2321,14 +2347,20 @@ end function
! end do
! call CPU_TIME(t1)
HPT=transpose(HP) !HPT nemusí být - zavedena kvůli chybě v překladači
! call CPU_TIME(t2)
! print*,'Doba transponování matice HP',t2-t1
! print*,"HPT:"
! do j=1,sit%nbiasvah
! print*,HPT(j,:)
! end do
! call CPU_TIME(t1)
K=matmul(HPT,IPK)
! call CPU_TIME(t2)
! print*,'Doba výpočtu matice K',t2-t1
! print*,"K:"
! do j=1,sit%nbiasvah
......@@ -2336,7 +2368,23 @@ end function
! end do
! print*,"lambda=",lambda
P=(P-matmul(K,HP))/lambda !zakomentování tohoto může zlepšit konvergenci???
reclambda=1/lambda
! print*,'size K=',size(K,1),size(K,2)
! print*,'size HP=',size(HP,1),size(HP,2)
! call CPU_TIME(t1)
pomP=matmul(K,HP)
! call CPU_TIME(t2)
! print*,'Doba vypočtu matice pomP',t2-t1
! call CPU_TIME(t1)
P=(P-pomP)*reclambda
! call CPU_TIME(t2)
! print*,'Doba vypočtu matice P',t2-t1
! P=(P-matmul(K,HP))*reclambda !zakomentování tohoto může zlepšit konvergenci???
! call CPU_TIME(t2)
! print*,'Doba vypočtu matice P',t2-t1
! print*,
! print*,size(P,1),size(P,2)
! print*,
! print*,"P="
! do j=1,sit%nbiasvah
......@@ -2344,11 +2392,15 @@ end function
! end do
! print*,"vzorvstupy-vzrovystupy=",datai%vzorvystupy-datai%vystupy
! call CPU_TIME(t1)
zmenavah=matmul(K,sum(datai%vzorvystupy-datai%vystupy,2))
! call CPU_TIME(t2)
! print*,'Doba vypočtu matice zmenavah',t2-t1
! print*,zmenavah
! call CPU_TIME(t1)
!aktualizace vah
citac=0
do kk=1,sit%pocetvrstev-1 !smyčka přes vrstvy - k
......@@ -2369,9 +2421,12 @@ end function
end do !/smyčka přes neurony ve vrstvě k+1
end do !/konec smyčky přes vrstvy - k
! call CPU_TIME(t2)
! print*,'Doba zmen vah sítě',t2-t1
end if
! call CPU_TIME(t1)
!Pokud uplynula epocha, pak:
if (i==vzordata%nprvku) then
nepoch=nepoch+1
......@@ -2404,7 +2459,13 @@ end function
if (sit%chybasite < targeterr) exit
end if
! call CPU_TIME(t2)
! print*,'Doba vyhodnocení konce epochy ',t2-t1
call CPU_TIME(t2)
if (mod(niter,vzordata%nprvku)==0) then
print*,'Doba iterace',niter,t2-t0, 'epocha=',nepoch
end if
end do
......
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