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.
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
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ı
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
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. |
Yorumunuzu Bırakın