Oca 172018
 
2.034 kez okundu

Tensorflow ile Acemi Şiirler

Bu yazımda internet üzerinden rasgele derlenmiş şiirler kullanarak eğittiğim sistemden aldığım -şiirimsi- çıktıları paylaşacağım.

şiirimsi tensorflow

Henüz abartılı bir sonuç beklemeyin. Nasıl ki bir bebeğin konuşmayı öğrenmesi için belli bir zamana ihtiyacı varsa, makine öğrenmesi sistemlerinin de öğrenmek için zamana ve çabaya ihtiyacı var.

Bu çalışmada Kullandığım veri seti internet üzerinden rasgele toplanmış yaklaşık 70 bin dize içeriyor. Bu veri özel bir denetimden geçmedi. Şair veya biçem konusunda herhangi bir ayrım uygulanmadı. Tek kaygı, dişe dokunur sonuçlar elde edebilmek için veri boyutunun en az 1 milyon karakter olması gereğiydi. (Bu bir kural olmasa da, bir çok uzmanın önerisi bu yönde.) Kullandığım veri setinin boyutu yaklaşık 2MB.

Program, Tensorflow kütüphanesiyle karakter düzeyli RNN (Recurrent Neural Network) eğitimi yapıyor.

Raspberry Pi 3 üzerinde Tensorflow kurulumunu “Raspberry Pi ile Tensorflow 2” başlıklı yazımda ele almıştım. Tensorflow 1.1.0, Python 3.4 üzerinde sorunsuz bir şekilde çalışıyor. (Halen en son Tensorflow sürüm numarası 1.5)

Eğitim çalışmasında Sherjil Ozair’in github deposundaki kodlarını kullandım: https://github.com/sherjilozair/char-rnn-tensorflow

Eğitim için Python 2 veya Python 3 kullanmak mümkün. Ancak Tensorflow sürümü en az 1.0 olmalıdır.

EĞİTİM İŞLEMLERİ

Eğitim işlemi

komutuyla yapılıyor. Eğer herhangi bir parametre vermezseniz, otomatik olarak “Tiny Shakespeare” verisi kullanılıyor. İsterseniz, internet üzerinden başka veri setleri de bulup indirebilirsiniz.

Sanal ortam üzerindeki kendi eğitim çalışmamda şu kodları kullandım:

Tensorflow

Her batch işlemi yaklaşık .25 saniye tutuyor. Toplam 40050 batch olduğuna göre yaklaşık 10 bin saniyelik bir eğitim süresi olacak. Yani 3 saate yakın bir süre.

Bilgisayarım 4 çekirdekli bir i5. Ancak tam yükte aşırı ısındığından, çökmemesi için işlemcileri 2.53GHz yerine 2.40GHz hızla çalıştırabiliyorum. Aynı işlemler Raspberry Pi 3 üzerinde 8 kat daha fazla bir zamana ihtiyaç duyuyor. Bu yüzden tek bir Raspberry Pi ile bu tür bir eğitim yapmak pek de verimli değil.

Ancak, bir başka bilgisayarda eğitilmiş veri setini Raspi’ye aktarıp, kullanabilirsiniz. Ben de bu yöntemi tercih ediyorum.

SONUÇLAR

Eğitilmiş bir veri setini kullanarak sonuç elde etmek için verilecek komut şu:

Yukarıdaki komuttan da anlaşılacağı gibi, eğitilmiş veri “save/siirler” klasöründe bulunuyor.

Dizüstü bilgisayarımda eğittiğim veriyi Raspberry Pi 3 üzerine “rsync” komutu ile çektim ve raporladım:

Raspberry Pi 3 üzerinde rapor alma işlemi bile yaklaşık 30 saniye sürüyor.

Bir örnek daha:

Çok daha büyük bir veri seti ve -tercihen- GPU kullanabilen bir bilgisayarda eğitilmiş veri setleriyle çok daha anlamlı sonuçlar elde etmek mümkün olabilir.

Eğer güçlü bir bilgisayara sahipseniz veya sabırlı biriyseniz siz de kendi veri kümelerinizi eğitebilirsiniz.

Ahmet Aksoy

Referanslar:

Oca 162018
 
538 kez okundu

Raspberry Pi Maceralarım No-09

Raspberry Pi 3 GPIO ile Bir Ledin Parlaklığını ve Frekansını Kontrol etmek

Önceki yazımda “İki Yönde Yürüyen ışık” örneğini vermiştim. Bu kez bir LED’in parlaklığını ve yanıp sönme frekansını denetleyeceğiz.

Yazının sonunda linkini verdiğim videda konu ile ilgili ayrıntılar mevcut. O yüzden burada sadece kodları ve devre şemasını vermekle yetineceğim.

Raspberry Pi Maceralarım No-09

Kodlar hem Python 2, hem de Python 3 ile uyumludur.
Parlaklık ve frekansı GPIO’nun 12 nolu iğnesinin PWM (Pulse Wave Modulation) özelliğini kullanarak kontrol ediyoruz.

Program kodlarını, devre montajını ve örneğin çalışmasını gösteren videomuz aşağıda.

GPIO ile ilgili örneklerimi burada sonlandırıyorum.

Bir sonraki yazımda yeni bir Tensorflow örneğini ele alacağım.

Beni izlemeye devam edin.

Ahmet Aksoy

Raspberry Pi Maceralarım No-09

Ara 162017
 
Raspberry Pi ve Makine Öğrenmesi
790 kez okundu

Raspberry Pi ve Makine Öğrenmesi

Yeni bir startup olan Jetpac, görsel tanıma yazılımı Deepbelief’i farklı sistem ve cihazlar üzerinde kolayca kurulup kullanılabilir hale getirdi. Bu girişim, Raspberry Pi ve Makine Öğrenmesi açısından da önemli bir kazanım olacak gibi görünüyor.

DeepBelief sistemini Linux, iOS, OSX, Android, Raspberry Pi ve Javascript üzerinde kullanmak mümkün.

Bu yazımda DeepBelief’in Raspberry Pi üzerinde kurulumunu ve çalıştırılmasını ele alacağım.

Aynı konu http://www.instructables.com/id/Machine-learning-with-Raspberry-Pi/ adresinde işlenmiş. Ancak orada verilen direktifler benim kullandığım Raspberry Pi B+ v1.2 üzerinde biraz sorun yarattı. Ama bu sorunun çözümü de var.

Şimdi en başından başlayarak aşamalar halinde işlemlerimize geçelim:

1. Önce Raspi’ye bağlanalım: (Ben Ubuntu 16.04 üzerinde ssh komutuyla bağlanıyorum. Siz de kendi sisteminizin gerektirdiği şekilde veya cihazınıza klavye, fare ve ekran bağlayarak çalışabilirsiniz.)

Uzaktan bağlanabilmek için Raspinin IP numarasını bilmeniz gerekir. Bu amaçla

komutunu kullanabilirsiniz. sudo kullanırsanız, root yetkisiyle daha ayrıntılı bir rapor alırsınız.

2. GPU kullanımı için bellek tanımlama:

Dosyanın sonuna aşağıdaki satırı ekleyelim:

3. Bellekte yaptığımız değişikliğin sistem tarafından algılanması için cihazımızı yeniden başlatalım:

4. Raspinin kendini yeniden başlatması birkaç dakika sürebilir. Yeteri kadar bekledikten sonra yeniden bağlanalım.

5. Dosyalarımızı github üzerinden indireceğimiz için git uygulamasını kurmamız gerekiyor.

6. Artık DeepBeliefSDK dosyalarını indirip kurulumunu yapabiliriz.

7. Kurulumu yaptık. Sonucu denetlemek için örnek uygulamayı çalıştıralım:

Eğer herşey yolunda gittiyse 998 satırlık bir rapor elde edeceksiniz.

Ya da benim gibi “Can’t open device file: /var/lib/jpcnn/char_dev” mesajını alacaksınız. Bu hata mesajından kurtulmak için aşağıdaki komutları verin:

Artık uygulamamızı yeniden çalıştırabiliriz:

