fortran의 추진기
개시하다
최근 유행하는 기계학습에 관해서는 대학원을 졸업할 때텍스트를 받았다.머신러닝 하면 pytohon이지만 텍스트 코드를 통째로 복제해도 재미가 없어요. 아무도 안 해본 것 같아서 fortran으로 하기로 했어요.
프로펠러
상세한 상황은 다른 사이트에 넘겨주고 간단한 설명을 할 것이다.
통찰가속기는 기계 학습의 가장 기본적인 것으로 하나의 견본을 대표하는 벡터 =\{x^1 i, x^2 i,\cdots, x^n i\}와 그것의 오류 $y몇 주 동안 i$i로 구성된 데이터 집합을 읽고 견본을 두 종류로 나눈다.
가속기 자체에 내부 상태 $\vec{w} 달러가 있음을 통찰하고 입력한 견본 벡터의 내적 $\vec{w}\cdot\vec{x} 달러를 계산합니다.이 값을 활성화 함수 $\phi(z)달러를 통해 정답 $y와 비교하고 $y-\phi(z)달러에 따라 $\vec{w}달러를 수정합니다.
소스 코드
다음 github에 있습니다.
https://github.com/Bluepost59/fortran_perceptron
mod_prcptr.f90module mod_prcptr
implicit none
!----------------------------------------------------------------------
! header of perceptron
!----------------------------------------------------------------------
type perceptron
integer :: dimsion ! dimension of sample data
double precision,allocatable :: w(:)
double precision :: eta
double precision :: epoch
contains
procedure :: learn => perceptron_learn
end type perceptron
interface perceptron
module procedure init_perceptron
end interface perceptron
contains
!======================================================================
! implementations of perceptron
!----------------------------------------------------------------------
! constructer
!----------------------------------------------------------------------
type(perceptron) function init_perceptron(nnn,myeta)
integer :: nnn
double precision :: myeta
allocate(init_perceptron%w(nnn))
init_perceptron%w = 0d0
init_perceptron%dimsion = nnn
init_perceptron%eta = myeta
init_perceptron%epoch = 0
end function init_perceptron
!----------------------------------------------------------------------
! learning
!----------------------------------------------------------------------
subroutine perceptron_learn(self,mydata,y,answered_error)
class(perceptron) :: self
double precision :: mydata(:) ! 1 sample (not dataset)
double precision :: y ! true answer
logical,optional :: answered_error ! error
double precision :: z = 0d0
double precision :: output
integer :: i
answered_error = .false.
if(size(mydata) /= self%dimsion) return
z=0d0
do i=1, size(mydata)
z = z + mydata(i) *self%w(i)
end do
output = phi(z)
if(output /= y) answered_error = .true.
do i=1, self%dimsion
self%w(i) = self%w(i) + self%eta *(y-output) *mydata(i)
end do
end subroutine perceptron_learn
!
!======================================================================
! other functions
!----------------------------------------------------------------------
! activation function
!----------------------------------------------------------------------
double precision function phi(x)
double precision :: x
if(x<=0) then
phi = -1
else
phi = 1
end if
end function phi
end module mod_prcptr
낙서했기 때문에, 나는 스타일 자체가 상당히 엉망진창이라고 생각한다.perceptron%learn
샘플 데이터를 읽습니다. (데이터 집합이 아닙니다.)
테스트 코드는test입니다.f90에서 일주일 동안 데이터 파일을 읽는 동작을 반복합니다.(이것도 퍼셉션에 포함되어야 한다고 생각한다).
동작 결과
mydata.txt5.0 -7.0 -1
6.0 -8.0 -1
-1.3 6.3 1
-5.3 0.2 1
9.3 -2.2 -1
점과 선이 겹치는 것처럼 보이지만 드디어 분류된 것 같다.
error
왜 다섯 개 정도의 데이터로 2로 끝나?나는 데이터가 좋지 않은지 코드가 좋지 않은지 모르겠다.
코드가 틀렸습니다.수정 후 첫 번째 Epoke 오류 분류 후 두 번째 Epoke 이후는 0입니다.
총결산
어쨌든 괜찮은 선을 그릴 수 있어.이번에 나는 이미 기진맥진했다. 만약 시간과 열의가 있다면, 나는 다시 한 번 열심히 하고 싶다.
psyhon이 없는list와 C++의vector 같은 용기는 너무 고통스러워요.
bugfix
subroutine 내의 변수 선언이 동시에 초기화되면 그 subroutine가 2차 이상 호출되었을 때 2차 이후에는 초기화되지 않는다(가치가 계승되었다).
septcolor의 지적을 통해 알아차렸습니다.감사합니다.
smp.f90program main
integer i
! 10回ずつ呼び出してみる
do i=1,10
call smp_ng()
end do
do i=1,10
call smp_ok()
end do
contains
!=====================================
! nが初期化されず1,2,3,...と増えてしまう!
subroutine smp_ng()
!-----------------------
integer :: n=0
!-----------------------
n=n+1
write(6,*) n
end subroutine smp_ng
!=====================================
! ちゃんと毎回nが初期化され、常に1を返す
subroutine smp_ok()
!-----------------------
integer :: n
n=0
!-----------------------
n=n+1
write(6,*)n
end subroutine smp_ok
end program main
참고 문헌
상세한 상황은 다른 사이트에 넘겨주고 간단한 설명을 할 것이다.
통찰가속기는 기계 학습의 가장 기본적인 것으로 하나의 견본을 대표하는 벡터 =\{x^1 i, x^2 i,\cdots, x^n i\}와 그것의 오류 $y몇 주 동안 i$i로 구성된 데이터 집합을 읽고 견본을 두 종류로 나눈다.
가속기 자체에 내부 상태 $\vec{w} 달러가 있음을 통찰하고 입력한 견본 벡터의 내적 $\vec{w}\cdot\vec{x} 달러를 계산합니다.이 값을 활성화 함수 $\phi(z)달러를 통해 정답 $y와 비교하고 $y-\phi(z)달러에 따라 $\vec{w}달러를 수정합니다.
소스 코드
다음 github에 있습니다.
https://github.com/Bluepost59/fortran_perceptron
mod_prcptr.f90module mod_prcptr
implicit none
!----------------------------------------------------------------------
! header of perceptron
!----------------------------------------------------------------------
type perceptron
integer :: dimsion ! dimension of sample data
double precision,allocatable :: w(:)
double precision :: eta
double precision :: epoch
contains
procedure :: learn => perceptron_learn
end type perceptron
interface perceptron
module procedure init_perceptron
end interface perceptron
contains
!======================================================================
! implementations of perceptron
!----------------------------------------------------------------------
! constructer
!----------------------------------------------------------------------
type(perceptron) function init_perceptron(nnn,myeta)
integer :: nnn
double precision :: myeta
allocate(init_perceptron%w(nnn))
init_perceptron%w = 0d0
init_perceptron%dimsion = nnn
init_perceptron%eta = myeta
init_perceptron%epoch = 0
end function init_perceptron
!----------------------------------------------------------------------
! learning
!----------------------------------------------------------------------
subroutine perceptron_learn(self,mydata,y,answered_error)
class(perceptron) :: self
double precision :: mydata(:) ! 1 sample (not dataset)
double precision :: y ! true answer
logical,optional :: answered_error ! error
double precision :: z = 0d0
double precision :: output
integer :: i
answered_error = .false.
if(size(mydata) /= self%dimsion) return
z=0d0
do i=1, size(mydata)
z = z + mydata(i) *self%w(i)
end do
output = phi(z)
if(output /= y) answered_error = .true.
do i=1, self%dimsion
self%w(i) = self%w(i) + self%eta *(y-output) *mydata(i)
end do
end subroutine perceptron_learn
!
!======================================================================
! other functions
!----------------------------------------------------------------------
! activation function
!----------------------------------------------------------------------
double precision function phi(x)
double precision :: x
if(x<=0) then
phi = -1
else
phi = 1
end if
end function phi
end module mod_prcptr
낙서했기 때문에, 나는 스타일 자체가 상당히 엉망진창이라고 생각한다.perceptron%learn
샘플 데이터를 읽습니다. (데이터 집합이 아닙니다.)
테스트 코드는test입니다.f90에서 일주일 동안 데이터 파일을 읽는 동작을 반복합니다.(이것도 퍼셉션에 포함되어야 한다고 생각한다).
동작 결과
mydata.txt5.0 -7.0 -1
6.0 -8.0 -1
-1.3 6.3 1
-5.3 0.2 1
9.3 -2.2 -1
점과 선이 겹치는 것처럼 보이지만 드디어 분류된 것 같다.
error
왜 다섯 개 정도의 데이터로 2로 끝나?나는 데이터가 좋지 않은지 코드가 좋지 않은지 모르겠다.
코드가 틀렸습니다.수정 후 첫 번째 Epoke 오류 분류 후 두 번째 Epoke 이후는 0입니다.
총결산
어쨌든 괜찮은 선을 그릴 수 있어.이번에 나는 이미 기진맥진했다. 만약 시간과 열의가 있다면, 나는 다시 한 번 열심히 하고 싶다.
psyhon이 없는list와 C++의vector 같은 용기는 너무 고통스러워요.
bugfix
subroutine 내의 변수 선언이 동시에 초기화되면 그 subroutine가 2차 이상 호출되었을 때 2차 이후에는 초기화되지 않는다(가치가 계승되었다).
septcolor의 지적을 통해 알아차렸습니다.감사합니다.
smp.f90program main
integer i
! 10回ずつ呼び出してみる
do i=1,10
call smp_ng()
end do
do i=1,10
call smp_ok()
end do
contains
!=====================================
! nが初期化されず1,2,3,...と増えてしまう!
subroutine smp_ng()
!-----------------------
integer :: n=0
!-----------------------
n=n+1
write(6,*) n
end subroutine smp_ng
!=====================================
! ちゃんと毎回nが初期化され、常に1を返す
subroutine smp_ok()
!-----------------------
integer :: n
n=0
!-----------------------
n=n+1
write(6,*)n
end subroutine smp_ok
end program main
참고 문헌
module mod_prcptr
implicit none
!----------------------------------------------------------------------
! header of perceptron
!----------------------------------------------------------------------
type perceptron
integer :: dimsion ! dimension of sample data
double precision,allocatable :: w(:)
double precision :: eta
double precision :: epoch
contains
procedure :: learn => perceptron_learn
end type perceptron
interface perceptron
module procedure init_perceptron
end interface perceptron
contains
!======================================================================
! implementations of perceptron
!----------------------------------------------------------------------
! constructer
!----------------------------------------------------------------------
type(perceptron) function init_perceptron(nnn,myeta)
integer :: nnn
double precision :: myeta
allocate(init_perceptron%w(nnn))
init_perceptron%w = 0d0
init_perceptron%dimsion = nnn
init_perceptron%eta = myeta
init_perceptron%epoch = 0
end function init_perceptron
!----------------------------------------------------------------------
! learning
!----------------------------------------------------------------------
subroutine perceptron_learn(self,mydata,y,answered_error)
class(perceptron) :: self
double precision :: mydata(:) ! 1 sample (not dataset)
double precision :: y ! true answer
logical,optional :: answered_error ! error
double precision :: z = 0d0
double precision :: output
integer :: i
answered_error = .false.
if(size(mydata) /= self%dimsion) return
z=0d0
do i=1, size(mydata)
z = z + mydata(i) *self%w(i)
end do
output = phi(z)
if(output /= y) answered_error = .true.
do i=1, self%dimsion
self%w(i) = self%w(i) + self%eta *(y-output) *mydata(i)
end do
end subroutine perceptron_learn
!
!======================================================================
! other functions
!----------------------------------------------------------------------
! activation function
!----------------------------------------------------------------------
double precision function phi(x)
double precision :: x
if(x<=0) then
phi = -1
else
phi = 1
end if
end function phi
end module mod_prcptr
mydata.txt
5.0 -7.0 -1
6.0 -8.0 -1
-1.3 6.3 1
-5.3 0.2 1
9.3 -2.2 -1
점과 선이 겹치는 것처럼 보이지만 드디어 분류된 것 같다.
error
왜 다섯 개 정도의 데이터로 2로 끝나?나는 데이터가 좋지 않은지 코드가 좋지 않은지 모르겠다.
코드가 틀렸습니다.수정 후 첫 번째 Epoke 오류 분류 후 두 번째 Epoke 이후는 0입니다.
총결산
어쨌든 괜찮은 선을 그릴 수 있어.이번에 나는 이미 기진맥진했다. 만약 시간과 열의가 있다면, 나는 다시 한 번 열심히 하고 싶다.
psyhon이 없는list와 C++의vector 같은 용기는 너무 고통스러워요.
bugfix
subroutine 내의 변수 선언이 동시에 초기화되면 그 subroutine가 2차 이상 호출되었을 때 2차 이후에는 초기화되지 않는다(가치가 계승되었다).
septcolor의 지적을 통해 알아차렸습니다.감사합니다.
smp.f90program main
integer i
! 10回ずつ呼び出してみる
do i=1,10
call smp_ng()
end do
do i=1,10
call smp_ok()
end do
contains
!=====================================
! nが初期化されず1,2,3,...と増えてしまう!
subroutine smp_ng()
!-----------------------
integer :: n=0
!-----------------------
n=n+1
write(6,*) n
end subroutine smp_ng
!=====================================
! ちゃんと毎回nが初期化され、常に1を返す
subroutine smp_ok()
!-----------------------
integer :: n
n=0
!-----------------------
n=n+1
write(6,*)n
end subroutine smp_ok
end program main
참고 문헌
subroutine 내의 변수 선언이 동시에 초기화되면 그 subroutine가 2차 이상 호출되었을 때 2차 이후에는 초기화되지 않는다(가치가 계승되었다).
septcolor의 지적을 통해 알아차렸습니다.감사합니다.
smp.f90
program main
integer i
! 10回ずつ呼び出してみる
do i=1,10
call smp_ng()
end do
do i=1,10
call smp_ok()
end do
contains
!=====================================
! nが初期化されず1,2,3,...と増えてしまう!
subroutine smp_ng()
!-----------------------
integer :: n=0
!-----------------------
n=n+1
write(6,*) n
end subroutine smp_ng
!=====================================
! ちゃんと毎回nが初期化され、常に1を返す
subroutine smp_ok()
!-----------------------
integer :: n
n=0
!-----------------------
n=n+1
write(6,*)n
end subroutine smp_ok
end program main
참고 문헌
Reference
이 문제에 관하여(fortran의 추진기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bluepost59/items/e82b2419ee7ef983d524텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)