TensorFlow ile Birlikte Deep Learning


1. Tanım: 

Derin öğrenme, önceden belirlenmiş kuralların harfini basitçe yürüttüğü programlamanın aksine, makinenin kendi başına öğrenme yeteneğine sahip olduğu, makine öğreniminden türetilen bir tür yapay zekadır.


Une image contenant capture d’écran, cercle

Description générée automatiquement




Bu yazı için Google Brain tarafından geliştirilen kütüphane " TensorFlow " (versiyon 2.2.0) ile Keras modelini (artık TensorFlow ile entegre edilmiştir  ) kullanacağız  . 

Bu makalenin TensorFlow konusunda eğitim vermesi amaçlanmamıştır (bu konuda Google'dakiler de dahil olmak üzere pek çok eğitim bulacaksınız ) . Bunun yerine Python ile Dynamo içerisinde bu kütüphaneyi nasıl kullanabileceğimizi ve çok basit bir örneği keşfedeceğiz.



2. Veri Seti

Bu örnekte  sinir ağımızı eğitmeye yönelik veri seti 2 listeden oluşmaktadır:

  • noktaların bir listesi (burada yalnızca X ve Y koordinatlarını alırız)

  • noktaların listesiyle ilişkili Boolean listesi.

            değer True ise → noktalar listesindeki aynı indeksin noktası dairenin içindedir  

            değer Yanlış ise →  noktalar listesinin aynı indeksinin  noktası  dairenin dışındadır 

Une image contenant capture d’écran, diagramme, texte, Rectangle

Description générée automatiquement

Son olarak geometrik kürelerden oluşan son bir liste oluşturuyoruz. Tahminlerde bulunmak için kullanılacaktır. Amaç, her kürenin daire içinde olup olmadığını (eğitimli sinir ağından) tahmin etmektir.


Not:
Açıkçası basit bir matematik işlemiyle kürelerin daire içinde olup olmadığını belirleyebiliriz, ancak buradaki amaç bu değildir.


3. Kurallar 

Bu makalenin amacı bir model gerçekleştirmek değil, Dynamo'da TensorFlow'un yeteneklerini keşfetmektir.

Aşağıdaki örnekte, Keras ile (işlemleri çok daha kolay hale getiren) aşağıdaki özelliklere sahip bir sinir ağı oluşturuyoruz:

  • 2 düğümden oluşan bir giriş katmanı, her düğüm sırasıyla koordinatları ve bir tamsayıyı alır (noktanın daire içinde olup olmamasına bağlı olarak 0 veya 1)
  • 5 düğümden oluşan 2 gizli katman
  • ayrıca 2 düğümlü bir çıktı katmanı

Une image contenant diagramme, ligne, texte, carte

Description générée automatiquement

Model oluşturulduktan sonra onu fit() yöntemiyle eğitiyoruz ve son olarak tahmin() ile tahminler yapıyoruz .

Aktivasyon fonksiyonlarının, hata fonksiyonunun ve optimize edicinin seçimi ve özellikleri burada tartışılmamaktadır

import sys

import clr

import System

 

clr.AddReference('ProtoGeometry')

from Autodesk.DesignScript.Geometry import *

clr.AddReference('GeometryColor')

from Modifiers import GeometryColor

clr.AddReference('DSCoreNodes')

from DSCore import Color

 

clr.AddReference('System.Windows.Forms')

import System.Windows.Forms

from System.Windows.Forms import MessageBox, MessageBoxButtons

 

dirAppLoc = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData) 

sys.path.append(dirAppLoc + r'\python-3.8.3-embed-amd64\Lib\site-packages')

datacsv = dirAppLoc + "\\dataTensorFlow.csv"

 

# force to reload module

if "tensorflow" in sys.modules:

    del sys.modules["tensorflow"]

 

import numpy as np

import tensorflow as tf

from tensorflow import keras

from tensorflow.keras import layers

from tensorflow.python.client import device_lib

 

from io import StringIO    

 

sys.stdout = StringIO()

print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))

print(device_lib.list_local_devices())

 

LEARNING_RATE = 0.01 

EPOCH_COUNT = 2000 