Elde edeceğimiz rapor resimdekine benzeyecektir.

Raspberry Pi ve Makine Öğrenmesi

deepbelief uygulaması, herhangi bir parametre verilmeden çalıştırıldığı zaman “lena.png” dosyasını varsayılan olarak yükler ve öntanımlı imagenet nesneleriyle karşılaştırarak benzerlik oranlarını bulur.

Raporda sıra no, benzerlik olasılığı ve nesne etiketi sıralanır.
En büyük olasılığa sahip olan görüntülerle eşleşme gerçekleşmiştir diyebiliriz.
Eğer sonuçları olasılık değerine göre sıralarsak, benzerlikleri yorumlamamız daha kolay olur.

İstediğiniz bir başka görseli taratmak isterseniz, adını parametre olarak vermek gerekir. Örneğin “cicek.jpg” dosyasını taratmak istediğimizde vereceğimiz komut şöyledir:

DeepBelief sistemini Ubuntu üzerinde kurmak çok daha kolay oluyor. Siz de kendi sisteminizde deneyin.

Ahmet Aksoy

Referanslar:

Ara 112017
 
382 kez okundu

Bottle Örnek Yapılacaklar Listesi

Önceki yazımda Python Bottle Mikro Ağ-Çerçevesi konusunu kısaca ele almıştım.

Bu yazımda ise https://bottlepy.org sitesindeki örneği, bazı mesajlarını Türkçeleştirerek aktaracağım.

bottle örnek yapılacaklar listesi

İlk çalışmamda edit, save, new gibi terimleri de Türkçeleştirmiştim. Ama sonra Python programcılarının ister istemez teknik İngilizce terimleri bilmeleri gerektiğini düşünerek sadece bazı mesajları Türkçeleştirmekle yetindim.

Orijinal kod listesinde eksik bırakılan help.html dosyasını ekledim ve içine kısaca bottle projesi çalışırken kullanılacak terimlerin işlevini basit bir tablo olarak ilave ettim.

Örijinal kodlarda static_file(‘help.html’, root=’.’) satırında bulunması gereken return anahtar sözcüğü unutulmuştu. Onu da ekledim.

Uygulama, basit “Yapılacaklar Listesi” için gereken işlevlere sahip. Veritabanı olarak SQLite3 kullanıyor.

Düzenlemeleri yaparken Pycharm Community Edition sürümünü kullandım. Python sürümü 3.6.3 ve bottle sürümü 0.12.13.

Pycharm ile “bottle” isimli yeni bir proje klasörü tanımladım.

İlk aşamada veritabanını oluşturmalıyız. Sitede verilen kod satırlarını biraz revize edip veritabani.py dosyasına kaydettim. Bu betik veritabanını oluşturmak amacıyla sadece bir kez çalıştırılacak.

Sistemde ana kod dosyamız dışında help.html isimli bir yardım dosyamız, 3 tane de şablon (template) dosyamız bulunuyor. (SQLite3 veritabanı dosyası todo.db de aynı klasörde.)

Önce html ve şablon dosyaların içeriğini aktarayım:

help.html dosyası

make_table.tpl şablon dosyası

edit_task.tpl şablon dosyası

new_task.tpl şablon dosyası

Son olarak Python kod dosyası todo.py

Dosyalarımızın hepsi bottle proje klasörünün içinde yer alıyor.

Kodların, ek açıklamaya gerek duymayacak kadar açık olduğunu düşünüyorum. Arada bir kaç satırlık açıklama da var zaten.

Yine de sormak istedikleriniz olursa, yorum alanını kullanabilirsiniz.

Ahmet Aksoy

Bottle Örnek Yapılacaklar Listesi


Referanslar:

Ara 102017
 
301 kez okundu

Python Bottle Mikro Ağ-Çerçevesi

bottleBir WSGI (Web Server Gateway Interface) mikro ağ-çerçevesi (micro web-framework) olan bottle, flask gibi benzerlerinden farklı olarak, tüm kod işlemleri için tek bir dosya kullanır. O nedenle web ve ağ-çerçevesi işlemlerine yabancı olanlar için daha kolay anlaşılır ve pratik bir çalışma alanı sunmaktadır.

https://bottlepy.org/docs/dev/ adresinde bu ağ-çerçevesi ile ilgili her türlü açıklamaya ulaşabilirsiniz. Aynı adreste çok güzel, öğretici örnekler yer almaktadır.

Ubuntu Kurulum

Pip ile Kurulum

Kurulumu pip ile yaparken Python 3’ün devrede olmasına dikkat edin.

Sitedeki ilk örneği kendimize uyarlayalım:

Yukarıdaki betiği çalıştırdıktan sonra etkin web gezgin (browser) programınızı açın ve adres kutusuna aşağıdaki ifadeyi yazın:

“Ahmet” yerine kendi adınızı ya da bir başkasınınkini yazabilirsiniz.

Bu örneğin çalışabilmesi için bilgisayarınızda etkin bir yerel ağ sunucusu olmalıdır.

“localhost” yerine gerekiyorsa “127.0.0.1” de kullanabilirsiniz.

@route ifadesinin özel bir işlevi vardır. Dekoratör fonksiyon kavramına yabancıysanız http://python.gurmezin.com/pythonda-fonksiyon-dekoratorleri/ adresindeki yazıma göz atmak isteyebilirsiniz.

Bir sonraki yazımda çok daha kapsamlı ve işlevsel bir örneği sizinle paylaşacağım.

Bottle ile çalışmayı öğrendiğinizde ağ-çerçevesi sistemlerini, dekoratörleri ve jinja2 gibi şablon yapılarını daha yakından tanımış olursunuz. Bu bilgilenme bottle’a göre daha kapsamlı çözümler sunan Flask ve Django gibi tanınmış uygulamalara geçişinizi daha kolay bir hale getirecektir.

Ağ çerçevesi sistemleri yerel ağ üzerinde kullanıldığında, masaüstü uygulamalara benzer çözümler üretebilmenize olanak verir. Üstelik bu tür uygulamaları internet ortamına taşıyarak daha yaygın bir şekilde paylaşılabilmelerini ve kullanılabilmelerini sağlarsınız.

Ahmet Aksoy

Python Bottle Mikro Ağ-Çerçevesi

Referanslar:

Ara 092017
 
402 kez okundu

Pythonda Liste Kısaltmaları

Liste kısaltmaları (list comprehensions), Python diliyle basit, kolay anlaşılır ve hızlı bir şekilde listeler oluşturmamızı sağlar.

Liste Kısaltmaları

Örneğin 0 ile 10 arasındaki ( 0 ve 10 dahil) tam sayıların karelerini hesaplayıp, sonuçları bir liste haline getirelim.

Bu işlemin en basit yöntemi for döngüsü kullanmaktır.

Aynı listeyi list ve map fonksiyonları kullanarak da oluşturabiliriz:

Üçüncü yöntemimiz ise liste kısaltması kullanmaktır:

Her üç yöntemin sonucu da aynıdır:

Şimdi 5 ile 18 arasındaki (5 ve 18 dahil) sayılarla 2’nin üssünü hesaplayalım:

Sonuçlar aynı:

3 ile 28 arasındaki çift sayılar:

Sonuçlar aynı:

2 ile 24 arasındaki tek sayılar için liste kısaltması:

Sonuçlar:

Kısacası yinelenebilir (iterable) bir nesneden bir liste oluşturmak istediğimizde:

Liste kısaltmamıza filtre uygulamak içinse if anahtar sözcüğünü kullanıyoruz:

Bir önceki yazımda liste kısaltmalarının for döngülerinden ve map() fonksiyonundan daha hızlı çalıştığını belirtmiştim.

Şimdi bu kıyaslamayı basit bir örnek üzerinden kendimiz yapalım. Kıyaslama işleminde bir dekoratör fonksiyonu kullanalım.

Sonuç:

Elbette bu sonuçlar betiği çalıştırdığınız bilgisayarın çalışma hızına da bağlıdır ama, aynı işlemin farklı yöntemlerle uygulanmasının farklı süreler aldığını açıkça görebiliyoruz.

Eğer yazdığınız kodlar çalışma hızına duyarlı ise, kesinlikle liste kısaltması kullanmanızı öneriyorum. Eğer böyle bir kaygınız yoksa ve Python konusunda çok fazla deneyiminiz bulunmuyorsa, for yöntemini kullanın. Böylece map veya liste kısaltmasının içeriğini algılamak için çaba sarfetmenize gerek kalmaz.

Şahsen ben, bu konuda Guido van Rossum’a katılıyorum: Eğer çok özel nedenleriniz yoksa lambda, map, filter ve reduce gibi ek araçlara ihtiyacınız olmayacaktır.

Ahmet Aksoy

Referanslar:

Ara 082017
 
1.271 kez okundu

Python Dilinde Lambda, Map, Filter ve Reduce

İşler hep Guido van Rossum’un istediği gibi gitseydi, Python dilinde lambda, map, filter ve reduce kavramları olmayacaktı. Ama bazı gruplardan gelen talepler ağır bastı; sonuç olarak lambda, map ve filter Python çekirdeğinde varlıklarını sürdürmeye devam ederken, sadece reduce functools modülüne kaydırıldı.

Rossum’un bu terimlere karşı çıkmasının gerekçeleri şunlardı:

    • Liste kısaltmaları (list comprehensions) lambda, map, filter ve reduce yerine daha güçlü bir şekilde kullanılabilir.
    • Liste kısaltmaları daha açık ve anlaşılırdır.
    • Python yaklaşımına aykırı bir şekilde, aynı soruna yönelik birden fazla Python çözüm yöntemi olacaktır.

Liste kısaltmaları for döngülerine kıyasla % 35, map fonksiyonuna kıyasla %45 daha hızlı çalışmaktadır. Dolayısıyla kodlama yaparken bu ayrıntıları da bilmekte yarar var.

lambda Fonksiyonu

ile

fonksiyonları aynı işleve sahiptir.
İlkinde anonim bir fonksiyon tanımlayıp, bu fonksiyonu kare değişkenine atıyoruz. Diğerinde ise doğrudan bir fonksiyon tanımlıyoruz.

map Fonksiyonu

map fonksiyonu 2 argüman alır. İlk argüman bir fonksiyon, ikinci argüman ise bir dizilimdir (sequence). map fonksiyonu ilk argüman olarak verilen fonksiyona dizilim elemanlarının her birini argüman olarak atar ve sonuçları bir map nesnesi olarak geri döndürür.

Sonuçlar:

filter Fonksiyonu

Bu fonksiyon da tıpkı map gibi ilk argüman olarak bir fonksiyon, ikinci argüman olarak bir dizilim alır. Ancak geriye sadece, fonksiyona uygulandığında True değer üreten dizilim elemanlarını döndürür.
Aşağıdaki kod satırları 1 ila 20 arasındaki sayılardan 3’e tam olarak bölünenleri geri döndürmektedir.

Sonuçlar:

reduce Fonksiyonu

Bu fonksiyon functools modülünde yer alır ve geriye tek bir sonuç döndürür.
Örneğin 1 ile 100 arasındaki sayıların toplamını bulalım:

Sonuç:

Bir sonraki yazımda liste kısaltmaları (list comprehensions) konusunu ele alacağım.

 

Ahmet Aksoy

Referanslar:

 

Ara 062017
 
469 kez okundu

Pythonda Fonksiyon Dekoratörleri

En kaba tanımıyla dekoratörler, yazılım tasarım kalıplarıdır.

Dekoratörler fonksiyon, metod ve sınıfların işlevselliğinin, dekore edilen fonksiyonun veya alt sınıfların kaynak kodlarında değişiklik yapmaya gerek kalmadan değiştirilebilmesini sağlarlar.

Pythonda Fonksiyon Dekoratörleri

Özetle dekoratörler, yapısını değiştirmek istemediğimiz fonksiyonların davranışlarını; yani işlevlerini değiştirmek amacıyla kullanılır.

Dekoratörler, fonksiyonların hem parametre, hem de dönüş değeri olarak kullanılabilme özelliğine dayanır.

“@” işareti dekoratör tanım operatörü olarak kullanılır. (Aynı işaret matris çarpım operatörü olarak da kullanılmaktadır.)

Şimdi dekoratör uygulamasını örnekleyecek küçük bir örnek geliştirelim.
Eğer Türkçe karakterlerin kullanımı konusunda benim gibi titiz biriyseniz, string.lower() fonksiyonu uygulanmış Türkçe karakterlerden ‘I’ harfinin ‘ı’ yerine ‘i’ olarak geri döndüğünü farketmişsinizdir.

Bu hatayı gidermek için tr_lower_dekorator isimli bir fonksiyon hazırlayalım. Bu dekoratör fonksiyonumuz parametre olarak func isimli bir başka fonksiyon alıyor. Bu fonksiyonun aldığı parametre ise x stringi.

Dekoratör fonksiyonumuzun içinde fonksiyon(x) isimli ara fonksiyonumuz mevcut. Bu fonksiyon, önce, parametre olarak aldığı x stringindeki ‘I’ karakterlerini ‘ı’ harfine dönüştürüyor, sonra da orijinal fonksiyonu çağırarak ‘I’ harfleri düzeltilmiş stringe lower() fonksiyonunu uyguluyor.

Kodlar aşağıda. Sormak istediğiniz bir şey olursa, en aşağıdaki yorum alanını kullanabilirsiniz.

Betiğimizin döndürdüğü bilgiler şöyledir:

İlk satırda orijinal string, ikinci satırda string.lower() fonksiyonu kullanılarak elde edilmiş string, son satırda ise string.lower() fonksiyonuna dekoratör uygulanmış haliyle üretilmiş string yer almaktadır.

turkce_lower02() fonksiyonunu kolayca düzenleyip doğru sonuç üretmesini sağlayabilirdik. Örneğimizin anlaşılabilir olması için böyle basit bir fonksiyon kullandım. Bu fonksiyon yerine çok daha karmaşık bir fonksiyon olsaydı, dekoratörün etkisi daha açık bir şekilde ortaya çıkacaktı.

Dekoratörler bottle, flask ve django gibi ağ çerçevelerinde (web application framework) sıklıkla kullanılmaktadır.

Ahmet Aksoy

Referanslar:

Ara 012017
 
371 kez okundu

Python Zemberek Bağlantısını Güncelleyelim

Python Zemberek Bağlantısı2016 Mayısında yazdığım Python ile Zemberek Kütüphanesini Kullanmak makalesini artık güncellemenin zamanı geldi.

Aslında güncellenecek pek fazla şey yok.
Çünkü: zemberek-tum-2.0.jar kütüphane dosyası yine aynı.
JPype1-py3 bileşeninin sürüm numarası değişmedi: 0.5.5.2.
Sadece benim şimdiki Ubuntu sürümüm 16.04 ve Python sürümüm ise 3.6.3.

Önceki yazımda verdiğim kodlar bire bir geçerli.

Yine de kodları son haliyle anımsamakta yarar var:

Önceki yazımda zemberek-tum-2.0.jar dosyasının içindeki (veya herhangi bir jar dosyasının içindeki) sınıfların listesini nasıl elde ettiğimi belirtmemişim.
Aşağıdaki komut, bu listeyi elde etmemizi sağlıyor:

jar dosyasının adını değiştirerek istediğiniz sınıf listesini dökebilirsiniz.

Bu arada sevindirici bir başka haber: Zemberek projesi yeni bir yapılanmayla tekrar gündemde: Zemberek-NLP
Akın kardeşler Zemberek projesini eskisinden bağımsız bir şekilde yeniden geliştiriyorlar.
Sonucu ben de merakla bekliyorum.

Ahmet Aksoy

Kas 302017
 
246 kez okundu

Python Yazılarım

Daha önce yazmış olduğum Python ile ilgili bazı yazıların linklerini bir araya getirdim.

İçlerinde ilginizi çekenler olabilir:

Ahmet Aksoy