{"id":38203,"date":"2026-01-25T16:40:43","date_gmt":"2026-01-25T13:40:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38203"},"modified":"2026-01-25T16:40:43","modified_gmt":"2026-01-25T13:40:43","slug":"tensorflow-callbacks-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/","title":{"rendered":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>TensorFlow ve Keras, derin \u00f6\u011frenme modellerini e\u011fitmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7eve sunar. Model e\u011fitimi, genellikle karma\u015f\u0131k ve zaman al\u0131c\u0131 bir s\u00fcre\u00e7tir. Bu s\u00fcre\u00e7te, modelin performans\u0131n\u0131 izlemek, e\u011fitimi belirli ko\u015fullara g\u00f6re ayarlamak veya durdurmak, model a\u011f\u0131rl\u0131klar\u0131n\u0131 kaydetmek gibi bir\u00e7ok operasyonel g\u00f6rev ortaya \u00e7\u0131kar. \u0130\u015fte tam bu noktada &#8220;callbacks&#8221; (geri \u00e7a\u011f\u0131rmalar) devreye girer. TensorFlow Callbacks, e\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fcn belirli a\u015famalar\u0131nda (epoch ba\u015flang\u0131c\u0131\/biti\u015fi, batch ba\u015flang\u0131c\u0131\/biti\u015fi, e\u011fitim ba\u015flang\u0131c\u0131\/biti\u015fi gibi) otomatik olarak tetiklenen i\u015flevlerdir. Bu rehberde, TensorFlow Callbacks&#8217;in ne oldu\u011funu, neden \u00f6nemli olduklar\u0131n\u0131, standart callback&#8217;leri ve kendi \u00f6zel callback&#8217;lerinizi nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 derinlemesine inceleyece\u011fiz.<\/p>\n<h3>Callbacks Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Callbacks, bir modelin e\u011fitim d\u00f6ng\u00fcs\u00fc s\u0131ras\u0131nda belirli olaylar meydana geldi\u011finde (\u00f6rne\u011fin, bir epoch&#8217;un sonu, bir batch&#8217;in ba\u015flang\u0131c\u0131) otomatik olarak y\u00fcr\u00fct\u00fclen fonksiyonlard\u0131r. Keras API&#8217;sinin temel bir par\u00e7as\u0131 olan bu mekanizma, geli\u015ftiricilere e\u011fitim s\u00fcrecini dinamik olarak kontrol etme ve izleme imkan\u0131 sunar.<\/p>\n<p>Callbacks&#8217;in \u00f6nemini birka\u00e7 maddede \u00f6zetleyebiliriz:<\/p>\n<p>*   <strong>E\u011fitim \u0130zleme ve G\u00f6rselle\u015ftirme:<\/strong> E\u011fitim metriklerini (do\u011fruluk, kay\u0131p vb.) ger\u00e7ek zamanl\u0131 olarak izlemek ve TensorBoard gibi ara\u00e7larla g\u00f6rselle\u015ftirmek.<br \/>\n*   <strong>Model Kaydetme:<\/strong> En iyi performans g\u00f6steren model a\u011f\u0131rl\u0131klar\u0131n\u0131 veya t\u00fcm modeli otomatik olarak kaydetmek.<br \/>\n*   <strong>Erken Durdurma:<\/strong> Modelin a\u015f\u0131r\u0131 \u00f6\u011frenmesini (overfitting) \u00f6nlemek i\u00e7in do\u011frulama kayb\u0131 belirli bir s\u00fcre iyile\u015fmedi\u011finde e\u011fitimi otomatik olarak durdurmak.<br \/>\n*   <strong>\u00d6\u011frenme Oran\u0131 Ayarlama:<\/strong> E\u011fitim ilerledik\u00e7e veya belirli metrikler plato \u00e7izdi\u011finde \u00f6\u011frenme oran\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmek.<br \/>\n*   <strong>\u00d6zel Davran\u0131\u015flar:<\/strong> Standart callback&#8217;lerin kapsamad\u0131\u011f\u0131 \u00f6zel ihtiya\u00e7lara y\u00f6nelik fonksiyonellikler eklemek.<\/p>\n<p>Callbacks, <code>model.fit()<\/code> y\u00f6ntemine bir liste olarak ge\u00e7irilir ve e\u011fitim d\u00f6ng\u00fcs\u00fc boyunca Keras taraf\u0131ndan otomatik olarak y\u00f6netilir. Bu sayede, model e\u011fitim kodunun karma\u015f\u0131kl\u0131\u011f\u0131 artmadan, e\u011fitim s\u00fcreci \u00fczerinde g\u00fc\u00e7l\u00fc bir kontrol sahibi olunur.<\/p>\n<h3>Standart TensorFlow Callbacks<\/h3>\n<p>TensorFlow, yayg\u0131n kullan\u0131m senaryolar\u0131n\u0131 kapsayan bir dizi \u00f6nceden tan\u0131mlanm\u0131\u015f callback sunar. Bu b\u00f6l\u00fcmde, en s\u0131k kullan\u0131lan standart callback&#8217;leri ve bunlar\u0131n nas\u0131l yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h4>tf.keras.callbacks.ModelCheckpoint<\/h4>\n<p><code>ModelCheckpoint<\/code> callback&#8217;i, modelin a\u011f\u0131rl\u0131klar\u0131n\u0131 veya t\u00fcm modelin yap\u0131s\u0131n\u0131 ve a\u011f\u0131rl\u0131klar\u0131n\u0131 belirli aral\u0131klarla veya belirli bir metri\u011fe g\u00f6re en iyi performans\u0131 g\u00f6sterdi\u011finde kaydetmek i\u00e7in kullan\u0131l\u0131r. Bu, uzun s\u00fcreli e\u011fitimlerde modelin ilerlemesini korumak veya da\u011f\u0131t\u0131m i\u00e7in en iyi modeli saklamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><strong>Ana Parametreler:<\/strong><\/p>\n<p>*   <code>filepath<\/code>: Modelin kaydedilece\u011fi dosya yolu. <code>{epoch:02d}-{val_loss:.2f}<\/code> gibi format dizeleri kullan\u0131labilir.<br \/>\n*   <code>monitor<\/code>: \u0130zlenecek metrik (\u00f6rn. <code>'val_loss'<\/code>, <code>'val_accuracy'<\/code>).<br \/>\n*   <code>verbose<\/code>: Detay seviyesi (0: sessiz, 1: mesaj g\u00f6sterir).<br \/>\n*   <code>save_best_only<\/code>: <code>True<\/code> ise, yaln\u0131zca izlenen metrikte en iyi performans\u0131 g\u00f6steren model kaydedilir.<br \/>\n*   <code>save_weights_only<\/code>: <code>True<\/code> ise, yaln\u0131zca modelin a\u011f\u0131rl\u0131klar\u0131 kaydedilir; aksi takdirde t\u00fcm model (yap\u0131, optimizat\u00f6r durumu vb.) kaydedilir.<br \/>\n*   <code>mode<\/code>: <code>'auto'<\/code>, <code>'min'<\/code>, <code>'max'<\/code>. \u0130zlenen metri\u011fin nas\u0131l de\u011ferlendirilece\u011fini belirler. <code>'min'<\/code> (\u00f6rn. kay\u0131p i\u00e7in), <code>'max'<\/code> (\u00f6rn. do\u011fruluk i\u00e7in).<br \/>\n*   <code>save_freq<\/code>: Kaydetme s\u0131kl\u0131\u011f\u0131. <code>'epoch'<\/code> veya batch say\u0131s\u0131 olabilir.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\">import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense\nimport numpy as np\n\n<h2>Basit bir model olu\u015ftural\u0131m<\/h2>\nmodel = Sequential([\n    Dense(10, activation='relu', input_shape=(784,)),\n    Dense(10, activation='softmax')\n])\nmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n<h2>Rastgele veri olu\u015ftural\u0131m<\/h2>\nx_train = np.random.rand(1000, 784)\ny_train = np.random.randint(0, 10, 1000)\nx_val = np.random.rand(200, 784)\ny_val = np.random.randint(0, 10, 200)\n\n<h2>ModelCheckpoint callback'i<\/h2>\ncheckpoint_filepath = 'model_checkpoints\/best_model_epoch_{epoch:02d}_val_loss_{val_loss:.2f}.h5'\nmodel_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(\n    filepath=checkpoint_filepath,\n    monitor='val_loss',\n    save_best_only=True,\n    mode='min',\n    verbose=1\n)\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=10,\n          validation_data=(x_val, y_val),\n          callbacks=[model_checkpoint_callback])<\/code><\/pre>\n<p>Bu \u00f6rnek, her epoch sonunda do\u011frulama kayb\u0131 (val_loss) izler ve en iyi do\u011frulama kayb\u0131na sahip modeli kaydeder.<\/p>\n<h4>tf.keras.callbacks.EarlyStopping<\/h4>\n<p><code>EarlyStopping<\/code> callback&#8217;i, modelin a\u015f\u0131r\u0131 \u00f6\u011frenmesini \u00f6nlemek i\u00e7in kullan\u0131l\u0131r. Belirli bir metrik (genellikle do\u011frulama kayb\u0131) belirli bir s\u00fcre boyunca iyile\u015fmedi\u011finde e\u011fitimi otomatik olarak durdurur. Bu, e\u011fitim s\u00fcresini optimize etmeye ve daha genellenebilir modeller elde etmeye yard\u0131mc\u0131 olur.<\/p>\n<p><strong>Ana Parametreler:<\/strong><\/p>\n<p>*   <code>monitor<\/code>: \u0130zlenecek metrik (\u00f6rn. <code>'val_loss'<\/code>, <code>'val_accuracy'<\/code>).<br \/>\n*   <code>min_delta<\/code>: \u0130zlenen metrikteki mutlak de\u011fi\u015fim. Bu de\u011fi\u015fimden daha az bir iyile\u015fme, iyile\u015fme olarak kabul edilmez.<br \/>\n*   <code>patience<\/code>: \u0130zlenen metrik <code>patience<\/code> say\u0131s\u0131 kadar epoch boyunca iyile\u015fmedi\u011finde e\u011fitim durdurulur.<br \/>\n*   <code>verbose<\/code>: Detay seviyesi.<br \/>\n*   <code>mode<\/code>: <code>'auto'<\/code>, <code>'min'<\/code>, <code>'max'<\/code>.<br \/>\n*   <code>baseline<\/code>: Bu de\u011ferin alt\u0131na d\u00fc\u015f\u00fclmedi\u011fi veya \u00fczerine \u00e7\u0131k\u0131lmad\u0131\u011f\u0131 s\u00fcrece (mode&#8217;a ba\u011fl\u0131 olarak) e\u011fitim durdurulmaz.<br \/>\n*   <code>restore_best_weights<\/code>: <code>True<\/code> ise, e\u011fitim durdu\u011funda en iyi epoch&#8217;taki model a\u011f\u0131rl\u0131klar\u0131 geri y\u00fcklenir.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\"># EarlyStopping callback'i\nearly_stopping_callback = tf.keras.callbacks.EarlyStopping(\n    monitor='val_loss',\n    patience=3, # 3 epoch boyunca iyile\u015fme olmazsa durdur\n    min_delta=0.001, # En az 0.001'lik bir iyile\u015fme olmal\u0131\n    mode='min',\n    verbose=1,\n    restore_best_weights=True\n)\n\n<h2>Modeli e\u011fitelim (daha fazla epoch ile, erken durdurmay\u0131 test etmek i\u00e7in)<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=50, # Yeterince y\u00fcksek bir de\u011fer veriyoruz\n          validation_data=(x_val, y_val),\n          callbacks=[model_checkpoint_callback, early_stopping_callback])<\/code><\/pre>\n<p>Bu \u00f6rnek, do\u011frulama kayb\u0131 3 epoch boyunca 0.001&#8217;den daha az iyile\u015firse e\u011fitimi durdurur ve en iyi a\u011f\u0131rl\u0131klar\u0131 geri y\u00fckler.<\/p>\n<h4>tf.keras.callbacks.ReduceLROnPlateau<\/h4>\n<p><code>ReduceLROnPlateau<\/code> callback&#8217;i, bir metrik (genellikle do\u011frulama kayb\u0131) belirli bir s\u00fcre boyunca iyile\u015fmedi\u011finde \u00f6\u011frenme oran\u0131n\u0131 (learning rate) azaltmak i\u00e7in kullan\u0131l\u0131r. Bu, modelin bir plato \u00e7izdi\u011fi durumlarda daha k\u00fc\u00e7\u00fck ad\u0131mlarla optimal noktaya yakla\u015fmas\u0131na yard\u0131mc\u0131 olabilir.<\/p>\n<p><strong>Ana Parametreler:<\/strong><\/p>\n<p>*   <code>monitor<\/code>: \u0130zlenecek metrik.<br \/>\n*   <code>factor<\/code>: \u00d6\u011frenme oran\u0131n\u0131n \u00e7arp\u0131laca\u011f\u0131 fakt\u00f6r (\u00f6rn. 0.1, \u00f6\u011frenme oran\u0131n\u0131 10 kat azalt\u0131r).<br \/>\n*   <code>patience<\/code>: \u0130zlenen metrik <code>patience<\/code> say\u0131s\u0131 kadar epoch boyunca iyile\u015fmedi\u011finde \u00f6\u011frenme oran\u0131 azalt\u0131l\u0131r.<br \/>\n*   <code>verbose<\/code>: Detay seviyesi.<br \/>\n*   <code>mode<\/code>: <code>'auto'<\/code>, <code>'min'<\/code>, <code>'max'<\/code>.<br \/>\n*   <code>min_delta<\/code>: \u0130zlenen metrikteki mutlak de\u011fi\u015fim.<br \/>\n*   <code>cooldown<\/code>: \u00d6\u011frenme oran\u0131 azalt\u0131ld\u0131ktan sonra, tekrar azalt\u0131lmadan \u00f6nce beklenecek epoch say\u0131s\u0131.<br \/>\n*   <code>min_lr<\/code>: \u00d6\u011frenme oran\u0131n\u0131n d\u00fc\u015febilece\u011fi minimum de\u011fer.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\"># ReduceLROnPlateau callback'i\nreduce_lr_callback = tf.keras.callbacks.ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.2, # \u00d6\u011frenme oran\u0131n\u0131 5 kat azalt\n    patience=2, # 2 epoch boyunca iyile\u015fme olmazsa\n    min_delta=0.001,\n    mode='min',\n    verbose=1,\n    min_lr=0.00001 # Minimum \u00f6\u011frenme oran\u0131\n)\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=50,\n          validation_data=(x_val, y_val),\n          callbacks=[early_stopping_callback, reduce_lr_callback])<\/code><\/pre>\n<p>Bu \u00f6rnek, do\u011frulama kayb\u0131 2 epoch boyunca 0.001&#8217;den daha az iyile\u015firse \u00f6\u011frenme oran\u0131n\u0131 0.2 fakt\u00f6r\u00fcyle \u00e7arpar.<\/p>\n<h4>tf.keras.callbacks.TensorBoard<\/h4>\n<p><code>TensorBoard<\/code> callback&#8217;i, model e\u011fitimi s\u0131ras\u0131nda metrikleri, grafikleri, a\u011f\u0131rl\u0131k histogramlar\u0131n\u0131 ve di\u011fer g\u00f6rselle\u015ftirmeleri TensorBoard aray\u00fcz\u00fcnde g\u00f6r\u00fcnt\u00fclemek i\u00e7in gerekli g\u00fcnl\u00fck dosyalar\u0131n\u0131 olu\u015fturur. Bu, e\u011fitim s\u00fcrecini anlamak ve hata ay\u0131klamak i\u00e7in paha bi\u00e7ilmez bir ara\u00e7t\u0131r.<\/p>\n<p><strong>Ana Parametreler:<\/strong><\/p>\n<p>*   <code>log_dir<\/code>: G\u00fcnl\u00fck dosyalar\u0131n\u0131n kaydedilece\u011fi dizin.<br \/>\n*   <code>histogram_freq<\/code>: A\u011f\u0131rl\u0131k ve aktivasyon histogramlar\u0131n\u0131n ka\u00e7 epoch&#8217;ta bir hesaplan\u0131p kaydedilece\u011fi. (0 ise kaydedilmez).<br \/>\n*   <code>write_graph<\/code>: <code>True<\/code> ise modelin hesaplama grafi\u011fi kaydedilir.<br \/>\n*   <code>write_images<\/code>: <code>True<\/code> ise, modelin ilk katmanlar\u0131ndaki a\u011f\u0131rl\u0131klar\u0131n g\u00f6rsel temsilleri kaydedilir.<br \/>\n*   <code>update_freq<\/code>: G\u00fcncelleme s\u0131kl\u0131\u011f\u0131. <code>'batch'<\/code>, <code>'epoch'<\/code> veya bir tam say\u0131 olabilir (batch say\u0131s\u0131).<\/p>\n<p><strong>TensorBoard&#8217;u Ba\u015flatma:<\/strong><br \/>\nE\u011fitim bittikten veya devam ederken, terminalde <code>tensorboard --logdir path\/to\/log_dir<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak TensorBoard aray\u00fcz\u00fcn\u00fc ba\u015flatabilirsiniz.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\">import datetime\n\n<h2>TensorBoard callback'i<\/h2>\nlog_dir = \"logs\/fit\/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\ntensorboard_callback = tf.keras.callbacks.TensorBoard(\n    log_dir=log_dir,\n    histogram_freq=1, # Her epoch'ta a\u011f\u0131rl\u0131k histogramlar\u0131n\u0131 kaydet\n    write_graph=True,\n    write_images=False,\n    update_freq='epoch'\n)\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=10,\n          validation_data=(x_val, y_val),\n          callbacks=[tensorboard_callback])<\/code><\/pre>\n<p>Bu, her epoch sonunda TensorBoard&#8217;a metrikleri ve histogramlar\u0131 kaydeder.<\/p>\n<h4>tf.keras.callbacks.CSVLogger<\/h4>\n<p><code>CSVLogger<\/code> callback&#8217;i, e\u011fitim metriklerini (kay\u0131p, do\u011fruluk, do\u011frulama kayb\u0131, do\u011frulama do\u011frulu\u011fu vb.) bir CSV dosyas\u0131na kaydetmek i\u00e7in kullan\u0131l\u0131r. Bu, e\u011fitim ge\u00e7mi\u015fini daha sonra analiz etmek veya ba\u015fka ara\u00e7larla g\u00f6rselle\u015ftirmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><strong>Ana Parametreler:<\/strong><\/p>\n<p>*   <code>filename<\/code>: CSV dosyas\u0131n\u0131n ad\u0131.<br \/>\n*   <code>separator<\/code>: CSV dosyas\u0131nda kullan\u0131lacak ay\u0131r\u0131c\u0131 (varsay\u0131lan &#8216;,&#8217;).<br \/>\n*   <code>append<\/code>: <code>True<\/code> ise, dosya zaten varsa yeni veriler sona eklenir; aksi takdirde dosya \u00fczerine yaz\u0131l\u0131r.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\"># CSVLogger callback'i\ncsv_logger_callback = tf.keras.callbacks.CSVLogger(\n    'training_log.csv',\n    append=True, # Mevcut dosyaya ekle\n    separator=';'\n)\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=10,\n          validation_data=(x_val, y_val),\n          callbacks=[csv_logger_callback])<\/code><\/pre>\n<p>Bu, her epoch sonunda e\u011fitim metriklerini <code>training_log.csv<\/code> adl\u0131 bir dosyaya kaydeder.<\/p>\n<h4>tf.keras.callbacks.LambdaCallback<\/h4>\n<p><code>LambdaCallback<\/code> callback&#8217;i, basit ve tek seferlik callback&#8217;ler olu\u015fturmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. E\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fcn farkl\u0131 a\u015famalar\u0131nda tetiklenecek lambda fonksiyonlar\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r. Karma\u015f\u0131k durumlar i\u00e7in \u00f6zel bir callback s\u0131n\u0131f\u0131 olu\u015fturmak yerine, h\u0131zl\u0131 prototipleme veya basit g\u00f6revler i\u00e7in idealdir.<\/p>\n<p><strong>Ana Parametreler:<\/strong><\/p>\n<p>*   <code>on_epoch_begin<\/code>: Her epoch ba\u015flang\u0131c\u0131nda \u00e7a\u011fr\u0131lacak lambda.<br \/>\n*   <code>on_epoch_end<\/code>: Her epoch sonunda \u00e7a\u011fr\u0131lacak lambda.<br \/>\n*   <code>on_batch_begin<\/code>: Her batch ba\u015flang\u0131c\u0131nda \u00e7a\u011fr\u0131lacak lambda.<br \/>\n*   <code>on_batch_end<\/code>: Her batch sonunda \u00e7a\u011fr\u0131lacak lambda.<br \/>\n*   <code>on_train_begin<\/code>: E\u011fitimin ba\u015flang\u0131c\u0131nda \u00e7a\u011fr\u0131lacak lambda.<br \/>\n*   <code>on_train_end<\/code>: E\u011fitimin sonunda \u00e7a\u011fr\u0131lacak lambda.<\/p>\n<p>Her lambda fonksiyonu, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 faza ba\u011fl\u0131 olarak belirli arg\u00fcmanlar al\u0131r (\u00f6rn. <code>epoch<\/code>, <code>batch<\/code>, <code>logs<\/code>).<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\"># LambdaCallback \u00f6rne\u011fi\nlambda_callback = tf.keras.callbacks.LambdaCallback(\n    on_epoch_begin=lambda epoch, logs: print(f\"\\nEpoch {epoch+1} ba\u015fl\u0131yor...\"),\n    on_epoch_end=lambda epoch, logs: print(f\"Epoch {epoch+1} bitti. Val Accuracy: {logs['val_accuracy']:.4f}\"),\n    on_batch_end=lambda batch, logs: print(f\"Batch {batch+1} bitti. Loss: {logs['loss']:.4f}\", end='\\r')\n)\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=3,\n          validation_data=(x_val, y_val),\n          callbacks=[lambda_callback])<\/code><\/pre>\n<p>Bu \u00f6rnek, epoch ba\u015flang\u0131\u00e7 ve biti\u015finde mesajlar yazd\u0131r\u0131r ve her batch sonunda kay\u0131p de\u011ferini g\u00fcnceller.<\/p>\n<h4>tf.keras.callbacks.TerminateOnNaN<\/h4>\n<p><code>TerminateOnNaN<\/code> callback&#8217;i, e\u011fitim s\u0131ras\u0131nda bir modelin kayb\u0131n\u0131n veya herhangi bir metrik de\u011ferinin <code>NaN<\/code> (Not a Number) haline gelmesi durumunda e\u011fitimi otomatik olarak durdurur. Bu, modelin karars\u0131z hale geldi\u011fini veya \u00f6\u011frenme oran\u0131n\u0131n \u00e7ok y\u00fcksek oldu\u011funu g\u00f6steren bir i\u015farettir ve daha fazla e\u011fitim genellikle anlams\u0131zd\u0131r.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-python\"># TerminateOnNaN callback'i\nterminate_on_nan_callback = tf.keras.callbacks.TerminateOnNaN()\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=10,\n          validation_data=(x_val, y_val),\n          callbacks=[terminate_on_nan_callback])<\/code><\/pre>\n<p>Bu callback, genellikle di\u011fer callback&#8217;lerle birlikte kullan\u0131l\u0131r ve e\u011fitim kararl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in bir g\u00fcvenlik \u00f6nlemi g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<h3>\u00d6zel Callbacks Olu\u015fturma<\/h3>\n<p>Standart callback&#8217;ler bir\u00e7ok yayg\u0131n senaryoyu kapsasa da, bazen model e\u011fitim s\u00fcrecine tamamen \u00f6zelle\u015ftirilmi\u015f davran\u0131\u015flar eklemek gerekebilir. TensorFlow, <code>tf.keras.callbacks.Callback<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreterek kendi \u00f6zel callback&#8217;lerinizi olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<h4>Neden \u00d6zel Callback Olu\u015fturmal\u0131y\u0131z?<\/h4>\n<p>*   <strong>\u00d6zel Metrikleri Hesaplama ve Kaydetme:<\/strong> Belirli bir metri\u011fi (\u00f6rn. F1 skoru, IoU) her epoch sonunda hesaplay\u0131p kaydetmek.<br \/>\n*   <strong>Dinamik Hiperparametre Ayar\u0131:<\/strong> \u00d6\u011frenme oran\u0131 d\u0131\u015f\u0131nda ba\u015fka hiperparametreleri (\u00f6rn. dropout oran\u0131, optimizat\u00f6r parametreleri) e\u011fitim s\u0131ras\u0131nda de\u011fi\u015ftirmek.<br \/>\n*   <strong>Model De\u011ferlendirme ve G\u00f6rselle\u015ftirme:<\/strong> E\u011fitim s\u0131ras\u0131nda modelin ara katman \u00e7\u0131kt\u0131lar\u0131n\u0131 veya tahminlerini g\u00f6rselle\u015ftirmek.<br \/>\n*   <strong>D\u0131\u015f Sistemlerle Entegrasyon:<\/strong> E\u011fitim ilerlemesini bir mesajla\u015fma uygulamas\u0131na g\u00f6ndermek veya bir veritaban\u0131na kaydetmek.<br \/>\n*   <strong>Ko\u015fullu \u0130\u015flemler:<\/strong> Belirli ko\u015fullar alt\u0131nda \u00f6zel bir eylem ger\u00e7ekle\u015ftirmek (\u00f6rn. belirli bir epoch&#8217;tan sonra bir modeli dondurmak\/\u00e7\u00f6zmek).<\/p>\n<h4>\u00d6zel Callback S\u0131n\u0131f\u0131 Olu\u015fturma<\/h4>\n<p>\u00d6zel bir callback olu\u015fturmak i\u00e7in <code>tf.keras.callbacks.Callback<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretmeli ve ihtiyac\u0131n\u0131z olan olaylara kar\u015f\u0131l\u0131k gelen y\u00f6ntemleri ge\u00e7ersiz k\u0131lmal\u0131s\u0131n\u0131z. Bu y\u00f6ntemler, e\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fcn belirli noktalar\u0131nda Keras taraf\u0131ndan \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<p><strong>Temel Callback Y\u00f6ntemleri:<\/strong><\/p>\n<p>*   <code>on_train_begin(self, logs=None)<\/code>: E\u011fitimin ba\u015flang\u0131c\u0131nda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>on_train_end(self, logs=None)<\/code>: E\u011fitimin sonunda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>on_epoch_begin(self, epoch, logs=None)<\/code>: Her epoch&#8217;un ba\u015flang\u0131c\u0131nda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>on_epoch_end(self, epoch, logs=None)<\/code>: Her epoch&#8217;un sonunda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>on_batch_begin(self, batch, logs=None)<\/code>: Her batch&#8217;in ba\u015flang\u0131c\u0131nda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>on_batch_end(self, batch, logs=None)<\/code>: Her batch&#8217;in sonunda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <code>on_test_begin(self, logs=None)<\/code>, <code>on_test_end(self, logs=None)<\/code>, <code>on_test_batch_begin(self, batch, logs=None)<\/code>, <code>on_test_batch_end(self, batch, logs=None)<\/code>: <code>model.evaluate()<\/code> i\u00e7in.<br \/>\n*   <code>on_predict_begin(self, logs=None)<\/code>, <code>on_predict_end(self, logs=None)<\/code>, <code>on_predict_batch_begin(self, batch, logs=None)<\/code>, <code>on_predict_batch_end(self, batch, logs=None)<\/code>: <code>model.predict()<\/code> i\u00e7in.<\/p>\n<p>Her y\u00f6ntemin <code>logs<\/code> arg\u00fcman\u0131, o anki e\u011fitim faz\u0131na ait metrikleri i\u00e7eren bir s\u00f6zl\u00fckt\u00fcr (dictionary). \u00d6rne\u011fin, <code>on_epoch_end<\/code> i\u00e7in <code>logs<\/code> s\u00f6zl\u00fc\u011f\u00fc, <code>loss<\/code>, <code>accuracy<\/code>, <code>val_loss<\/code>, <code>val_accuracy<\/code> gibi metrikleri i\u00e7erebilir.<\/p>\n<p>Callback s\u0131n\u0131f\u0131n\u0131z i\u00e7inde <code>self.model<\/code> arac\u0131l\u0131\u011f\u0131yla e\u011fitti\u011finiz modele eri\u015febilir, <code>self.model.optimizer<\/code> arac\u0131l\u0131\u011f\u0131yla optimizat\u00f6re ve onun parametrelerine eri\u015febilirsiniz.<\/p>\n<p><strong>\u00d6rnek: \u00d6\u011frenme Oran\u0131n\u0131 Yazd\u0131ran \u00d6zel Callback<\/strong><\/p>\n<p>Bu \u00f6rnek, her epoch sonunda g\u00fcncel \u00f6\u011frenme oran\u0131n\u0131 yazd\u0131ran basit bir \u00f6zel callback olu\u015fturacakt\u0131r.<\/p>\n<pre><code class=\"language-python\">class LearningRateLogger(tf.keras.callbacks.Callback):\n    def on_epoch_begin(self, epoch, logs=None):\n        # self.model.optimizer, Keras optimizat\u00f6r nesnesidir.\n        # optimizat\u00f6r\u00fcn 'lr' \u00f6zelli\u011fine eri\u015febiliriz.\n        lr = self.model.optimizer.lr\n        # E\u011fer optimizat\u00f6r bir Schedule kullan\u0131yorsa, lr bir Tensor olabilir.\n        # Bu durumda .numpy() ile de\u011ferini almam\u0131z gerekir.\n        if hasattr(lr, 'numpy'):\n            lr_value = lr.numpy()\n        else:\n            lr_value = lr\n        print(f\"\\nEpoch {epoch+1}: Current Learning Rate is {lr_value:.6f}\")\n\n<h2>Modeli tekrar olu\u015ftural\u0131m veya mevcut modeli kullanal\u0131m<\/h2>\nmodel = Sequential([\n    Dense(10, activation='relu', input_shape=(784,)),\n    Dense(10, activation='softmax')\n])\nmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n<h2>\u00d6zel callback'imizi olu\u015ftural\u0131m<\/h2>\nlr_logger_callback = LearningRateLogger()\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=5,\n          validation_data=(x_val, y_val),\n          callbacks=[lr_logger_callback, reduce_lr_callback]) # ReduceLROnPlateau ile birlikte kullanabiliriz<\/code><\/pre>\n<p>Bu callback, <code>on_epoch_begin<\/code> y\u00f6ntemini ge\u00e7ersiz k\u0131larak, her epoch ba\u015flad\u0131\u011f\u0131nda mevcut \u00f6\u011frenme oran\u0131n\u0131 yazd\u0131r\u0131r. <code>reduce_lr_callback<\/code> ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, \u00f6\u011frenme oran\u0131ndaki de\u011fi\u015fiklikleri g\u00f6zlemlememizi sa\u011flar.<\/p>\n<p><strong>Daha Karma\u015f\u0131k Bir \u00d6rnek: \u00d6zel Metrik Hesaplama ve Kaydetme<\/strong><\/p>\n<p>Diyelim ki, modelin performans\u0131n\u0131 her epoch sonunda F1 skoru ile \u00f6l\u00e7mek ve bu de\u011feri bir dosyaya kaydetmek istiyoruz. Keras&#8217;\u0131n yerle\u015fik metrikleri aras\u0131nda F1 skoru bulunmayabilir (veya s\u0131n\u0131fland\u0131rma probleminize \u00f6zel bir F1 hesaplamas\u0131 gerekebilir).<\/p>\n<pre><code class=\"language-python\">from sklearn.metrics import f1_score\nimport numpy as np\n\nclass F1ScoreLogger(tf.keras.callbacks.Callback):\n    def __init__(self, validation_data, filepath='f1_scores.csv'):\n        super().__init__()\n        self.validation_data = validation_data\n        self.filepath = filepath\n        # Dosyay\u0131 ba\u015flat ve ba\u015fl\u0131klar\u0131 yaz\n        with open(self.filepath, 'w') as f:\n            f.write('epoch,f1_score\\n')\n\n    def on_epoch_end(self, epoch, logs=None):\n        x_val, y_val = self.validation_data\n        # Modelden tahminler al\n        y_pred_probs = self.model.predict(x_val, verbose=0)\n        y_pred = np.argmax(y_pred_probs, axis=1)\n\n        # F1 skorunu hesapla\n        # average='weighted' kullan\u0131yoruz \u00e7\u00fcnk\u00fc dengesiz s\u0131n\u0131flar olabilir\n        f1 = f1_score(y_val, y_pred, average='weighted')\n\n        # Loglara F1 skorunu ekle (TensorBoard veya di\u011fer callback'ler i\u00e7in)\n        logs['val_f1_score'] = f1\n        print(f\" - val_f1_score: {f1:.4f}\")\n\n        # F1 skorunu dosyaya kaydet\n        with open(self.filepath, 'a') as f:\n            f.write(f'{epoch+1},{f1:.4f}\\n')\n\n<h2>Modeli tekrar olu\u015ftural\u0131m veya mevcut modeli kullanal\u0131m<\/h2>\nmodel = Sequential([\n    Dense(10, activation='relu', input_shape=(784,)),\n    Dense(10, activation='softmax')\n])\nmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n<h2>F1ScoreLogger callback'ini olu\u015ftural\u0131m<\/h2>\nf1_logger_callback = F1ScoreLogger(validation_data=(x_val, y_val), filepath='f1_scores_log.csv')\n\n<h2>Modeli e\u011fitelim<\/h2>\nmodel.fit(x_train, y_train,\n          epochs=5,\n          validation_data=(x_val, y_val),\n          callbacks=[f1_logger_callback])<\/code><\/pre>\n<p>Bu \u00f6rnek, <code>on_epoch_end<\/code> y\u00f6ntemini kullanarak her epoch sonunda do\u011frulama verileri \u00fczerinde F1 skorunu hesaplar, bunu <code>logs<\/code> s\u00f6zl\u00fc\u011f\u00fcne ekler (b\u00f6ylece di\u011fer callback&#8217;ler de bu de\u011fere eri\u015febilir) ve ayr\u0131 bir CSV dosyas\u0131na kaydeder.<\/p>\n<h3>Geli\u015fmi\u015f Callback Kullan\u0131m\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Callbacks, e\u011fitim s\u00fcrecini daha verimli ve kontrol edilebilir hale getirmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. \u0130\u015fte geli\u015fmi\u015f kullan\u0131m senaryolar\u0131 ve en iyi uygulamalar:<\/p>\n<h4>Birden Fazla Callback Kullan\u0131m\u0131<\/h4>\n<p><code>model.fit()<\/code> metoduna birden fazla callback ge\u00e7irebilirsiniz. Keras, bu callback&#8217;leri listenin s\u0131ras\u0131na g\u00f6re \u00e7a\u011f\u0131r\u0131r. Ancak, \u00e7o\u011fu callback&#8217;in \u00e7a\u011fr\u0131lma s\u0131ras\u0131 \u00f6nemli de\u011fildir. \u00d6rne\u011fin, <code>EarlyStopping<\/code> ve <code>ModelCheckpoint<\/code> birlikte sorunsuz \u00e7al\u0131\u015f\u0131r. <code>ReduceLROnPlateau<\/code> ve <code>EarlyStopping<\/code> genellikle birlikte kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">callbacks_list = [\n    tf.keras.callbacks.ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True),\n    tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5),\n    tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3),\n    tf.keras.callbacks.TensorBoard(log_dir='tensorboard_logs')\n]\n\nmodel.fit(x_train, y_train,\n          epochs=100,\n          validation_data=(x_val, y_val),\n          callbacks=callbacks_list)<\/code><\/pre>\n<h4>Callback&#8217;lerde Durum Y\u00f6netimi<\/h4>\n<p>\u00d6zel callback&#8217;lerinizde s\u0131n\u0131f de\u011fi\u015fkenlerini kullanarak durum bilgisi saklayabilirsiniz. \u00d6rne\u011fin, belirli bir e\u015fi\u011fe ula\u015f\u0131ld\u0131\u011f\u0131nda bir sayac\u0131 art\u0131rmak veya \u00f6nceki epoch&#8217;lardan gelen metrikleri depolamak isteyebilirsiniz.<\/p>\n<pre><code class=\"language-python\">class CustomSaver(tf.keras.callbacks.Callback):\n    def __init__(self, threshold):\n        super().__init__()\n        self.threshold = threshold\n        self.best_accuracy = 0\n\n    def on_epoch_end(self, epoch, logs=None):\n        current_accuracy = logs.get('val_accuracy')\n        if current_accuracy is not None and current_accuracy > self.best_accuracy:\n            self.best_accuracy = current_accuracy\n            if current_accuracy > self.threshold:\n                print(f\"\\nAccuracy {current_accuracy:.4f} e\u015fi\u011fi ({self.threshold:.4f}) a\u015ft\u0131. Modeli kaydediyorum...\")\n                self.model.save(f\"model_acc_{current_accuracy:.4f}.h5\")\n\ncustom_saver = CustomSaver(threshold=0.85)\n<h2>... model.fit(..., callbacks=[custom_saver])<\/code><\/pre>\n<\/h2>\n<h4>Performans Hususlar\u0131<\/h4>\n<p>Callback&#8217;ler, e\u011fitim d\u00f6ng\u00fcs\u00fcne ek kod ekledi\u011fi i\u00e7in k\u00fc\u00e7\u00fck bir performans y\u00fck\u00fc getirebilir. \u00d6zellikle <code>on_batch_end<\/code> gibi s\u0131k \u00e7a\u011fr\u0131lan y\u00f6ntemlerde karma\u015f\u0131k hesaplamalar yapmak, e\u011fitimi yava\u015flatabilir. Performans kritikse, hesaplamalar\u0131 <code>on_epoch_end<\/code> gibi daha seyrek \u00e7a\u011fr\u0131lan y\u00f6ntemlere ta\u015f\u0131may\u0131 d\u00fc\u015f\u00fcn\u00fcn. <code>TensorBoard<\/code> callback&#8217;inde <code>histogram_freq<\/code> parametresini \u00e7ok s\u0131k ayarlamak da performans \u00fczerinde etkili olabilir.<\/p>\n<h4>Hata Ay\u0131klama<\/h4>\n<p>Callback&#8217;lerinizde hata ay\u0131klarken, <code>print()<\/code> ifadeleri kullanmak veya bir hata ay\u0131klay\u0131c\u0131 (debugger) eklemek faydal\u0131 olabilir. <code>logs<\/code> s\u00f6zl\u00fc\u011f\u00fcn\u00fcn i\u00e7eri\u011fini anlamak, callback&#8217;lerinizin do\u011fru verilere eri\u015fti\u011finden emin olmak i\u00e7in \u00f6nemlidir.<\/p>\n<h4>Callback&#8217;leri model.evaluate() ve model.predict() ile Kullanma<\/h4>\n<p>Callbacks sadece <code>model.fit()<\/code> ile de\u011fil, ayn\u0131 zamanda <code>model.evaluate()<\/code> ve <code>model.predict()<\/code> ile de kullan\u0131labilir. Bu, de\u011ferlendirme veya tahmin s\u00fcre\u00e7lerini izlemek veya belirli i\u015flemler yapmak i\u00e7in yararl\u0131 olabilir. \u00d6rne\u011fin, <code>on_test_end<\/code> veya <code>on_predict_batch_end<\/code> y\u00f6ntemlerini ge\u00e7ersiz k\u0131larak bu i\u015flemlere m\u00fcdahale edebilirsiniz.<\/p>\n<pre><code class=\"language-python\">class PredictionLogger(tf.keras.callbacks.Callback):\n    def on_predict_batch_end(self, batch, logs=None):\n        # logs s\u00f6zl\u00fc\u011f\u00fc 'outputs' anahtar\u0131n\u0131 i\u00e7erebilir\n        print(f\"Predict batch {batch}: outputs shape {logs['outputs'].shape}\")\n\nprediction_logger = PredictionLogger()\npredictions = model.predict(x_test, callbacks=[prediction_logger])<\/code><\/pre>\n<h3>Sonu\u00e7<\/h3>\n<p>TensorFlow Callbacks, derin \u00f6\u011frenme model e\u011fitimi s\u00fcrecini y\u00f6netmek, izlemek ve optimize etmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. <code>ModelCheckpoint<\/code> ile en iyi modellerinizi kaydetmek, <code>EarlyStopping<\/code> ile a\u015f\u0131r\u0131 \u00f6\u011frenmeyi \u00f6nlemek, <code>ReduceLROnPlateau<\/code> ile \u00f6\u011frenme oran\u0131n\u0131 dinamik olarak ayarlamak ve <code>TensorBoard<\/code> ile e\u011fitimi g\u00f6rselle\u015ftirmek gibi standart i\u015flevler, her veri bilimcinin ara\u00e7 kutusunda bulunmal\u0131d\u0131r.<\/p>\n<p>Daha da \u00f6nemlisi, <code>tf.keras.callbacks.Callback<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreterek kendi \u00f6zel callback&#8217;lerinizi olu\u015fturma yetene\u011fi, TensorFlow&#8217;un esnekli\u011fini doruklara ta\u015f\u0131r. Bu sayede, projenizin benzersiz gereksinimlerine uygun, tamamen \u00f6zelle\u015ftirilmi\u015f davran\u0131\u015flar ekleyebilirsiniz. Callback&#8217;leri etkili bir \u015fekilde kullanarak, daha sa\u011flam, verimli ve genellenebilir derin \u00f6\u011frenme modelleri geli\u015ftirebilirsiniz. Bu rehber, callback&#8217;lerin temel prensiplerini anlaman\u0131za ve kendi projelerinizde bunlar\u0131 etkin bir \u015fekilde kullanmaya ba\u015flaman\u0131za yard\u0131mc\u0131 olmay\u0131 ama\u00e7lam\u0131\u015ft\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber\nTensorFlow ve Keras, derin \u00f6\u011frenme modellerini e\u011fitmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7eve sunar. Mod","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-38203","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber TensorFlow ve Keras, derin \u00f6\u011frenme modellerini e\u011fitmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7eve sunar. Mod\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-25T13:40:43+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-01-25T13:40:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\"},\"wordCount\":2316,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\",\"name\":\"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-25T13:40:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber","og_description":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber TensorFlow ve Keras, derin \u00f6\u011frenme modellerini e\u011fitmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7eve sunar. Mod","og_url":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-25T13:40:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber","datePublished":"2026-01-25T13:40:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/"},"wordCount":2316,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/","name":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-25T13:40:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-callbacks-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TensorFlow Callbacks: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38203"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38203\/revisions"}],"predecessor-version":[{"id":38204,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38203\/revisions\/38204"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}