Minggu, 24 November 2013

Jaringan Syaraf Tiruan menggunakan Visual Basic 6

Jaringan syaraf tiruan merupakan salah satu sistem pemrosesan informasi yang didesain dengan menirukan cara kerja otak manusia dalam menyelesaikan suatu masalah dengan melakukan proses belajar melalui perubahan bobot sinapsisnya.

Kebanyakan buku mungkin hanya menulis teori dari JST (Jaringan Syaraf Tiruan) dan biasanya implementasinya menggunakan Matlab. Yaaa mungkin karena di Matlab sudah ada fungsi untuk Neural Network (JST). Hal ini menjadikan teori yang ada di buku tersebut "seolah olah tidak digunakan" karena kita hanya menggunakan tools yang ada di Matlab. Tanpa  menerapkan secara langsung teorinya. Hal ini menjadikan sesuatu yang menarik jadi kurang menarik.




Program berikut dibuat menggunakan Visual Basic 6 beberapa tahun lalu saat ada teman yang meminta bantuan untuk program Jaringan Syaraf tiruan menggunakan VB 6. Untuk teori tentang JST (Jaringan Syaraf Tiruan) Sy tidak menyertakan di sini. Teorinya bisa di search dan banyak tersedia di blog yg lain.

JST yg digunakan di sini adalah menggunakan metode Backpropagation. Dengan dua output. Ceritanya adalah ingin membuat suatu sistem yang terhubung dengan webcam kemudian gambar yang diperoleh diolah sehingga sistem tersebut bisa membedakan apakah objek di depannya merupakan penghalang atau bukan. Hal ini bisa diterapkan pada sistem robotik. Biasanya sih lebih mudah menggunakan sensor Ultrasonik dari pada menggunakan webcam. Yupp itulah tantangannya menggunakan webcam.

Karena webcam menghasilkan gambar yang tidak secara langsung merepresentasikan besaran jarak dari suatu objek didepannya alias mau jauh atau dekat gak perduli, webcam hanya bertugas menghasilkan frame image.

Baik Sy tidak fokus pada program bagaimana webcam mengambil gambar, jadi Sy CapturePRO untuk fungsi pengambilan gambar (bisa disearch dan didownload waktu itu). Bisa pake yang lain juga kok.

Disini Sy fokus pada program JSTnya. Di sini JST akan memproses crop image dari hasil gambar webcam sebagai input dan menghasilkan dua output sesuai permintaan. Kalo di sini outputnya (0 dan 1) atau (1 dan 0), karena hasil ini akan dibaca oleh perangkat berikutnya untuk mengambil keputusan apakah robot akan belok atau tidak, maka akan lebih mudah jika output di representasikan dengan 0 dan 1.

Sebelum proses training dijalankan maka di set terlebih dahulu Y out yang dikehendaki dan di set juga error yg diinginkan. Kemudian Bobot yang dihasilkan akan disimpan dalam suatu file untuk kemudian pada saat dijalankan (Test) pada sistem tidak perlu lagi melakukan training dan bisa langsung menggunakan bobot yang sudah diperoleh pada saat training JST.

Program ini menggunakan VB.6 dan belum Sy koding ulang di VB.Net. Silahkan disesuaikan sendiri untuk VB.Net.
    
Option Explicit
Dim StopTrain, StopTest As Boolean
Dim Bo2tVTraining(1 To JumNeHid, 0 To JumInp), Bo2tWTraining(1 To JumOut, 0 To JumNeHid) As Double
Dim YoutTraining(1 To JumOut) As Double




Private Sub CmdTraining_Click()
Dim i, j, k, x, y, n As Integer
Dim xInpTrain(1 To JumInp) As Double
''
Dim zHid(1 To JumNeHid) As Double
Dim xv, zw, dw, z_net(1 To JumNeHid), y_net(1 To JumOut) As Double
Dim Iter, MaxIter  As Long
Dim Target(1 To JumOut), Error, MSE, MaxErr, alfa  As Double
Dim deltaOut(1 To JumOut), deltaHidden(1 To JumNeHid), DeltaW(1 To JumOut, 0 To JumNeHid), DeltaV(1 To JumNeHid, 0 To JumInp), Delta_Net(1 To JumNeHid) As Double

TxtMse.Text = ""
TxtIter.Text = ""
CmdTraining.Enabled = False
CmdSave.Enabled = False
'inisialisasi bobot
For j = 1 To JumNeHid
    For i = 0 To JumInp
    Randomize Timer
    Bo2tVTraining(j, i) = Int(Rnd * 2) - Rnd * 1
    Next i
Next j
For k = 1 To JumOut
    For j = 0 To JumNeHid
    Randomize Timer
    Bo2tWTraining(k, j) = Int(Rnd * 2) - Rnd * 1
    Next j
Next k
'normalisasi masukan
n = 0
For x = 1 To 52                 'LbrCropX
    For y = 1 To 44             'LbrCropY
    n = n + 1
    xInpTrain(n) = (InputBiner(x + BtsKiri - 1, y + BtsAtas - 1)) / 255
    Next y
Next x
'======================<<<<<<<<<<<backpropagation>>>>>>>>>>============================

MaxErr = Val(TxtMaxError.Text) '0.0001
MaxIter = Val(TxtMaxEpoch.Text) '1000
alfa = Val(TxtLearnRate.Text) '0.1 'learning rate
Iter = 0
If CmbTarget.ListIndex = 0 Then
        Target(1) = 1
        Target(2) = 0
Else:   Target(1) = 0
        Target(2) = 1
End If
'------------------>>>>>>>>>>>>>>>>>>>>>begin<<<<<<<<<<<<<<<<<<<<----------------------
StopTrain = False
Do
    DoEvents
' -->> forward
    Iter = Iter + 1

    For j = 1 To JumNeHid
        xv = 0
        For i = 1 To JumInp
        xv = xv + (xInpTrain(i) * Bo2tVTraining(j, i))
        Next i
        z_net(j) = Bo2tVTraining(j, 0) + xv
        zHid(j) = f(z_net(j))
    Next j
    Error = 0
    For k = 1 To JumOut
        zw = 0
        For j = 1 To JumNeHid
        zw = zw + (zHid(j) * Bo2tWTraining(k, j))
        Next j
        y_net(k) = Bo2tWTraining(k, 0) + zw
        YoutTraining(k) = f(y_net(k))
        Error = Error + ((Target(k) - YoutTraining(k)) ^ 2)
    Next k
    MSE = Error / JumOut
  
'---------------------------------------->grafik
    MSChart1.RowCount = Iter
    MSChart1.Row = Iter
    MSChart1.RowLabel = Iter
    MSChart1.Column = 1
    MSChart1.Data = MSE
'----------------------------------------->end of grafik

    TxtMse.Text = Format(MSE, "0.00E+00")
    TxtIter.Text = Iter

    If MSE < MaxErr Then Exit Do
' -->> backward
    For k = 1 To JumOut
        deltaOut(k) = (Target(k) - YoutTraining(k)) * df(y_net(k))
    Next k
    For k = 1 To JumOut
        DeltaW(k, 0) = alfa * deltaOut(k) * 1
        For j = 1 To JumNeHid
        DeltaW(k, j) = alfa * deltaOut(k) * zHid(j)
        Next j
    Next k
    For j = 1 To JumNeHid
        dw = 0
        For k = 1 To JumOut
        dw = dw + (deltaOut(k) * Bo2tWTraining(k, j))
        Next k
        Delta_Net(j) = dw
    Next j
    For j = 1 To JumNeHid
        deltaHidden(j) = Delta_Net(j) * df(z_net(j))
    Next j
    For j = 1 To JumNeHid
        DeltaV(j, 0) = alfa * deltaHidden(j) * 1
        For i = 1 To JumInp
        DeltaV(j, i) = alfa * deltaHidden(j) * xInpTrain(i)
        Next i
    Next j
    For k = 1 To JumOut
        For j = 0 To JumNeHid
        Bo2tWTraining(k, j) = Bo2tWTraining(k, j) + DeltaW(k, j)
        Next j
    Next k
    For j = 1 To JumNeHid
        For i = 0 To JumInp
        Bo2tVTraining(j, i) = Bo2tVTraining(j, i) + DeltaV(j, i)
        Next i
    Next j
Loop Until Iter >= MaxIter Or StopTrain = True
'------------------>>>>>>>>>>>>>>>>>>>>>finish<<<<<<<<<<<<<<<<<<<<----------------------
'====================<<<<<<<<<<<end of backpropagation>>>>>>>>>>============================

CmdTraining.Enabled = True
CmdSave.Enabled = True
End Sub



 
Private Sub CmdTest_Click()
Dim Bo2tVTest(1 To JumNeHid, 0 To JumInp, 1 To 10), Bo2tWTest(1 To JumOut, 0 To JumNeHid, 1 To 10) As Double
Dim i, j, k, x, y, n, l, m As Integer
Dim xInpTest(1 To JumInp) As Double
Dim NamaBobot, NamaTarget As String
Dim save As String
Dim bytRed, bytGreen, bytBlue, bytGrey, bytbiner2 As Integer
Dim TargetTest(1 To JumOut, 1 To 10) As Double
''
Dim zHid(1 To JumNeHid) As Double
Dim YoutTest(1 To JumOut) As Double
Dim xv, zw, z_net(1 To JumNeHid), y_net(1 To JumOut) As Double
Dim Error, MSE(1 To 10) As Double
Dim Msex, MinMse As Double
Dim YoutTestAkhir(1 To JumOut) As Integer


CmdTest.Enabled = False
'membaca bobot
For l = 1 To 10
NamaBobot = "\bobot\Sample" & l
NamaTarget = "\OutTraining\Yout" & l
Open App.Path & NamaBobot & "BobotV.txt" For Input As #1
For j = 1 To JumNeHid
    For i = 0 To JumInp
    Input #1, Bo2tVTest(j, i, l)
    Next i
Next j
Close #1

Open App.Path & NamaBobot & "BobotW.txt" For Input As #2
For k = 1 To JumOut
    For j = 0 To JumNeHid
    Input #2, Bo2tWTest(k, j, l)
    Next j
Next k
Close #2

Open App.Path & NamaTarget & ".txt" For Input As #3
For k = 1 To JumOut
    Input #3, TargetTest(k, l)
Next k
Close #3
Next l
'======================<<<<<<<<<<<backpropagation>>>>>>>>>>============================


'------------------>>>>>>>>>>>>>>>>>>>>>begin<<<<<<<<<<<<<<<<<<<<----------------------
StopTest = False
Do Until StopTest = True
    On Error GoTo errorhandler
    save = App.Path & "\Sample.jpg"
    CapturePRO1.FrameFile = save
    CapturePRO1.CaptureFrame
    PicHidden.Refresh
    PicHidden.Picture = LoadPicture(save)
    BitBlt PicPreview.hdc, 0, 0, Lebar, Tinggi, PicHidden.hdc, 0, 0, vbSrcCopy
    n = 0
    For x = BtsKiri To BtsKiri + LbrCropX - 1
        For y = BtsAtas To BtsAtas + LbrCropY - 1
            Pixels(x, y) = PicHidden.Point(x, y)
            bytRed = Pixels(x, y) And &HFF&
            bytGreen = geserkiri((Pixels(x, y) And &HFF00&), 8)
            bytBlue = geserkiri((Pixels(x, y) And &HFF0000), 16)
            bytGrey = (bytRed + bytGreen + bytBlue) / 3
            If bytGrey < 90 Then
                bytbiner2 = 0
            Else: bytbiner2 = 255
            End If
            n = n + 1
            xInpTest(n) = bytbiner2 / 255
        Next y
    Next x
' -->> forward
    DoEvents
    For l = 1 To 10
        For j = 1 To JumNeHid
            xv = 0
            For i = 1 To JumInp
            xv = xv + (xInpTest(i) * Bo2tVTest(j, i, l))
            Next i
            z_net(j) = Bo2tVTest(j, 0, l) + xv
            zHid(j) = f(z_net(j))
        Next j
        Error = 0
        For k = 1 To JumOut
            zw = 0
            For j = 1 To JumNeHid
            zw = zw + (zHid(j) * Bo2tWTest(k, j, l))
            Next j
            y_net(k) = Bo2tWTest(k, 0, l) + zw
            YoutTest(k) = f(y_net(k))
            Error = Error + ((TargetTest(k, l) - YoutTest(k)) ^ 2)
        Next k
        MSE(l) = Error / JumOut
    Next l
  
    MinMse = 1
    For l = 1 To 10
        Msex = MSE(l)
        MinMse = Min(Msex, MinMse)
    Next l
  
    For m = 1 To 10
        If MinMse = MSE(m) Then
            Exit For
        End If
    Next m
    YoutTestAkhir(1) = CInt(TargetTest(1, m))
    YoutTestAkhir(2) = CInt(TargetTest(2, m))
    Open App.Path & "\OutTest\OutTest.Txt" For Output As #4
    For k = 1 To JumOut
        Print #4, YoutTestAkhir(k)
    Next k
    Close #4
  
    TxtOut1.Text = YoutTestAkhir(1)
    TxtOut2.Text = YoutTestAkhir(2)
    TxtError.Text = Format(MinMse, "0.00E+00")
Loop
CmdTest.Enabled = True
Exit Sub
errorhandler:
MsgBox "Maaf koneksi dengan kamera belum berhasil", vbInformation, "Status koneksi"
PicHidden.Refresh
Me.CapturePRO1.Preview = False
CmdConnect.Caption = "Connect"
CmdConnectTraining.Caption = "Connect"
CmdTest.Enabled = True
End Sub


Berikut contoh tampilan sederhananya untuk mode training penentuan bobot (ternyata masih ada print screennya :D)

Dan berikut contoh tampilan untuk mode penggunaan JSTnya
Pengen sih di Run ulang tapi sayangnya gak bisa di Run di VB. Net :'( (sdh gak pake VB 6)


Semoga Bermanfaat..

8 komentar:

  1. mas bisa minta souce file VB nya?? tolong kirim ke irsanfarohi91@gmail.com
    trims mas

    BalasHapus
  2. @all: thanks kunjungannya yaa..
    @Reno: Trimakasih referensinya bagus :)
    @Irsan: mas, source code utamanya sama seperti di atas, silahkan disesuaikan sesuai keperluan. Trimakasih

    BalasHapus
  3. gan, minta dong source codenya,,,,
    trmakash, fadilahsandi@gmail.com

    BalasHapus
  4. kak minta soce file vb nya tolong kirim ke ilfansetia@ymail.com

    BalasHapus
  5. Wah, Min boleh minta source codenya min?
    Faadilah_Rizkaini@yahoo.com

    BalasHapus
  6. kak..bg donk source codenya.kamed.murdiono46@gmail.com

    BalasHapus
  7. gan bisa mnta source kodenya .. rizaljidi@gmail.com

    BalasHapus
  8. I am very interested in the information contained in this post. The information contained in this post inspired me to generate research ideas.
    Lokasi UMJ

    BalasHapus

Selamat berinovasi :D Salam berbagi..

Cara mengetahui ip address raspberry atau perangkat lain yg terhubung pada wifi yg sama

1. Install nmap [jika belum ada]: sudo apt install nmap 2. Cek ip address komputer (yg akses ke wifi yang sama): ip addr misal hasilnya 192....