neurons.f90 1.37 KB
Newer Older
1
2
3
4
5
! Modul: Datentyp "neuron" und seine Methoden
!
! Ein Neuron implementiert eine Linearform mit Parameter-Vektor b und Offset a
! gefolgt von einer nichtlinearen Abbildung (tanh)

Wolfgang Kilian's avatar
Wolfgang Kilian committed
6
7
8
9
10
11
12
13
14
module neurons
  use kinds, only: wp

  implicit none
  private

  public :: neuron

  type :: neuron
15
     private
Wolfgang Kilian's avatar
Wolfgang Kilian committed
16
17
18
19
     real(wp) :: a
     real(wp), dimension(:), allocatable :: b
   contains
     procedure :: write
20
     procedure :: init
21
     procedure :: apply
Wolfgang Kilian's avatar
Wolfgang Kilian committed
22
23
24
25
  end type neuron

contains

26
  ! Ausgabe in übersichtlicher Form nach I/O-Unit u
Wolfgang Kilian's avatar
Wolfgang Kilian committed
27
28
29
30
31
32
  subroutine write (n, u)
    class(neuron), intent(in) :: n
    integer, intent(in) :: u

    write (u, "(1X,A)")  "Neuron:"
    write (u, "(3x,A,1x,F11.9)")  "a    =", n%a
33
34
35
36
37
    if (allocated (n%b)) then
       write (u, "(3x,A,*(1x,F11.9))")  "b    =", n%b
    else
       write (u, "(3x,A,1x,A)")      "b    =", "[leer]"
    end if
Wolfgang Kilian's avatar
Wolfgang Kilian committed
38
39
40

  end subroutine write
  
41
  ! Initialisierung mit Werten für a und b
42
43
44
45
46
47
48
49
50
51
  subroutine init (n, a, b)
    class(neuron), intent(out) :: n
    real(wp), intent(in) :: a
    real(wp), dimension(:), intent(in) :: b

    n%a = a
    n%b = b

  end subroutine init
  
52
  ! Anwendung der Abbildung auf Vektor x
53
54
55
56
57
58
59
60
61
62
63
64
  function apply (n, x) result (z)
    class(neuron), intent(in) :: n
    real(wp), dimension(:), intent(in) :: x
    real(wp) :: z

    real(wp) :: y

    y = n%a + dot_product (n%b, x)
    z = tanh (y)

  end function apply

Wolfgang Kilian's avatar
Wolfgang Kilian committed
65
end module neurons