max_accuracy = 80

# get X and Y from randoms points

x = np.array([[pt.X, pt.Y] for pt in IN[0]], dtype=np.float32) 

# convert bool to integer

y = np.array([int(x) for x in IN[1]], dtype=np.float32) 

# get X and Y from Test points for prediction

lstSpheres = IN[2]

testPoints = np.array([[sphere.CenterPoint.X, sphere.CenterPoint.Y] for sphere in lstSpheres], dtype=np.float32)

outGeometry = []

 

### Different activation ###

# softmax , tanh , relu , sigmoid

#

### Different loss ###

# binary_crossentropy , mean_squared_error , squared_hinge , categorical_crossentropy , sparse_categorical_crossentropy

#

model = keras.Sequential()

model.add(keras.layers.Dense(units=5,  input_shape=x.shape, activation='relu'))

model.add(keras.layers.Dense(units=5, activation='relu'))

model.add(keras.layers.Dense(units=2, activation='sigmoid')) 

 

#optimizer = tf.keras.optimizers.SGD(learning_rate = LEARNING_RATE)

optimizer = tf.keras.optimizers.Adam(learning_rate = LEARNING_RATE)

 

model.compile(optimizer=optimizer,

              loss='sparse_categorical_crossentropy',

              metrics=['accuracy'])

 

# train the model  

i = 0

final_accuracy = 0

while i < 3 and final_accuracy <= max_accuracy * 0.01:

 

    model.fit(x, y, epochs=EPOCH_COUNT)

    # get the final accuracy

    final_accuracy = round(model.history.history['accuracy'][-1], 2)

    i += 1

 

model.summary()

print(f"final_accuracy : {final_accuracy}")

# test Prediction

result1 = model.predict(testPoints)

# color the result

for idx, (sph, (out1, out2)) in enumerate(zip(lstSpheres, result1)):

    factor = 1 if out2 > 0.001 else 0

    print("probability shpere at index {} is inside circle : {}%".format(idx, round((1 - out1) * factor,  2) * 100))

    if out1  < 0.1 and out2 > 0.001:

        geocolor = GeometryColor.ByGeometryColor(sph, Color.ByARGB(255,0,255,0))

        outGeometry.append(geocolor)

    else:

        geocolor = GeometryColor.ByGeometryColor(sph, Color.ByARGB(255,255,0,0))

        outGeometry.append(geocolor)    

 

 

sys.stdout.seek(0)

readerstdout =  sys.stdout.read()

OUT = readerstdout, result1, outGeometry




Une image contenant texte, capture d’écran, diagramme, carte

Description générée automatiquement


NOT :

  • Bu çok basit bir model, gerçekte uygulanması gerekecek:
    • Daha büyük bir DataSet (daha fazla nokta)
    • Doğrulama Veri Kümesi
    • Modelin muhtemelen daha fazla katmana sahip değiştirilmiş yapısı
    • Erken Durdurma geri araması
    • Yazının orjinal versiyona ve yazarın diğer çalışmalarına buradan ulaşabilirisiniz. : https://voltadynabim.blogspot.com/2021/07/dynamopython-deep-learning-avec.html

 4. Video Gösterimi



 


Elektrik mühendisliği ve BT konusunda tutkuluyum ve işim artık bu iki dünyayı birleştirmeme izin veriyor. Ebedi bir acemi ve kendi kendini yetiştirmiş biri olarak assembler programlama, biraz Android geliştirme, biraz Lisp ile başladım ve şimdi Python programlama ve BIM varyantlarında durdum]. Yıllarca başkalarından öğrendikten sonra, bazı bilgileri paylaşma sırası bana geldi (Paylaşmak bilgiyi artırır). Tüm bunlar, bugün Autodesk tarafından Uzman Elit olarak tanındığım, bilgilerimi 'https://voltadynabim.blogspot.com/' blogum aracılığıyla paylaştığım ve DynamoBim forumunda (Autodesk) moderatör olarak yer aldığım anlamına geliyor. 




Paylaş:

Durmuş Cesur

Yorumunuzu Bırakın

Yorum yapabilmek için lütfen önce giriş yapınız