Konuyu Değerlendir
  • 0 Oy - 0 Ortalama
  • 1
  • 2
  • 3
  • 4
  • 5
Android YZ Keras ile Eğitilmiş Modelin TensorFlow’a Dönüştürülmesi
#1
Merhaba, bu yazımda Keras ile eğittiğiniz bir modelin Android uygulamada nasıl kullanılacağından bahsedeceğim. 
Yapacaklarımız sırası ile şu şekilde:

  • Keras ve dataset ile bir model eğiteceğiz,

  • Eğittiğimiz modeli .pb uzantılı olarak kaydedeceğiz,

  • .pb uzantılı dosyayı Bazel ile .tflite uzantılı dosyaya çevireceğiz,

  • .tflite uzantılı dosyayı Android uygulamada kullanacağız.
Öngerekliler:
  • Python 3

  • Tensorflow 1.7

  • Numpy 1.14.2

  • Sklearn

  • Keras 2.1.5
Kod:
sudo pip install tensorflow
sudo pip install numpy
sudo pip install sklearn
sudo pip install keras

Bunları teker teker terminale yazdıkça her kütüphane ya da frameworkü yüklemiş olacaksanız.

Uygulamaya geçmeden önce verisetimizi indirelim. 

Verisetini indirmek için:
Not: Veristesinizde birkaç satırı kesip bir yere yapıştırın. Çünkü eğitimde kullanacağımız veriler ile deneme amaçlı kullanacağımız verilerin farklı olması daha iyi olur.

Uygulama, bazı giriş değerlerine göre diyabet hastası olup olmadığınızı kontrol ediyor. Sonuç 0 ise temizsiniz 1 ise sorun var demek. Bu dosyayı “pima-indians-diabetes.data” şeklinde projeyi açacağımız dizinimize kaydediyoruz.

Şimdi uygulamaya geçelim
Pycharm’ı açıyoruz ve bir adet Python dosyası oluşturuyoruz. Ben bu dosyaya “main” ismini verdim. Ve şu aşağıdaki kütüphaneleri yüklüyoruz.

Kod:
from keras.models import Sequential
from keras.layers import Dense
import numpy
Kütüphaneleri yüklediğimize göre uygulamaya devam ediyoruz.

Kod:
seed = 7
numpy.random.seed(seed)
dataset = numpy.loadtxt("./pima-indians-diabetes.data", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X,Y,epochs=50,batch_size=10,validation_split=0.13)
predictions = model.predict(X)
Bu şekilde yapay sinir ağımızı oluşturup eğittik şimdi bir tahmin yürütelim. Bunun için yukarıdaki kodun altına şu satırları yazıyoruz

Kod:
predict=numpy.array([1,89,66,23,94,28.1,0.167,21]).reshape(1,8)
print(model.predict_classes(predict))







Şimdi çalıştıralım ve sonuca bakalım.




[Resim: 1*OPlfHGu3wtlaCar_psp6Jg.png]


Bende sonuç “0” çıktı. Yukarıdaki kodları anlamamış olabilirsiniz. Gayet normal çünkü bu yazımızda asıl önemli olan eğittiğimiz modeli Android telefonlarda nasıl kullanacağımız.

Şimdi gelelim .pb uzantılı dosyayı oluşturmaya. Buralarda ince ayarlar gerekecek dikkat edin!
Şimdi şöyle bir fonksiyon yazalım.

Kod:
def export_model(saver, model, input_node_names, output_node_name,MODEL_NAME):
   tf.train.write_graph(K.get_session().graph_def, 'out', \
                        MODEL_NAME + '_graph.pbtxt')
   saver.save(K.get_session(), 'out/' + MODEL_NAME + '.chkp')
   freeze_graph.freeze_graph('out/' + MODEL_NAME + '_graph.pbtxt', None, \
                             False, 'out/' + MODEL_NAME + '.chkp', output_node_name, \
                             "save/restore_all", "save/Const:0", \
                             'out/modelim' + MODEL_NAME + '.pb', True, "")
   input_graph_def = tf.GraphDef()
   with tf.gfile.Open('out/modelim' + MODEL_NAME + '.pb', "rb") as f:
       input_graph_def.ParseFromString(f.read())
   output_graph_def = "optimize_for_inference_lib.optimize_for_inference(
       input_graph_def, input_node_names, [output_node_name],
       tf.float32.as_datatype_enum)
   with tf.gfile.FastGFile('out/opt_' + MODEL_NAME + '.pb', "wb") as f:
       f.write(output_graph_def.SerializeToString())
   print("graph kaydedildi")
   return


Bu fonksiyon modelimizi .pb uzantılı olarak kaydetmemizi sağlayacak. Şimdi bu fonksiyonu kullanmamız gerekecek. Bunun için modeli eğittiğimiz dosyanın en altına bu kod satırlarını ekliyoruz. Ama dosyayı [b]çalıştırmayın,daha yapacağımız işler var.[/b]

Kod:
X_train, X_test, y_train, y_test = train_test_split(X, Y)
estimators = []
estimator = KerasRegressor(build_fn=model, epochs=20, batch_size=50, verbose=2)
export_model(tf.train.Saver(), estimator, ["input name"], "output name","test")

Yukarıda gördüğünüz üzere iki adet parametre var bunlar:
  • “input name”

  • “output name”
input name modelimizin input ismi, output name ise modelimizin output ismi. Bu değişkenleri şu şekilde elde edebiliriz


Kod:
inputName=model.input.name[:-2]
outPutName=model.output.name[:-2]

[b]Not: “inputName” ve “outPutName” değişkenlerinin aldıkları değerleri print fonksiyonu ile yazdırın ve kaydedin. Çünkü ileride Bazel için kullanacağız.
[/b]

Bu sayede modelinizin input ve output ismini “inputName” ve “outPutName” adında değişkenlere atadık. Bu işlemleri yaptığımıza göre fonksiyonumuzu artık bu şekilde çağırabiliriz.
( UYARI : inputName ve outPutName değişkenlerini fonksiyonu çağırmadan önce tanımlamayı unutmayın! )

Kod:
export_model(tf.train.Saver(), estimator, [inputName], outPutName,"test")

Bunları yaptıktan sonra yazdığımız python dosyasını çalıştıralım. Çalıştırdıktan sonra “out” adında bir klasör oluşacak. Bu klasör altında bulunan “modelimtest.pb” dosyasını kullanacağız.

[Resim: 1*8kwbuQab-cgEvEEit9vSOQ.png]


Buraya kadar herşey mükemmel gitti ise ne güzel gitmemiş ise yukarıdaki adımları tekrar deneyiniz.

Alıntı: Deep Learning Hüseyin Serkan Özaydin yazısı

En İleri Karmaşıklık Sadeliktir...
Alıntı


Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi

Hakkımızda
    Yapay Zeka Forum , Yapay Zekayı Türkiye'ye tanıtmak ve bu alanda Türkçe kaynak sıkıntısını gidermek ve aynı zamanda Yapay Zekaya ilgi duyan tüm kişileri bir araya getirmek amacıyla kurulmuştur.

Yapay Zeka Forum


yapay zeka

,

yapay sinir ağı

,

yapay sinir ağları

,

derin öğrenme

,

makine öğrenmesi