İPUCU

Python Artificial Intelligence’da en çok kullanılan dildir ve gerekli dökümanların paylaşım alanlar burada paylaşılmaktadır.

Seçenekler

Python Machine Learning-Tensorflow 1.2/Ar-Ge Kulübü

Hacknology - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
10/2015
Nereden:
rm -rf /
Mesajlar:
2.710
Konular:
151
Teşekkür (Etti):
947
Teşekkür (Aldı):
1234
Ticaret:
(0) %
04-02-2018 18:06
#1
Python Machine Learning-Tensorflow 1.2/Ar-Ge Kulübü
Merhaba, şimdiye kadarki yazılarımızda gerçek olmayan bir data üzerinde ve çok teorik çalışmıştık. Bu yazımızla beraber kendi datamızı oluşturacak, onların üstünde çalışacak ve daha çok pratik yaparak bilgilerimizi pekiştireceğiz. Şimdi size elimizde içinde iyi ve kötü cümleler olan iki adet txt olsun, bunları kullanarak bir dataset yaratalım kendimize. Mantığımız şu şekilde olacak;
Örnek cümlemiz, "Ben koşarken elimdeki bardağı yere düşürdüm" olsun. Bunu tek tek kelimelerine ayıralım, ["Ben", "koşarken", "elimdeki", "bardağı", "yere", "düşürdüm"] olacaktır. 6 kelimelik bu listemizin her değerine 0 atayalım şimdi, elimizdeki liste son olarak;
[0,0,0,0,0,0] oldu. Şimdi kullanıcıdan bir cümle isteyelim, mesela kullanıcı "Arkadaşımla fazla yorulunca yere yattık" demiş olsun. Burası içinde aynı işlemleri yapıp iki listeyi karşılaştırdığımızda "yere" sözcüğü ortak olacaktır. Ortaklara ise 1 verelim, bu cümle için listemiz:
[0,0,0,0,1,0] oldu. Bunun için bazı kütüphanelerden faydalanacağız, öncelikle sıra sıra kütüphanelerimizi inceleyelim:


nltk:

nltk insan dilleri ile çalışmamızı sağlayan mükkemmel bir araç, 50 den fazla fonksiyona sahip (sınıflandırma vs.) ve hala aktif bir tartışma forumları da var. Bu projede bunlardan cümleyi kelimelerine ayırmamızı sağlayan word_tokenize'ı; ekine ve köküne ayırmamızı sağlayan lemmatizer'ları kullanacağız.

Peki neden köküne ayıralım?
Eğer kullanıcıdan girdiyi "if-else" metodu ile alsaydık kullanıcı aynı cümleyi bin farklı şekilde söyleyebilirdi, atıyorum "koşmak", "koştu", "koşma", "koşu", "koşalım"... Hepsi aynı hareketi belirtmekte ve biz bu hareketi esas alarak hareket etmek zorundayız.


pickle:
Oluşturacağımız çıktıyı dosyaya yazdırmamızı sağlayan bir araç.


Counter:

Büyük dataları sayarken kullanacağız. Mesela elimizde 150 tane aynı kelimeden, 134 tane başka bir aynı kelimeden varsa Counter bunları bizim için belirleyip tekrar yazmamızı önleyecek.

Öncelikle yapmamız gerekenleri belirleyelim, elimizde iki adet txt vardı. Bu txtlerdeki cümleleri kullanarak kendimize bir sözlük oluşturmalı ve o sözlüğü istediğimiz formata sokmalıyız. Daha önce mnist kullanmıştık hatırlarsanız, orada hazır geliyordu. Kütüphanelerimizi içe aktarmakla başlayalım:

Kod:
import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
import numpy as np
import random
import pickle
from collections import Counter

lemmatizer = WordNetLemmatizer() 
hm_lines = 10000000 #basit define'lar, hm_lines = how many lines, değişkendir
Şimdi ilk adımımız olan sözlüğü yaratmak için basit bir fonksiyon yazalım.
Kod:
def create_lexicon(pos, neg): #pos = positive, neg = negative
	lexicon = []
Fonksiyonumuz hazır, bütün kelimeleri tek tek alıp köklerine ayırıp eklemek gibi basit bir işlem yapacağız. Üstte bahsettiğim noktayı çok geniş cümleler için kullanıyoruz sadece.

Kod:
for fi in [pos, neg]:
	with open(fi, 'r') as f:
		contents = f.readlines()
		for l in contents[:hm_lines]:
			all_words = word_tokenize(l)
			lexicon += list(all_words)
Bütün kelimeleri ayırıp ortak listede birleştirdik, lakin köklerine ayırmamız gerekti. Üstte bahsettiğim üzere lemmatizer kullanacağız.

Kod:
lexicon = [lemmatizer.lemmatize(i) for i in lexicon]
Bu arada üstteki kod parçası tamamen bunla aynı işlevi yapıyor.

Kod:
for i in lexicon:
	lexicon = [lemmatizer.lemmatize(i)
Fazla dağıtmadan devam edelim.

Kod:
w_count = Counter(lexicon)
l2 = [] #yeni bir sözlük oluşturduk
for w in w_count:
	if 1000 > w_count[w] > 50: #kelimelerin tekrar sayısı aralığı
		l2.append(w)
return l2

İlk modülümüz tamamlandı, şimdi bu modülü işlememiz gerekecek. Şimdi geriye bunları satır satır okumak, sınıflandırmak, özelliklerini belirlemek olacak. Sonra da geçen yazımızdaki yapı aracılığıyla çalıştıracağız.
Hemen başka bir modül yazalım...

Kod:
def sample_handling(sample, lexicon, classification):
	featureset = [] #bu boş listeyi doldurup döndüreceğiz, aldığımız örnek txt nin satırlarını inceleyelim.
	with open(sample, 'r') as f:
		for l in contents[:hm_lines]:
			current_words = word.tokenize(l.lower()) #kelimelerine ayırdık
			current_words = [lemmatizer.lemmatize(i) for i in current_words] #köklerini aldık
			features = np.zeros(len(lexicon))
Burada bir ara verelim, nedir bu np.zeros?

Basitçe içine girilen değer kadar 0 oluşturuyor, hatırlarsanız bunu ortak kelimelerin kontrolü için kullanacaktık.

Kod:
import numpy as np
print(np.zeros(5))
Örnek olarak bu kod;

Kod:
hacknology@hacknomeister:~/Masaüstü/python-neuralnet$ python3 num.py
[0. 0. 0. 0. 0.]
Bu çıktıyı verecektir. Anladığınızı varsayarak devam ediyorum. Şimdi elimizdeki kelimeleri sözlükteki kelimelerle karşılaştıracağız, ortak kelime varsa bunun kaçıncı sırada olduğunu tespit edip o sıfır yerine bir(1) yazacağız. Örnek kodumuz şu şekilde:

Kod:
for word in current_words:
				if word.lower() in lexicon:
					index_value = lexicon.index(word.lower())
					features[index_value] += 1
			features = list(features)
			featureset.append([features, classification])
	return featureset
Bu modülümüz de tamamlandı, şimdi isterseniz özelliklerini ayarlayalım, labelları belirleyelim (labellara ilk yazımızdan aşina olmalısınız zaten.) Bunun için farklı bir modül yazacağım. Ayrıca bu modülde diğer iki modüldeki özelliklerimizi kullanacağız artık, orada yazdığımız kodları işleyeceğiz.

Kod:
def create_featuresets_and_labels(pos, neg, test_size=0.1):
	lexicon = create_lexicon(pos, neg)#örnek txtlerimizi ilk modüle yolladık.
	features = [] #gene boş liste
	features += sample_handling('pos.txt', lexicon, [1,0])#burada test_size adlı argümanı belirtmeme sebebimiz zaten default olarak 0.1 olması
	features += sample_handling('neg.txt', lexicon, [0,1])
	random.shuffle(features)
Son satır kafanızı karıştırmış olabilir, "zaten elimizde bir liste var, neden karıştırıyoruz ki?" dediğinizi duyar gibiyim. Farkederseniz biz bu listenin tamamını -ki gerçekten büyük bir liste- kullanmayacağız, sadece bir kısmını alacağız bu yüzden elimizdeki verileri karıştırıp homojen dağılmasını sağlamaya çalıştık.


Kod:
features = np.array(features)
testing_size = int(test_size*len(features))
Şimdi elimizdeki veriyi bir array'e çevirdik, ve test yapacağımız aralığı belirledik. Şimdi tek yapmamız gereken bir x bir de y için verileri almak, sonra ise eski scriptimizde işleyeceğiz.

Kod:
train_x = list(features[:,0][:-testing_size])
train_y = list(features[:,1][:-testing_size])

test_x = list(features[:,0][-testing_size:])
test_y = list(features[:,1][-testing_size:])

return train_x, train_y, test_x, test_y
Kod:
if __name__ == "__main__":
	train_x, train_y, test_x, test_y = create_featuresets_and_labels('pos.txt', 'neg.txt')
	with open('sentlement.pickle', 'wb') as f:
		pickle.dump([train_x, train_y, test_x, test_y], f)
Tüm kodumuz ise bu şekilde:
Kod:
import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
import numpy as np
import random
import pickle
from collections import Counter

lemmatizer = WordNetLemmatizer()
hm_lines = 10000000
def create_lexicon(pos, neg):
	lexicon = []
	for fi in [pos, neg]:
		with open(fi, 'r') as f:
			contents = f.readlines()
			for l in contents[:hm_lines]:
				all_words = word_tokenize(l)
				lexicon += list(all_words)
	lexicon = [lemmatizer.lemmatize(i) for i in lexicon]
	w_count = Counter(lexicon)
	l2 = []
	for w in w_count:
		if 1000 > w_count[w] > 50:
			l2.append(w)
	return l2

def sample_handling(sample, lexicon, classification):
	featureset = []
	with open (sample, 'r') as f:
		contents = f.readlines()
		for l in contents[:hm_lines]:
			current_words = word_tokenize(l.lower())
			current_words = [lemmatizer.lemmatize(i) for i in current_words]
			features = np.zeros(len(lexicon))
			for word in current_words:
				if word.lower() in lexicon:
					index_value = lexicon.index(word.lower())
					features[index_value] += 1
			features = list(features)
			featureset.append([features, classification])
	return featureset
def create_featuresets_and_labels(pos, neg, test_size=0.1):
	lexicon = create_lexicon(pos, neg)
	features = []
	features += sample_handling('pos.txt', lexicon, [1,0])
	features += sample_handling('neg.txt', lexicon, [0,1])
	random.shuffle(features)
	features = np.array(features)
	testing_size = int(test_size*len(features))
	train_x = list(features[:,0][:-testing_size])
	train_y = list(features[:,1][:-testing_size])

	test_x = list(features[:,0][-testing_size:])
	test_y = list(features[:,1][-testing_size:])

	return train_x, train_y, test_x, test_y

if __name__ == "__main__":
	train_x, train_y, test_x, test_y = create_featuresets_and_labels('pos.txt', 'neg.txt')
	with open('sentlement.pickle', 'wb') as f:
		pickle.dump([train_x, train_y, test_x, test_y], f)
Şimdi eski scriptimize dönüp gerçek bir data üstünde test yapalım, yalnız birkaç kodu editlememiz gerekecek. Bunun sebebi ise artık inputu mnist den değil de bizzat kendi datamızdan alacak olmamız.
Ben sizin kolay anlayabilmeniz açısından eski satırları yorum satırı olarak göstereceğim.

Kütüphanelerimizi içe aktarıp define'larımızı yapalım tekrardan.

Kod:
#from tensorflow.examples.tutorials.mnist import input_data
#mnist = input_data.read_data_sets("/tmp/data/", one_hot = True)
from data_oku import create_featuresets_and_labels
train_x, train_y, test_x, test_y = create_featuresets_and_labels('pos.txt', 'neg.txt')
import numpy as np
n_nodes_hl1 = 500
n_nodes_hl2 = 500
n_nodes_hl3 = 500
#n_classes = 10
n_classes = 2
batch_size = 100
Şimdi train_neural_network modülümüzdeki for döngümüzü kendimize göre editleyelim

Kod:
 for epoch in range(hm_epochs):
            epoch_loss = 0
            i = 0
            while i < len(train_x):
            	start = i
            	end = i+batch_size

            	batch_x = np.array(train_x[start:end])
            	batch_y = np.arrat(train_y[start:end])

                _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, y: epoch_y})
                epoch_loss += c
                i += batch_size
Şimdi çalıştıralım...

Kod:
Epoch 1 completed out of 10 loss: 1246269.1206054688
Çalıştı! İki scriptin de tam kodu ise şu şekilde:

train.py
Kod:
from data_oku import create_featuresets_and_labels
import tensorflow as tf
#from tensorflow.examples.tutorials.mnist import input_data
import pickle
import numpy as np

train_x,train_y,test_x,test_y = create_featuresets_and_labels('pos.txt','neg.txt')

n_nodes_hl1 = 1500
n_nodes_hl2 = 1500
n_nodes_hl3 = 1500

n_classes = 2
batch_size = 100
hm_epochs = 10

x = tf.placeholder('float')
y = tf.placeholder('float')

hidden_1_layer = {'f_fum':n_nodes_hl1,
                  'weight':tf.Variable(tf.random_normal([len(train_x[0]), n_nodes_hl1])),
                  'bias':tf.Variable(tf.random_normal([n_nodes_hl1]))}

hidden_2_layer = {'f_fum':n_nodes_hl2,
                  'weight':tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])),
                  'bias':tf.Variable(tf.random_normal([n_nodes_hl2]))}

hidden_3_layer = {'f_fum':n_nodes_hl3,
                  'weight':tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])),
                  'bias':tf.Variable(tf.random_normal([n_nodes_hl3]))}

output_layer = {'f_fum':None,
                'weight':tf.Variable(tf.random_normal([n_nodes_hl3, n_classes])),
                'bias':tf.Variable(tf.random_normal([n_classes])),}


# Nothing changes
def neural_network_model(data):

    l1 = tf.add(tf.matmul(data,hidden_1_layer['weight']), hidden_1_layer['bias'])
    l1 = tf.nn.relu(l1)

    l2 = tf.add(tf.matmul(l1,hidden_2_layer['weight']), hidden_2_layer['bias'])
    l2 = tf.nn.relu(l2)

    l3 = tf.add(tf.matmul(l2,hidden_3_layer['weight']), hidden_3_layer['bias'])
    l3 = tf.nn.relu(l3)

    output = tf.matmul(l3,output_layer['weight']) + output_layer['bias']

    return output

def train_neural_network(x):
	prediction = neural_network_model(x)
	cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y) )
	optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

	with tf.Session() as sess:
		sess.run(tf.initialize_all_variables())
	    
		for epoch in range(hm_epochs):
			epoch_loss = 0
			i=0
			while i < len(train_x):
				start = i
				end = i+batch_size
				batch_x = np.array(train_x[start:end])
				batch_y = np.array(train_y[start:end])

				_, c = sess.run([optimizer, cost], feed_dict={x: batch_x,
				                                              y: batch_y})
				epoch_loss += c
				i+=batch_size
				
			print('Epoch', epoch+1, 'completed out of',hm_epochs,'loss:',epoch_loss)
		correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
		accuracy = tf.reduce_mean(tf.cast(correct, 'float'))

		print('Accuracy:',accuracy.eval({x:test_x, y:test_y}))

	    
train_neural_network(x)
Bu yazımızdan bu kadar! Diğer yazımızda görüşmek üzere!
---------------------
I surrender my soul
Odin hear my call

flag{Bur4si_b1r_0yun_park1}

hacknology@hacknologyroot:~/
Connected - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2016
Mesajlar:
774
Konular:
56
Teşekkür (Etti):
73
Teşekkür (Aldı):
159
Ticaret:
(0) %
04-02-2018 18:30
#2
Eline sağlık
---------------------
$ C0D3R $
furkanisik3475 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2015
Nereden:
Ahıska
Mesajlar:
83
Konular:
1
Teşekkür (Etti):
53
Teşekkür (Aldı):
13
Ticaret:
(0) %
04-02-2018 21:03
#3
Eline sağlık
---------------------
  • Milletleri millet yapan, uğrunda ölecekleri yüksek ülkülere bağlanmış olmalarıdır.

ARCHE
Hacknology Teşekkür etti.
Blueeytning - ait Kullanıcı Resmi (Avatar)
Tamamen Forumdan Uzaklaştırıldı
Üyelik tarihi:
09/2017
Nereden:
MEKSİKA
Mesajlar:
302
Konular:
41
Teşekkür (Etti):
121
Teşekkür (Aldı):
44
Ticaret:
(0) %
04-02-2018 21:04
#4
eline emeğine sağlık baya değer vermişsiniz
CyberNeeG - ait Kullanıcı Resmi (Avatar)
Tamamen Forumdan Uzaklaştırıldı
Üyelik tarihi:
01/2016
Nereden:
777
Mesajlar:
1.158
Konular:
48
Teşekkür (Etti):
169
Teşekkür (Aldı):
156
Ticaret:
(0) %
04-02-2018 21:06
#5
Beyendim.
King Kong - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
03/2017
Mesajlar:
2.399
Konular:
153
Teşekkür (Etti):
158
Teşekkür (Aldı):
425
Ticaret:
(0) %
04-02-2018 21:07
#6
Bu Şimdi İşletim Sistemi Yazma Aşamalarımı Anlamadım Hiç Birşey Ellerine Sağlık Hackno
k3~
k3~ - ait Kullanıcı Resmi (Avatar)
Özel Üye
Üyelik tarihi:
10/2015
Mesajlar:
2.881
Konular:
202
Teşekkür (Etti):
1743
Teşekkür (Aldı):
3389
Ticaret:
(0) %
04-02-2018 21:12
#7
Eline koluna sağlık. Yine başarılı bir çalışma
Hacknology Teşekkür etti.
erfer - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2017
Nereden:
Gaziantep
Mesajlar:
395
Konular:
79
Teşekkür (Etti):
34
Teşekkür (Aldı):
37
Ticaret:
(0) %
04-02-2018 21:27
#8
Eline sağlık yararlı
---------------------
Selamun Aleyküm Hayırlı İşler
The Narkoz - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2017
Nereden:
Azerbaycan
Mesajlar:
2.675
Konular:
167
Teşekkür (Etti):
538
Teşekkür (Aldı):
608
Ticaret:
(0) %
04-02-2018 22:48
#9
Eline sağlık çok güzel işime çok yaradı
--------------------- Bu həyatda egosuzlara yer yoxdu
Hacknology Teşekkür etti.
Hacknology - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
10/2015
Nereden:
rm -rf /
Mesajlar:
2.710
Konular:
151
Teşekkür (Etti):
947
Teşekkür (Aldı):
1234
Ticaret:
(0) %
04-02-2018 22:55
#10
Herkese çok çok teşekkürler beyler
---------------------
I surrender my soul
Odin hear my call

flag{Bur4si_b1r_0yun_park1}

hacknology@hacknologyroot:~/

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı