• Hesap Oluştur
  • Oturum Aç

Android YZ Keras ile Eğitilmiş Modelin TensorFlow’a Dönüştürülmesi

admin    0

    • avatar

    admin  17-05-2018, 12:11

    Kredi:
    #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ı

    Gelecek Yapay Zeka İle Gelecek
    (En son düzenleme: 17-05-2018, 12:12 admin.)
    Beğeni

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

Foruma Git: