1 Ocak 2019 Salı

Site Haritası


CodeIgniter Yayınları
1. Merhaba Dünya: CodeIgniter'da Merhaba Dünya yazısını görün...
2. Template Sistemi: CodeIgniter ile statik bir site yapmanıza yetecek düzeyde bilgi edinin.
3. Upload Meselesi: Yönetim panellerinin vazgeçilmezi: Resim upload etmek!
4. Upload - Resim Havuzu Örneği: Resim upload edin, klasördeki resimleri listeleyin, silin.
5. Veritabanı İşlemleri: Model nasıl kullanılır? Sıfırdan, veritabanına bağlı site kodlama zamanı...


PHP Yayınları
1. PDO ile MySQL İşlemleri Class'ı: PDO kullanmanın basit ve hızlı yolu...
2. PHP ile Yapay Sinir Ağı Oluşturmak: class_neuralnetwork.php class'ının kullanılması...
3. Ziyaretçi Loglarını Tutan Bir Class: Sitenize gelen ziyaretçilerin bilgilerini kolayca kaydedin...




Bu blog, PHP üzerindeki kodlama yeteneklerimizi geliştirelim diye kuruldu. Daha iyi projeler geliştirebilmemizi istediğim için kuruldu. İnternet üzerindeki diğer kaynaklara, özgür paylaşıma katkıda bulunmak için kuruldu.

Blogdaki yayınları anlayabilmeniz için, orta düzeyde PHP bilmeniz gerekiyor. Orta düzey PHP bildiğimi nasıl anlarım? diyor olabilirsiniz. Eğer sıfırdan yayınlanma aşamasına kadar dinamik bir web sitesini kodlayabiliyorsanız, class nedir, function nedir temel düzeyde de olsa biliyorsanız, bilmediğiniz bir komut gördüğünüz zaman bu komutun ne işe yaradığını araştırıp bulabiliyor ve anlayabiliyorsanız, orta düzeyde PHP bildiğinizi varsayıyorum.

Umarım Türkiye'deki programlama dünyasına bir katkıda bulunabilirim.

21 Temmuz 2018 Cumartesi

Ziyaretçi Kaydı Tutmak için Bir Class



Ziyaretçi Verilerini Loglamak

Çok uzun bir aradan sonra blog'uma yine bi'şeyler yazayım dedim. Hoş geldin okurum.

Bu yayında, ziyaretçi loglamak için oluşturduğum bir class'ımı Visual Studio Code'daki kodlarımdan direkt kopyalayıp buraya yapıştırdım. (Tabi kodumun güvenliği nedeniyle bazı ufak değişiklikler yaparak...) Ama yapıştırınca benim tab kullanıp yaptığım girintiler kayboldu. Sayfada düzgün görünmesi için bu girintileri boşluk kullanarak verdim. Bu sırada silinmiş karakterler/satırlar olabilir. Eğer böyle bir durum fark ederseniz lütfen yorumla veya direkt bana bildirin, düzelteyim.

Bu sınıf kısaca, MySQL veritabanıyla birlikte çalışan, sayfalarınızı ziyaret eden kullanıcıların verilerini tutmanıza yarayan bir sınıftır. Sınıf, veritabanınızda kendi tablosunu otomatik olarak oluşturur. Ziyaretçinizin sayfaya geliş tarihi, tarayıcı adı ve versiyonu, işletim sistemi, sayfa adı ve ip numarasını otomatik alıp oluşturduğu tabloya kaydeder. Sınıfı nasıl kullanacağınızla ilgili açıklamaları en alttaki açıklama satırlarında bulabilirsiniz.

Eğer sizde çalışmıyorsa yine yorumlarda bildirirseniz düzeltmeleri yapmaya çalışırım. Aynı şekilde eğer class'ı geliştirip paylaşmam için önerileriniz olursa da yine yorumlarda bildirin.

Bu sınıfa ileriki zamanlarda muhtemelen logları tarih aralıklarıyla okuma, belli ip'leri sorgulama, işletim sistemlerine göre oran çıkarma gibi fonksiyonlar da eklerim. Eğer ekleme yaparsam (ve unutmazsam) burada paylaşmaya çalışırım.



<?php

class UserLogger {

    // DB connection variables
    private $dbHost = 'localhost';
    private $dbUserName = 'root';
    private $dbPassword = '1234';
    private $dbName = 'mydatabase';
    private $dbConnectionString;
    private $dbConnection;

    // Log table variables
    private $tableName = 'userlogs';
    private $primaryKeyColumnName = 'id';

    // Aşağıdaki dizide değişiklik yapılırsa addLog() fonksiyonunda da değişiklik gerektirebilir.
    private $tableColumns = [
        [ 'name' =>'log_ip', 'type'=>'VARCHAR(39)', 'nullable'=>true, 'default'=>null ],
        [ 'name' =>'log_os', 'type'=>'TEXT', 'nullable'=>true, 'default'=>null ],
        [ 'name' =>'log_browser_name', 'type'=>'TEXT', 'nullable'=>true, 'default'=>null ],
        [ 'name' =>'log_browser_vers', 'type'=>'TEXT', 'nullable'=>true, 'default'=>null ],
        [ 'name' =>'log_page_name', 'type'=>'TEXT', 'nullable'=>true, 'default'=>null ],
        [ 'name' =>'log_description', 'type'=>'TEXT', 'nullable'=>true, 'default'=>null ],
        [ 'name' =>'log_date', 'type'=>'DATETIME', 'nullable'=>false, 'default'=>null ]
    ];
    private $tableCreated = false;
    
    // Usaful variables
    public $lastSqlQuery = null;
    public $lastError = null;
    private $user_agent = null;

    public function __construct($addLog=false,$description)
    {
        date_default_timezone_set('Europe/Istanbul');
        $this->user_agent = $_SERVER['HTTP_USER_AGENT'];
        $this->dbConnectionString = 'mysql:host='.$this->dbHost.';dbname='.$this->dbName.';charset=utf8';
        if($addLog===true) $this->addLog(true,$description);
    }

    private function openDbConnection()
    {
        try {
            $this->dbConnection = new PDO($this->dbConnectionString,$this->dbUserName,$this->dbPassword);
            return true;
        }
        catch(Exception $e) { $this->lastError = $e->errorMessage(); return false; }
    }

    private function closeDbConnection()
    {
        $this->dbConnection = null;
    }

    public function createLogTable()
    {
        if($this->tableCreated) return false;
        $sql = 'CREATE TABLE '.$this->dbName.'.'.$this->tableName.' (';
        $sql.= $this->primaryKeyColumnName.' INT NOT NULL AUTO_INCREMENT, ';
        foreach($this->tableColumns as $column) {
            $sql.= $column['name'].' ';
            $sql.= $column['type'].' ';
            $sql.= $column['nullable'] ? 'NULL' : 'NOT NULL';
            $sql.= $column['default']!=null ? ' DEFAULT '.$column['default'].', ' : ', ';
        }
        $sql.= 'PRIMARY KEY('.$this->primaryKeyColumnName.')) ';
        $sql.= 'ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;';
        $this->lastSqlQuery = $sql;
        try {
            if($this->openDbConnection()===false) {
            $this->lastError = 'Veritabanı bağlantısı kurulamadı.';
            return false;
        }
        if ($result = $this->dbConnection->query("SHOW TABLES LIKE '".$this->tableName."'")) {
            if($result->num_rows > 0) {
                $this->lastError = 'Tablo veritabanında zaten oluşturulmuş.';
                $this->tableCreated = true;
                return false;
            }
        }
        if($this->dbConnection->query($sql)===true) $this->tableCreated=true;
        $this->closeDbConnection();
        }
        catch(Exception $e) {
            $this->lastError = $e->getMessage();
            $this->closeDbConnection();
            return false;
        }
        return $this->tableCreated;
    }

