Şub 202017
 
6.545 views

TensorFlow örneği ve küçük bir düzeltme

Bir önceki yazımda TensorFlow örneklerinin yer aldığı bir linkten bahsetmiş ve bazı kodlarda küçük düzeltmeler yapılması gerekebileceğinden bahsetmiştim.

Bu durum, hem yazılım dillerinde, hem de kütüphanelerde çok sık geliştirmelerle karşılaşmamızdan kaynaklanıyor.

TensorFlow örneği ve küçük bir düzeltme

Alıntı: tensorflow.org

Aşağıda, sözünü ettiğim kodlardan birini vereceğim. Yaklaşık 90 satırlık bu python kodunda sadece bir metodun adını değiştirmek gerekiyor. Benim yaşadığım sorunu, benimle benzer ortamlarda çalışan pek çok kişi aynen yaşayacaktır. Bu tür sorunları gidermek, en azından azaltmak için kod yazarlarının paylaştıkları açık kaynaklı kodları hangi koşullarda çalıştırdıklarını not etmelerinde yarar var. Bunun çok kolay olmadığını bir kod yazarı olarak ben de biliyorum. Bu nedenle, test ettiğim aşağıdaki kodu hangi ortamda çalıştırdığımı ve nasıl düzelttiğimi sizlerle de paylaşmak istiyorum.

Orijinal kodun yazarı ve nerede paylaşıldığını kodların başlangıç bölümünde bulabilirsiniz.

Test bilgisayarı: 8GB ram, 4 çekirdek, Intel i5
Test sistemi: Ubuntu 16.04
Python sürümü: 3.5.2
TensorFlow sürümü: 1.0.0
numpy sürümü: 1.12.0
matplotlib sürümü: 1.5.3

Kendi sisteminizdeki kütüphane sürümlerini öğrenmek için aşağıdaki kodu kullanın:

Kodlarda düzeltme gereği sadece tek bir satırda (satır no 39) var.

Sorunlu satır no: 39

Düzeltilmiş satır:

Açıklama:

Diğer kodlarla ilgili takıldığınız yerler olursa, yorum alanından sorularınızı bana yöneltebilirsiniz. 15 ayrı örneği yukarıda belirttiğim koşullarda denedim. 12 örneği sorunsuz çalıştırdım. 3 tanesindeki sorunlar hala devam ediyor. Testleri sürdürüyorum.

Ahmet Aksoy

Kaynaklar:

Kas 012016
 
6.627 views

OpenCV ve Python ile Grafik İşlem Örnekleri

OpenCV kütüphanesi, canlı grafik işlemler için gereken fonksiyonları kullanıma açıyor.

Ana siteden OpenCV2 veya OpenCV3 paketlerini yükleyebilirsiniz.

https://github.com/opencv/opencv adresinde ana sitenin bir çatalı yer alıyor. Tüm kodları ve örnekleri buradan da indirebilirsiniz.

OpenCV kütüphane fonksiyonları CUDA kullanabiliyor. Hemen hemen bütün sistemlerle uyumlu bu kütüphane, “samples” dizinlerine yerleştirilen örneklerle daha kolay anlaşılabilir hale getirilmiş.

“Coherence.py” python kodunu kullanarak elde ettiğim örneklerden biri şöyle:
coherence_01_01-11-2016

gabor_threads.py kodunu çalıştırarak elde ettiğim örneklerden birisi şu:
gabor_threads

Python dizinindeki örnekleri “python3 demo.py” komutuyla açılan menü sisteminden kolaylıkla aktive etmeniz mümkün.

facedetect.py programcığı, canlı bir şekilde insan yüzünü yakalama konusunda öğretici bir örnek.

Nesne tanıma konularıyla ilgileniyorsanız, bu kütüphaneyi mutlaka portföyünüze ekleyin.

Ahmet Aksoy

Referanslar:

Eki 012016
 
5.487 views

Gensim Vektörel Doküman Eğitimi

Tıpkı word2vec yöntemi gibi, gensim paketinin doc2vec metodunu da kullanabilirsiniz. Buradaki amaç sözcükler yerine dokümanlar arasındaki ilişkileri vektörel olarak belirleyip, gruplamaktır.

gensim word2vec

Resim: https://codesachin.wordpress.com


Bu alandaki çalışmalar word2vec’e kıyasla çok daha kısıtlı. Öyle sanıyorum ki, sonuçların word2vec kadar kolay anlaşılır ve çarpıcı olmaması, bu durumun belirleyici unsurlarından biri.

Dün bir doc2vec çalışması yaptım. Veri olarak “gundem-nz.txt” dosyasını kullandım. Bu dosyayı https://drive.google.com/drive/folders/0B_iRLUok9_qqOFozeHNFMjRHTVk adresinden indirebilirsiniz.

Dosyanın düzenlenmesi, vektörel olarak eğitilmesi ve belli bir örnek doküman için en yakın örneklerin bulunması işlemleri toplam 8 saat sürdü. Bilgisayarımın sadece 4GB bellek ve 4 işlemciyle ulaşabildiği maksimum hız bu. Bu çalışmada asıl kısıtlayıcı unsur CPU’dan çok, bellek oldu. Süreyi asıl uzatan swap işlemleriydi. Yine de “akşam çalıştır, sabah sonucunu al!” taktiği için uygun bir süre bu.

gundem-nz.txt dosyası 323.6MB boyutunda. Eğitilmiş dosyaların toplam boyutu ise 1.4 GB.

Aldığım sonuçlar aşağıda.

Burada “doküman” sözcüğü yerine “cümle” sözcüğünü kullanmak aslında çok daha doğru olacak. Çünkü veri dosyamızın her satırında ayrı bir cümle var. Eğer bu yapıyı her satırda bir cümle yerine bir paragraf veya bir doküman olarak düzenlersek alacağımız yanıtlar paragraflara ve dokümanlara göre düzenlenmiş olacaktır.

Bu kavramlar sentence2vec, paragraph2vec ve doc2vec olarak sunuluyor. Ama hepsinin işleyişi aynı.

Önceki yazılarımda da belirttiğim gibi dosyamızdaki sözcükleri olduğu gibi kullanmak yerine “kök”lerini kullandığımızda daha başarılı sonuçlar almayı bekleyebiliriz. Çünkü bu durumda sözcüklerin sayısı azalarak daha kolay öbeklenebilir hale gelecektir.

Yukarıdaki örnekte benim dikkatimi ilk çeken ayrıntı, aynı cümlenin kendi kendine yakınlığının sadece 0.6513625979423523 çıkmasıydı. Oysa bu, en azından, 1’e daha yakın olmalıydı diye düşünüyorum.

İlk 4 cümlede “adem” sözcüğü ortak payda gibi görünüyor. Sonrakilerde kolay görülebilen bir payda yok.

Vektör boyutunu ve veri büyüklüğünü arttırmak, daha kolay anlaşılır sonuçlar elde etmemizi sağlayacaktır. Eğer elinizdeki olanaklar uygunsa, siz de bu tür denemeler yapabilirsiniz. (Ben vektör boyunu 100 olarak aldım.)

Doc2vec yöntemiyle ilgili bilgi ve örnekler oldukça kısıtlı.
Eğer bu tür bilgilere erişebilirseniz, lütfen, linklerini benimle paylaşmanızı rica ediyorum.

Yeni çalışmalarımı yine buradan duyuracağım.
Beni izleyin!

Ahmet Aksoy

Linkler:

http://gurmezin.com/gensim-vektorel-dokuman-egitimi/

Eyl 262016
 
3.754 views

Modelinizi Nasıl Eğitirsiniz?

(Aşağıdaki yazıyı veri madenciliği, derin öğrenme, word2vec, gensim gibi kavramlar hakkında en azından ön bilgilere sahip olduğunuzu varsayarak yazdım. Aksi halde bu yazı size hiç bir şey ifade etmeyebilir. Uyarmadı demeyin! 🙂 )

Modelinizi nasıl eğitirsiniz?

From: filmgoo.com

Hürriyet Gazetesinin izniyle herkesin kullanımına açık ve sözcüklerin vektörel modellemesi amacıyla kullanılabilecek 6 ayrı yeni kaynak oluşturdum. Kaynaklar kategorilere ayrılmış durumda. Aslında bunlar “henüz” oldukça küçük boyutlu kaynaklar. Hepsinin toplamı 1 Gigabyte boyutuna bile erişemiyor. O yüzden kaynak çalışmalarımızı büyütmeye ve çeşitlendirmeye devam edeceğim.

Kaynaklarımız henüz küçük olabilir ama, işlevleri büyük. Bu amaçla hazırlanmış ve herkesin kullanımına açık -bildiğim kadarıyla- pek Türkçe kaynak yok. İşte biz de bu yüzden bu açığı kapatmaya çalışıyoruz.

Kaynak dosyalarımızı tek başlarına veya birbirleriyle birleştirerek kullanmak mümkün. Eğer bilgisayarınızın kapasitesi yeterliyse, bu beş dosyayı birbiriyle birleştirip tek başına kullanmanızı öneriyorum. Böylece hem daha geniş kapsamlı, hem de daha tutarlı ilişkiler oluşturabilirsiniz.

Dosyalar, Gensim paketiyle uyumlu bir şekilde düzenlendi.
1- Haberler cümlelerine ayrıldı ve her satıra bir cümle kondu
2- Tüm harfler küçük harfe dönüştürüldü
3- İnceltme işaretleri kaldırıldı
4- Sayılar yok edildi
5- Tüm noktalama işaretleri kaldırıldı
6- Dolgu sözcükleri (stopwords) devredışı bırakıldı

Aslına bakarsanız sözcüklerin kök haline dönüştürülmesi bu verileri daha da verimli bir hale getirebilirdi. Ancak henüz tüm sözcükleri kök ve eklerine ayırabilen bir çözümümüz yok. (Türkçe sözcükleri kök ve eklerine ayırma çalışmamızın ön hazırlıkları halen devam ediyor. Tamamlandığında, veri dosyalarımızdaki sözcükleri de köklerine dönüştürebileceğiz.)

Dosyaları eğitmek oldukça kolay. Örneğin gundem-nz.txt dosyasını eğitelim:

Eğitilmiş dosyamızı daha sonra yeniden yükleyip kullanabiliriz. Hatta bu dosyayı tekrar eğitmek te mümkün. Ancak tekrar eğitim sırasında eğitilmiş sisteme yeni sözcükler eklememiz mümkün olmuyor. Bu nedenle ilk eğitim verisinin olabildiğince geniş kapsamlı olmasında yarar var.

Eğitilmiş dosyayı yeniden yükleyip test edelim:

Bunlar da elde ettiğimiz sonuçlar:

Yukarıdaki yükleme ve eğitme işlemlerini jupyter-ipyton ile de yinelemeyi düşünüyorum. Eğer imkan bulabilirsem, aynı bilgileri www.kaggle.com/datasets/ alanında da paylaşacağım.

Arkası gelecek…

Ahmet Aksoy

Not: Word2Vec eğitimlerinde kullanabileceğiniz data dosyalarını aşağıdaki GoogleDrive adresinden indirebilirsiniz.
Dosya isimleri şunlar:
1- arsiv-nz.txt
2- dunya-nz.txt
3- ekonomi-nz.txt
4- futbol-nz.txt
5- gundem-nz.txt
6- spor-nz.txt

https://drive.google.com/drive/folders/0B_iRLUok9_qqOFozeHNFMjRHTVk

Ağu 262016
 
4.279 views

Eğitilmiş word2vec datasını nasıl kullanırız?

Eğitilmiş word2vec datasını nasıl kullanırız?

Elbette bu tür çalışmalarımızı Python ile yapıyoruz. Üstelik interaktif denemeler yapıyorsak, iPython kullanmamız daha doğru. iPython son dönemde jupyter ile entegre çalışıyor.

Bu yüzden önce kullanmakta olduğunuz Python sürümünü aktif hale getirin. Ben Python 3.5.1 kullanıyorum ve bunun için tanımladığım evp35 isimli bir sanal ortamım var.

Sanal ortamımı devreye sokuyorum:

Artık “python” komutum doğrudan python 3.5.1 sürümünü devreye sokuyor. Gerekli modülleri de bu sanal ortam üzerinden yükledim.

Aynı şey jupyter için de geçerli. Yüklemek için vereceğiniz komut şöyle:

Çalışmamızda word2vec modülünü kullanacağız. Onu da yükleyelim:

Artık iPython’u jupyter üzerinden devreye sokabiliriz. Bunun için:

komutunu kullanın ve “New” kutucuğundan “python 3” seçin.

Aşağıdaki kodları kullanabilmeniz için eğitilmiş veri kümemizi de indirmeniz gerekiyor.

https://drive.google.com/drive/folders/0B_iRLUok9_qqOFozeHNFMjRHTVk adresinden hnz_2010.bin isimli dosyayı indirin. Eğitilmiş vektörlerimiz bu dosyaya kayıtlıdır.

Hazırlıklarınız tamamsa, aşağıdaki işlemleri siz de kendi bilgisayarınızda uygulayabilir, yeni denemeler yapabilirsiniz.

Deneyimlerinizi benimle paylaşmayı da lütfen unutmayın!

Ahmet Aksoy
Açık Kaynak DerlemTR Proje Yöneticisi

[gist https://gist.github.com/ahmetax/58200ef5014176438aea2ad78624686a]

Takıldığınız yerler olursa, Yorum bölümünden bana ulaşabilirsiniz.

Ağu 262016
 
5.092 views

Hürriyet Gazetesi Datasıyla Derin Öğrenme Çalışmaları

Açık Kaynaklı DerlemTR Projesi‘nin yeni aşamasında, Hürriyet Gazetesi yetkilileri “derin öğrenme” (deep learning) konulu çalışmalarımızda gazete arşivlerinden yararlanma isteğimizi yine olumlu karşıladı. Başta Sayın Ersay Dizman olmak üzere, gazete yetkililerine tekrar teşekkür ediyorum.

Hürriyet Gazetesi Datasıyla Derin Öğrenme Çalışmaları

Bu aşamada yine python dilini kullandım ve 2010 yılı Hürriyet Gazetesi arşivlerini taratarak “uygun” haberleri bir araya topladım. Haberlerin tarihi, başlığı, muhabiri veya yazarı belli değil. Çünkü bu bilgilere ihtiyacımız yok.

Yapacağımız çalışmalar “word2vec” yöntemine odaklanmış durumda. Bu yöntem, sözcüklerin komşuluk ilişkilerini vektörel olarak değerlendirerek “müdahalesiz” bir eğitim mekanizması oluşturuyor ve buna bağlı sonuçlar üretiyor. Daha önce yazdığım “Word2vec yöntemiyle Türkçe sözcüklerin ilişkilendirilmesi” isimli yazıma bir göz atmak isteyebilirsiniz.

Bu tür çalışmaların en zor tarafı yeterli büyüklükte, düzgün ve güvenilir veri kümelerine (dataset) sahip olmanın zorluğu. Hele Türkçe için alan neredeyse tamamiyle boş. Sağlıklı bir eğitim sağlayabilmek küçük veri kümeleriyle mümkün olmuyor.

Bu yüzden DerlemTR projesi bünyesinde yapacağımız çalışmalarda kullanacağımız veri kümelerini aynı zamanda bu konularda çalışmak isteyen diğer araştırmacılara da karşılıksız olarak açıyoruz. Böylece dilimize yönelik araştırma ve değerlendirmelere bir katkımız olacağına inanıyorum.

Yeni çalışmamızın ilk veri kümesi Hürriyet gazetesinin 2010 yılı arşivindeki haberlerden türetildi. Diğer yıllarla ilgili çalışmalarımız devam ediyor.

Çalışmamızda sözcükleri cümle, paragraf, haber gibi gruplaşmalardan bağımsızlaştırdık. Noktalama işaretlerini, durak sözcüklerini ve sayıları kaldırdık. Sonuçta sadece bir ardışık sözcükler listesi elde ettik.

Sözcükleri düzenlerken inceltme/uzatma işaretlerini temizledik. Çok sık kullanılan, ama kullanılmadığında cümlenin anlamını pek fazla değiştirmeyen durak sözcüklerini (stop-words) listeden sildik. Bütün sözcükleri küçük harfe çevirdik ve sadece geçerli sözcükleri bıraktık. Böylece elimizde birbirinden birer boşluk işaretiyle ayrılan, peşpeşe dizilmiş sözcükler kaldı. Bu yapı CBOW (continuous bag of words), yani “sürekli sözcük torbası” olarak adlandırılıyor. Dosya aslında bir metin dosyası. Ama bu dosyayı bir metin editörüyle incelemek pratik olarak mümkün değil. Çünkü noktalama işaretleri yok. Bu yüzden milyonlarca sözcükten oluşan tek bir cümleden oluşuyormuş gibi davranacaktır.

Word2vec sistemini kullanarak sonuç almak için önce bu sistemi eğitmek gerekiyor:
1- Ardışık olarak kullanılan sözcük çiftlerini belirle ve “_” işaretiyle bağla
2- Sözcük listesindeki kümeleşmeleri sapta (clustering)
3- Sözcük listesini eğit
4- Eğitilmiş dosya bilgilerini kullanarak ilişki raporları üret

Bu amaçla, ben de https://github.com/danielfrg/word2vec adresinde ayrıntılı bir şekilde açıklanan işlemleri kullandım. Seçtiğim vektör boyutu: 100.

Eğitim dosyası (hurriyet_2010.txt) ve eğitilmiş veri dosyasına (hurriyet_2010.bin) https://drive.google.com/drive/folders/0B_iRLUok9_qqOFozeHNFMjRHTVk adresinden ulaşabilirsiniz.

“turkce-stopwords.txt” isimli dosya da aynı adreste yer alıyor. (İlk çalışmalarımızdan elde ettiğimiz derlem dosyası da gensozluk.txt adıyla aynı yerde.)

Word2vec veya benzeri yöntemlerle ilgili çalışmaların pek çoğu hala araştırma düzeyinde. O yüzden etkin bir sonuca ulaşmak için farklı parametreler kullanmak gerekebiliyor. Örneğin ardışık kelimeleri sadece 2 ile sınırlı tutmak yerine bu sayıyı arttırabilirsiniz.

Ya da vektör boyutunu 100 yerine 300 veya 500 yapabilirsiniz. Ancak veri kümesi ve vektör boyutları büyüdükçe daha fazla bellek ve işlemci gücüne gerek duyuluyor. Kendi çalışmalarımda 4 çekirdekli ve 4GB belleğe sahip bir bilgisayar kullanıyorum. Bu özellikler Yapay Zeka veya Derin Öğrenme türü çalışmalarda oldukça zayıf. O yüzden ben vektör boyutunu 100 ile sınırladım. Siz bu sayıyı makinenizin gücüne bağlı olarak istediğiniz kadar yukarı çekebilirsiniz.

Yazımı sonlandırmadan önce, önceki yazımda da kullandığım bazı sözcüklerle ilişkisi saptanan sözcük listelerini paylaşayım: (benzeşen sözcükler yüklenen modelin sözcük vektörlerinin kosinüsü alınarak bulunuyor. Benzer -birbiriyle yakından ilişkili- sözcükler benzer şekilde kümeleniyor.)

insan: [‘insanın’ ‘insana’ ‘insanı’ ‘insanların’ ‘insanlar’ ‘insanlardan’
‘insanlara’ ‘insanımız’ ‘bitmek_tükenmek’ ‘insanoğlunun’]

macera: [‘masal’ ‘eğlenceli’ ‘büyülü’ ‘geceler’ ‘nostalji’ ‘romantizm’ ‘hikayeler’
‘dövüş’ ‘romantik’ ‘sahneleri’]

öfke: [‘korku’ ‘huzursuzluk’ ‘kızgınlık’ ‘derinden’ ‘umutsuzluk’ ‘öfkeyi’
‘öfkesini’ ‘üzüntü’ ‘endişeyi’ ‘tavırları’]

karanlık: [‘kirli’ ‘derin’ ‘izlerini’ ‘hüzünlü’ ‘görünmeyen’ ‘vahşi’ ‘dramatik’
‘geçmişin’ ‘bakılırsa’ ‘gürültülü’]

öykü: [‘şiir’ ‘tiyatro_oyunu’ ‘müziklerini’ ‘eserlerini’ ‘piyano’ ‘şiirler’
‘türküler’ ‘ali_poyrazoğlu’ ‘drama’ ‘bale’]

cumhuriyet: [‘mustafa_kemal’ ‘cumhuriyetin’ ‘atatürk’ ‘dersim’ ‘cumhuriyetimizin’
‘kemal_atatürk’ ‘gazi_mustafa’ ‘istiklal’ ‘ismet_inönü’ ‘ulu_önder’]

savaş: [‘savaşı’ ‘savaşın’ ‘savaşta’ ‘sovyet’ ‘savaşa’ ‘soğuk_savaş’ ‘çatışma’
‘çatışmalar’ ‘saddam’ ‘savaştan’]

ayşe: [‘hülya’ ‘aysel’ ’emine’ ‘derya’ ‘gamze’ ‘zehra’ ‘hatice’ ‘esra’ ‘fatma’
‘elif’]

recep: [‘kadir’ ‘necati’ ‘erdal’ ‘muharrem’ ‘ismail’ ‘arif’ ‘sedat’ ‘orhan’
‘ibrahim’ ‘suat’]

Ham veri miktarı arttıkça daha sağlıklı ilişkiler yakalamak mümkün oluyor.

Veri dosyasının eğitilmesi sürecini bir başka yazımda örnekleyeceğim.

Konuya bir programcı olarak ilgi duyuyorsanız https://github.com/danielfrg/word2vec adresini ayrıntılı bir şekilde incelemeyi sakın ihmal etmeyin.

Ahmet Aksoy