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.f90
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
낙서했기 때문에, 나는 스타일 자체가 상당히 엉망진창이라고 생각한다.perceptron%learn 샘플 데이터를 읽습니다. (데이터 집합이 아닙니다.)
테스트 코드는test입니다.f90에서 일주일 동안 데이터 파일을 읽는 동작을 반복합니다.(이것도 퍼셉션에 포함되어야 한다고 생각한다).

동작 결과


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.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

참고 문헌

  • Pythhon 기계 학습 프로그래밍 달인 데이터 과학 이론과 실천(impress top gear)
  • 좋은 웹페이지 즐겨찾기