    public function addLog($page_name=null, $description=null)
    {
        $log_ip = $this->getIPAddress();
        $log_masked_ip = $_SERVER['REMOTE_ADDR'];
        $log_os = $this->getOS();
        $log_browser_name = $this->getBrowserName();
        $log_browser_vers = $this->getBrowserVersion();
        if($page_name===true) $page_name = $_SERVER['REQUEST_URI'];
        elseif($page_name===false) $page_name = $_SERVER['SCRIPT_NAME'];
        $log_date = date('Y-m-d H:i:s');
        try {
            if($this->openDbConnection()===false) {
                $this->lastError = 'Veritabanı bağlantısı kurulamadı.';
                return false;
            }
            $query = $this->dbConnection->prepare('
                INSERT INTO '.$this->tableName.' SET
                log_ip = ?,
                log_os = ?,
                log_browser_name = ?,
                log_browser_vers = ?,
                log_page_name = ?,
                log_description = ?,
                log_date = ?
            ');
            $insert = $query->execute(array(
                $log_ip,
                $log_os,
                $log_browser_name,
                $log_browser_vers,
                $page_name,
                $description,
                $log_date
            ));
            if ($insert) {
                $this->lastSqlQuery = $query->queryString;
                $this->closeDbConnection();
                return true;
            }
            else {
                $this->lastError = 'Kullanıcının beritabanına loglanması işlemi başarısız oldu.';
                $this->closeDbConnection();
                return false;
            }
        }
        catch (Exception $e) {
            $this->lastError = $e->getMessage();
            $this->closeDbConnection();
            return false;
        }
    }

    public function getOS()
    {
        $os_array = array(
            '/windows nt 10/i' => 'Windows 10',
            '/windows nt 6.3/i' => 'Windows 8.1',
            '/windows nt 6.2/i' => 'Windows 8',
            '/windows nt 6.1/i' => 'Windows 7',
            '/windows nt 6.0/i' => 'Windows Vista',
            '/windows nt 5.2/i' => 'Windows Server 2003/XP x64',
            '/windows nt 5.1/i' => 'Windows XP',
            '/windows xp/i' => 'Windows XP',
            '/windows nt 5.0/i' => 'Windows 2000',
            '/windows me/i' => 'Windows ME',
            '/win98/i' => 'Windows 98',
            '/win95/i' => 'Windows 95',
            '/win16/i' => 'Windows 3.11',
            '/macintosh|mac os x/i' => 'Mac OS X',
            '/mac_powerpc/i' => 'Mac OS 9',
            '/linux/i' => 'Linux',
            '/ubuntu/i' => 'Ubuntu',
            '/iphone/i' => 'iPhone',
            '/ipod/i' => 'iPod',
            '/ipad/i' => 'iPad',
            '/android/i' => 'Android',
            '/blackberry/i' => 'BlackBerry',
            '/webos/i' => 'Mobile'
        );
        $os_platform = null;
        foreach($os_array as $regex => $value) if(preg_match($regex, $this->user_agent)) {
            $os_platform = $value;
            break;
        }
        return $os_platform;
    }

    public function getBrowserName()
    {
        if (strpos($this->user_agent,'MSIE') !== false) return 'Internet Explorer';
        elseif(strpos($this->user_agent,'Trident') !== false) return 'Internet Explorer';
        elseif(strpos($this->user_agent,'Firefox') !== false) return 'Mozilla Firefox';
        elseif(strpos($this->user_agent,'Chrome') !== false) return 'Google Chrome';
        elseif(strpos($this->user_agent,'Opera Mini') !== false) return "Opera Mini";
        elseif(strpos($this->user_agent,'Opera') !== false) return "Opera";
        elseif(strpos($this->user_agent,'Safari') !== false) return "Safari";
        else return null;
    }

    public function getBrowserVersion()
    {
        $bname = $this->getBrowserName();
        if($bname=='Internet Explorer') {
            if(strrpos($this->user_agent, 'MSIE') !== false)
            return (int)explode('MSIE', $this->user_agent)[1];
            if(strrpos($this->user_agent, 'Trident/') !== false)
            return (int)explode('rv:', $this->user_agent)[1];
        }
        $ub = null;
        if ($bname == 'Mozilla Firefox') $ub = "Firefox";
        elseif($bname == 'Google Chrome') $ub = "Chrome";
        elseif($bname == 'Opera') $ub = "Opera";
        elseif($bname == 'Safari') $ub = "Safari";
        elseif($bname == 'Netscape') $ub = "Netscape";
        else return null;

        $known = array('Version', $ub, 'other');
        $pattern = '#(?<browser>'.join('|',$known) .')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
        if(!preg_match_all($pattern, $this->user_agent, $matches)) return null;

        $version = null;
        $i = count($matches['browser']);
        if($i!=1) {
            if(strripos($this->user_agent,"Version") < strripos($this->user_agent,$ub))
                $version=$matches['version'][0];
            else $version=$matches['version'][1];
        } else $version= $matches['version'][0];
        if ($version==null || $version=="") return null;
        return $version;
    }


    public function getIPAddress()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP'];
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR'];
        if (!empty($_SERVER['REMOTE_ADDR'])) return $_SERVER['REMOTE_ADDR'];
        else return null;
    }

}

/*
KURULUM

1. Bu dosya sayfaya include edilir.

include('UserLogger.php');

2. Sınıftaki veritabanı bağlantı değerleri düzenlenir.

// DB connection variables
private $dbHost = 'localhost';
private $dbUserName = 'root';
private $dbPassword = '';
private $dbName = 'mydatabase';

3. Veritabanında tablonun oluşturulması için bir defaya mahsus aşağıdaki komut çalıştırılır.
Veritabanında tablo oluştuktan sonra bu komut bir daha kullanılmamalıdır.

(new UserLogger())->createLogTable();

KULLANIM

1. Yalnızca loglama yapılacak, başka bir işlem yapılmayacaksa aşağıdaki satırlardan istenen biri bullanılabilir.

(new UserLogger())->addLog(); // Bu örnekte, sayfa adı ve açıklama verileri null kaydedilir.

$logger = new UserLogger(); $logger->addLog(); // Bu örnekte sayfa adı ve açıklama verileri null kaydedilir.

new UserLogger(true); // Bu örnekte direkt olarak addLog(true) fonksiyonu işletilir.

new UserLogger(true,'Açıklama'); // Börnekte direkt olarak addLog(true,'Açıklama') fonksiyonu işletilir.

2. Sayfa adı, addLog() fonksiyonunu ilk parametresi ile yöntemlerden biriyle kaydedilebilir.
İlk parametre boş bırakıldığında sayfa adı null olarak kaydedilecektir.

(new UserLogger())->addLog(false); // Sayfa adını otomatik alacaktır.

(new UserLogger())->addLog(true); // Sayfa adını, GET değerleriyle birlikte olarak otomatik alacaktır.

(new UserLogger())->addLog('Sayfa Adı'); // Sayfa adı olarak string veri gönderilebilir.

3. Loglamayla ilgili açıklama da kaydetmek için addLog()'un ikinci parametresi kullanılabilir.

(new UserLogger())->addLog(null, 'Sayfa adı kaydedilmeden yapılan loglama için açıklama');

(new UserLogger())->addLog('Sayfa Adı', 'Sayfa adı kaydedilerek yapılan loglama için açıklama');

4. Sınıfın loglama yapmak için kullandığı fonksiyonlar public tanımlı olduğu için kullanılabilirler:

$logger = new UserLogger();
echo $logger->getIPAddress(); // İstemcinin IP adresi
echo $logger->getBrowserName(); // İstemcinin tarayıcı adı
echo $logger->getBrowserVersion(); // İstemcinin tarayıcı sürümü
echo $logger->getOS(); // İstemcinin işletim sistemi

5. Loglama sırasında bir hata oluşup oluşmadığı kontrol edilebilir:

$logger = new UserLogger();
if(!$logger->addLog()) echo $logger->lastError;

6. İşletilen son sql sorgusu görüntülenebilir:

$logger = new UserLogger();
$logger->addLog();
echo $logger->lastSqlQuery; // PDO kullanıldığı için gönderilen veriler ? karakteriyle görüntülenecektir.

*/

?>



3 Aralık 2015 Perşembe

PHP ile Yapay Sinir Ağı (Denetimli Öğrenme Algoritması ile)



PHP ile Yapay Sinir Ağı Oluşturmak




Bu konuda internette Türkçe bilgi bulmak pek kolay değil. Bu makaleyi bu nedenle yazıyorum.

Bu makalede yapılanı anlamanız için yapay sinir ağlarının ne olduğunu biliyor olmanız gerekiyor. Yani burada "yapay sinir ağı nedir?" değil "PHP ile yapay sinir ağı nasıl oluşturulur?" meselesini inceleyeceğiz.

Sıfırdan yapay sinir ağı kodlamasını anlatmayacağım. Bunun için yazılmış ve paylaşıma sunulmuş bir class'ın nasıl kullanılacağını anlatacağım.

Öncelikle şu linkten, class_neuralnetwork.php dosyasını indirip sitemizin kök klasörüne taşıyoruz:
https://github.com/infostreams/neural-network

Öncelikle bir arayüz tasarlayalım. Bu arayüz sayesinde, eğitilmiş bir yapay sinir ağına veriler gönderip sonuçları okuyacağız.

Buyrun, index.php adlı dosyamız:
<!DOCTYPE HTML>
<html>
<head>
  <meta charset="UTF-8">
  <title>YZ</title>
  <link rel="stylesheet" type="text/css" href="css.css" />
  <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
  <script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
  <script type="text/javascript" src="js.js"></script>
</head>
<body>
  <table id=arayuz cellpadding=0 cellspacing=50>
        <tr><td id="cevap"></td></tr>
  <tr>
  <td id="ileti_kutusu" height=50>
  <input type="text" id="kullanici" autocomplete="off" />
  <button id="btn_gonder">Gönder</button>
  </td>
  </tr>
  </table>
</body>
</html>

Gördüğünüz gibi sayfama bazı stil ve js dosyaları da çağırıyorum.

Buyrun, css.css adlı dosyamız:




* {margin:0; padding:0; }
html,body,table {height:100%;}
body { font-family:Verdana; }
#arayuz { text-align:center; vertical-align:middle;  width:100%; background-color:#ccc; }
#cevap { 
font-size:15px; 
letter-spacing:.5px; 
border:1px solid #333; 
box-shadow:0px 3px 6px #555 inset; 
background-color:#f3f3f3; 
border-radius:5px;
}
#kullanici {
width:50%;  height:20px; padding:10px; 
font-size:15px;  letter-spacing:.5px; 
outline:none; 
border-radius:5px; border:1px solid #777;
}
#btn_gonder {
width:100px; height:42px; 
font-size:15px; letter-spacing:.5px; text-shadow:0px 0px 2px #555; 
border-radius:5px; border:1px solid #333; box-shadow:0px -1px 10px #03c inset;
background-color:#09c; color:#fff; 
cursor:pointer; 
}
#btn_gonder:hover { background-color:#39f; box-shadow:0px -1px 10px #06d inset; }




Buyrun, js.js adlı dosyamız:



$(document).ready(function() {
  $('#btn_gonder').click(function() {
  if($('#kullanici').val()!="")
  $.ajax({
                type:'POST',
  url:'ysa_cevap.php',
  data:'kullanici='+$('#kullanici').val(),
  beforeSend :function() { 
                    $('#cevap').stop().animate({'background-color':'#aaa','color':'#555'},200); 
                },
  success:function(ajaxcevap){
  $('#cevap').html(ajaxcevap);
  $('#kullanici').attr('placeholder',$('#kullanici').val()).val("");
  $('#cevap').stop().animate({'background-color':'#f3f3f3','color':'#000'},200);
  }
  }) 
        else $('#cevap').stop().animate({'background-color':'#aaa','color':'#555'},200);
  });
});




Henüz yapay sinir ağıyla ilgili bi'şey yapmadık. Stil dosyamız sadece arayüzümüzün şeklini şemalini çıkarttı. JS dosyamız da index.php'deki Gönder butonuna tıklandığında AJAX metoduyla ysa_cevap.php'ye metin kutusundaki verileri gönderme işini yapmak için hazırlandı. AJAX metoduyla bu işi yapmak istedim çünkü hem PHP işleri index.php'den ayrı bir sayfada gerçekleşsin hem de sayfa her Gönder butonuna tıkladığımızda yeniden oluşturulmasın istedim.

Peki ysa_cevap.php dosyamızda ne var? Bu dosya, eğitilmiş yapay sinir ağına gönderilen verileri yapay sinir ağına işleterek, ekrana sinir ağının çıktısını veriyor. JS dosyamız da burada ekrana yazılan çıktıyı alıp index.php'deki kendi alanına bunu yazdırmakla görevli... 

Bakalım ysa_cevap.php dosyamızda neler var:



<?php
$k = (isset($_POST["kullanici"])) ? $_POST["kullanici"] : "";
if($k!="") {
      require_once("class_neuralnetwork.php");
      $n = new NeuralNetwork (2, 3, 1); // 2 giriş, 3 gizli, 1 çıkış nöronu
      $n->setVerbose(false); // hata verme
      $n->load("ysa.txt");
      $veri = str_split($k);
      $i=1;
      foreach($n->calculate($veri) as $eleman) { echo "<br />Sonuç $i: $eleman"; $i++; }
}
?>



1.satır: AJAX'ın bize POST ettiği (metin kutusundan alınan) değeri $k değişkenine attık.
2.satır: eğer $k değişkeni boş değilse
3.satır:     class_neuralnetwork.php dosyasını çağır.
4.satır:     $n adında, 2 giriş, 3 gizli, 1 çıkış nöronu bulunan bir ağ oluştur.
5.satır:     $n'de bir hata oluşursa bunu ekrana basma.
6.satır:     $n'nin değerleri ysa.txt'deki eğitilmiş ağın değerleri olsun.
7.satır:     $k'daki karakterleri birbirinden ayırıp dizi haline getir. Bu dizi $veri olsun.
9.satır:     $veri dizisini ağa gönderip işlet ve çıkış nöronlarından elde ettiğin verileri ekrana yaz.

Sürekli eğitilmiş ağ deyip duruyoruz da, bu ağı nerede eğitiyoruz? Nerede eğitip de ağın değerlerini ysa.txt adlı bir dosyaya kaydediyoruz? Bunun için, henüz herhangi bir arayüz kodlamadığım egitim.php adlı dosyam var. Buyrun:



<meta charset="UTF-8" />
<?php

require_once("class_neuralnetwork.php");

$n = new NeuralNetwork(2, 3, 1); // 2 giriş, 3 gizli, 1 çıkış nöronu

// Eğitim verileri
$n->addTestData(array(0, 0), array(1)); // 0 0 için 1 üreteceksin
$n->addTestData(array(0, 1), array(0)); // 0 1 için 0 üreteceksin
$n->addTestData(array(1, 0), array(0)); // 1 0 için 0 üreteceksin
$n->addTestData(array(1, 1), array(1)); // 1 1 için 1 üreteceksin

$maks = 10;

$i=0;
while(!($basarili = $n->train(1000, 0.02)) && ++$i<=$maks) echo "Eğitim $i: başarısız...<br />";

if ($basarili) {
    $epochs = $n->getEpoch();
    echo "Ağ, $i eğitim + $epochs iterasyon sonucu öğrendi.<hr />";
}

echo "<h2>Son Durum</h2>";
for ($i = 0; $i < count($n->trainInputs); $i ++) {
    echo "<br />$i. test seti: ";
    echo "istenen çıkış = (".implode(", ", $n->trainOutput[$i])."); ";
    echo "ağ çıkışı = (".implode(", ", $n->calculate($n->trainInputs[$i])).")\n";
}

echo "<hr />";
$n->save("ysa.txt");
echo "YSA bu şekliyle kaydedildi";
?>



Bu dosyamızda ağı eğitip ysa.txt adıyla kaydediyoruz. Bunu nasıl yapmışız bakalım:
1.satır: Türkçe karakterler sayfamda bozuk görünmesin
2.satır: class_neuralnetwork.php dosyamı çağır.
3.satır: $n adında, 2 giriş, 3 gizli, 1 çıkış nöronu bulunan bir ağ oluştur.
4,5,6,7.satır: Eğitim verilerin ve bunlara karşılık vermen gereken yanıtlar bunlar. (Eğer iki nöronundan da 1 veya iki nöronundan da 0 gelirse 1 döndürmelisin. Eğer iki nöronundan da farklı değer geliyorsa 0 döndürmelisin. -> XNOR kapısını öğretiyorum)
8.satır: Maksimum eğitim tekrarı sayım. 10 defa eğitilip de öğrenemezsen daha fazla uğraşma.
9.satır: Her eğitim için 1000 iterasyonla öğrenmeye çalış. Eğer 0.02'lik bir hata payıyla öğrenme gerçekleşirse daha fazla öğrenmeye çalışmayacak şekilde eğitime başla. Başarısız olan her eğitimi de ekrana bas ki görelim...
10.satır: Eğitim başarılı olmuşsa, son eğitiminde kaç iterasyon kullandığını al ve ekrana bas.
11.satır: "Son Durum" başlığı altına
12.satır: Eğitim seti sayısında (4,5,6,7.satırlarda 4 adet eğitim setimiz vardı) $i sayaçlı bir döngü aç
13.satır:     [$i]. eğitim seti:
14.satır:     istenen çıkış = ([$i.eğitim setinde istenen çıkışları aralarına virgül koyarak yaz]);
15.satır:     ağ çıkışı = ([$i.eğitim verilerini ağa işletim çıkışları al ve yine virgülle ayırarak yaz] ;
16.satır: <hr /> ile ekrana bir çizgi çek.
17.satır: $n ağını bu son haliyle ysa.txt adında kaydet.
18.satır: "YSA bu şekliyle kaydedildi" diye ekrana yaz (ki buraya kadar sorunsuz geldiysek bu yazıyı görebilelim ve mutlu olalım)

Yapacağınız olayı kısaca açıklayayım.
- İlk olarak egitim.php sayfasının kodlarını açarak, ihtiyacınıza göre bir ağ oluşturup bu ağı eğitiyorsunuz. Eğer istediğinizi öğrenebilmiş bir ağınız varsa bu ağ artık ysa.txt adında bir dosyada tutuluyor.
- Sonra ysa_cevap.php sayfasının kodlarını açarak, eğitimde oluşturduğunuz ağla aynı sayıda giriş, gizli ve çıkış nöron sayısına sahip bir ağ oluşturuyorsunuz.
- Nihayetinde index.php sayfasına girip metin kutusundan ağa 1'ler ve 0'lar gönderiyorsunuz.

Benim yaptığım kodlama tabii ki oldukça basit. Mesela bu ağ -1 ve 1 aralığında tüm değerleri alabiliyorken ben ağa bu metin kutusuyla sadece 1 ve 0 gönderiyorum. Siz elbette site kodlarını kendinize göre düzenleyip ağa küsüratlı ve/veya negatif bir değer de gönderebilirsiniz. AJAX'ı ortadan kaldırabilir veya geliştirebilirsiniz. Ağın eğitimi için kodlarla uğraşmak yerine bir arayüz tasarlayabilirsiniz... Gerisi size kalmış. Artık bu class_neuralnetwork.php'deki class'ı nasıl kullanacağınızı biliyorsunuz.

Yeni bir ağ oluşturabiliyorsunuz:
$n = new NeuralNetwork( [giriş nöron sayısı], [gizli nöron sayısı], [çıkış nöron sayısı]);

Ağa istediğiniz kadar eğitim verisi verebiliyorsunuz:
$n->addTestData( [giriş nöronlarına gönderilecek dizi], [çıkış nöronlarından istenen dizi]);
$n->addTestData( [giriş nöronlarına gönderilecek dizi], [çıkış nöronlarından istenen dizi]);
$n->addTestData( [giriş nöronlarına gönderilecek dizi], [çıkış nöronlarından istenen dizi]);
... ağa hangi veriler girince hangi çıkışların verilmesi gerekir, bu şekilde söyleyebiliyorsunuz.

Bir hata payı belirleyip, istediğiniz iterasyon sayısıyla ağı eğitimeye başlayabiliyorsunuz:
$n->train([iterasyon sayısı], [kabul edilebilir hata payı]);

Lazım olursa, eğitim için ağa gönderilen eğitim dizisini bulabiliyorsunuz:
$n->trainInputs[2]; // ağa verilen 2.eğitim setinde, giriş nöronlarına verilen dizi

Lazım olursa, eğitimde ağdan istediğiniz çıktı dizisini bulabiliyorsunuz:
$n->trainOutput[2]; // ağa verilen 2.eğitim setinde, çıkış nöronlarından istenilen dizi

Eğitimden sonra herhangi bir giriş vererek, öğrendiklerine göre işlem yapmasını isteyebiliyorsunuz:
$n->calculate( [çıkış almak için ağın giriş nöronlarına gönderilecek veri dizisi] );

Ağı bir txt dosyasına (ini dosyası falan da yapabilirsiniz) kaydedebiliyorsunuz:
$n->save("siniragi.txt"); veya $n->save("siniragi.ini");

Kaydettiğiniz bir ağı alıp, elinizdeki sinir ağınının değerlerini o kayıtlı ağ ile değiştirebiliyorsunuz:
$n = new NeuralNetwork( [giriş nöron sayısı], [gizli nöron sayısı], [çıkış nöron sayısı]);
$n->load("siniragi.txt"); veya $n->load("siniragi.ini");

Aslında tüm bunları sadece class_neuralnetwork.php dosyasında, class'ı hazırlayan kişinin yorum satırlarında sunduğu örneği inceleyerek kendiniz de çıkarabilirdiniz ama ben yine de Türkçe bir açıklaması bulunsun istediğim için bu makaleyi yazdım. Umuyorum ki siz de buradan hareketle işi daha ileriye taşıdıktan sonra kendi makalelerinizi oluşturursunuz ve bu konudaki Türkçe kaynaklar çoğalmış olur.

Ama lütfen bu yazdıklarımı aynen alıp başka sitelere (mesela forumlara) aynen kopyalamayın. Yani bunun üzerine kendinizce bi'şeyler katmadığınız sürece internete tekrar takrar koymayın. İlle de bu makaleyi örnek göstermek istiyorsanız bu sayfanın linkini verin, isteyenler sizin gibi buraya gelip okusunlar. Aksi halde bu paylaşımların bilgi kirliliğinden başka kimseye bir getirisi olmuyor. Benim size burada "Yapay Sinir Ağları nedir? Çalışma mantığı nedir?" diye açıklama yapmamamın da nedeni bu. Çünkü internette zaten bu konuyla ilgili sayısız kaynak bulmak mümkün. 

Ama tabii ki dediğim gibi, üzerine bi'şeyler katmak, yani geliştirmek şartıyla bu makaleyi istediğiniz gibi kullanabilirsiniz.

İyi günler dilerim... :)



< Önceki Makale (PHP'de PDO ile MySQL işlemleri için class)


Site Haritası

CodeIgniter Yayınları 1. Merhaba Dünya : CodeIgniter'da Merhaba Dünya yazısını görün... 2. Template Sistemi : CodeIgniter ile sta...