![]() | ![]() | ![]() | ![]() |
Kurmak
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
Tanıtım
Bu kılavuz kapakları eğitim, değerlendirme ve öngörü (çıkarsama) kullanılarak modelleri dahili (örneğin eğitim ve doğrulama için API'ler Model.fit()
, Model.evaluate()
ve Model.predict()
).
Eğer yararlanarak ilgilenen varsa fit()
kendi eğitim aşaması fonksiyonunu belirtilirken, bkz neler olduğunu Özelleştirin fit()
kılavuz .
Eğer sıfırdan kendi eğitim ve değerlendirme döngüler yazılı olarak ilgilenen varsa, kılavuzuna bakın "sıfırdan bir eğitim döngü yazma" .
Genel olarak, ister yerleşik döngüler kullanıyor, ister kendi döngülerinizi yazıyor olun, model eğitimi ve değerlendirmesi, her tür Keras modelinde kesinlikle aynı şekilde çalışır - Sıralı modeller, İşlevsel API ile oluşturulmuş modeller ve aracılığıyla sıfırdan yazılmış modeller. model alt sınıflaması
Bu kılavuz bizim kaplıdır dağıtılan eğitim kapsamaz çoklu GPU ve dağıtılan eğitim rehberi .
API'ye genel bakış: ilk uçtan uca örnek
Veri geçerken (veri hafızasına küçük ve uyan ise) veya modelin döngüler eğitim yerleşik, ya NumPy diziler kullanmalıdır tf.data Dataset
nesneleri. Sonraki birkaç paragrafta, optimize edicilerin, kayıpların ve ölçümlerin nasıl kullanılacağını göstermek için MNIST veri kümesini NumPy dizileri olarak kullanacağız.
Aşağıdaki modeli ele alalım (burada, İşlevsel API ile inşa ediyoruz, ancak bu, Sıralı bir model veya alt sınıflı bir model de olabilir):
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
x = layers.Dense(64, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
Tipik uçtan uca iş akışı aşağıdakilerden oluşur:
- Eğitim
- Orijinal eğitim verilerinden oluşturulan bir bekleme setinde doğrulama
- Test verileri üzerinde değerlendirme
Bu örnek için MNIST verilerini kullanacağız.
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Preprocess the data (these are NumPy arrays)
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
y_train = y_train.astype("float32")
y_test = y_test.astype("float32")
# Reserve 10,000 samples for validation
x_val = x_train[-10000:]
y_val = y_train[-10000:]
x_train = x_train[:-10000]
y_train = y_train[:-10000]
Eğitim yapılandırmasını belirliyoruz (optimizer, kayıp, metrikler):
model.compile(
optimizer=keras.optimizers.RMSprop(), # Optimizer
# Loss function to minimize
loss=keras.losses.SparseCategoricalCrossentropy(),
# List of metrics to monitor
metrics=[keras.metrics.SparseCategoricalAccuracy()],
)
Biz diyoruz fit()
boyutu "toplu" içine veri dilimleme modeli eğitecek, batch_size
ve sürekli belirli bir sayıda için tüm veri kümesini yineleme epochs
.
print("Fit model on training data")
history = model.fit(
x_train,
y_train,
batch_size=64,
epochs=2,
# We pass some validation for
# monitoring validation loss and metrics
# at the end of each epoch
validation_data=(x_val, y_val),
)
Fit model on training data Epoch 1/2 782/782 [==============================] - 3s 3ms/step - loss: 0.3387 - sparse_categorical_accuracy: 0.9050 - val_loss: 0.1957 - val_sparse_categorical_accuracy: 0.9426 Epoch 2/2 782/782 [==============================] - 2s 3ms/step - loss: 0.1543 - sparse_categorical_accuracy: 0.9548 - val_loss: 0.1425 - val_sparse_categorical_accuracy: 0.9593
Döndürülen history
nesne eğitim sırasında kayıp değerlerinin ve metrik değerlerin bir rekoru kırdı:
history.history
{'loss': [0.3386789858341217, 0.1543138176202774], 'sparse_categorical_accuracy': [0.9050400257110596, 0.9548400044441223], 'val_loss': [0.19569723308086395, 0.14253544807434082], 'val_sparse_categorical_accuracy': [0.9426000118255615, 0.9592999815940857]}
Biz aracılığıyla deney verilerine modelini değerlendirmek evaluate()
:
# Evaluate the model on the test data using `evaluate`
print("Evaluate on test data")
results = model.evaluate(x_test, y_test, batch_size=128)
print("test loss, test acc:", results)
# Generate predictions (probabilities -- the output of the last layer)
# on new data using `predict`
print("Generate predictions for 3 samples")
predictions = model.predict(x_test[:3])
print("predictions shape:", predictions.shape)
Evaluate on test data 79/79 [==============================] - 0s 2ms/step - loss: 0.1414 - sparse_categorical_accuracy: 0.9569 test loss, test acc: [0.14140386879444122, 0.9569000005722046] Generate predictions for 3 samples predictions shape: (3, 10)
Şimdi, bu iş akışının her bir parçasını ayrıntılı olarak inceleyelim.
compile()
metodu: bir kayıp, metrikleri belirten ve bir iyileştirici
Bir model eğitmek için fit()
, bir kayıp fonksiyonu, bir iyimserlik ve monitöre isteğe bağlı olarak bazı ölçümleri belirtmek gerekir.
Sen argümanları olarak modele bu geçmesine compile()
yöntemiyle:
model.compile(
optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=[keras.metrics.SparseCategoricalAccuracy()],
)
metrics
argüman listesi olmamalıdır - modeliniz ölçütlerinin herhangi bir sayı olabilir.
Modelinizin birden fazla çıktısı varsa, her çıktı için farklı kayıplar ve metrikler belirtebilir ve her bir çıktının modelin toplam kaybına katkısını modüle edebilirsiniz. Sen çok girişli çok çıkışlı modeller bölümüne geçerek verilerdeki bu konuda daha fazla ayrıntı bulabilirsiniz.
Varsayılan ayarlardan memnunsanız, çoğu durumda optimize edici, kayıp ve ölçümlerin bir kısayol olarak dize tanımlayıcıları aracılığıyla belirtilebileceğini unutmayın:
model.compile(
optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["sparse_categorical_accuracy"],
)
Daha sonra tekrar kullanmak için model tanımımızı ve derleme adımımızı fonksiyonlara koyalım; onları bu kılavuzda farklı örneklerde birkaç kez arayacağız.
def get_uncompiled_model():
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
x = layers.Dense(64, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
return model
def get_compiled_model():
model = get_uncompiled_model()
model.compile(
optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["sparse_categorical_accuracy"],
)
return model
Birçok yerleşik optimize edici, kayıp ve ölçüm mevcuttur
Genel olarak, kendi kayıplarınızı, ölçümlerinizi veya optimize edicilerinizi sıfırdan oluşturmanız gerekmeyecek çünkü ihtiyacınız olan şey muhtemelen zaten Keras API'sinin bir parçası olacaktır:
Optimize ediciler:
-
SGD()
(veya hızlanmadan) -
RMSprop()
-
Adam()
- vb.
kayıplar:
-
MeanSquaredError()
-
KLDivergence()
-
CosineSimilarity()
- vb.
Metrikler:
-
AUC()
-
Precision()
-
Recall()
- vb.
Özel kayıplar
Özel bir kayıp oluşturmanız gerekiyorsa, Keras bunu yapmanın iki yolunu sunar.
Birinci yöntem, giriş kabul eden bir işlevi oluşturma içerir y_true
ve y_pred
. Aşağıdaki örnek, gerçek veriler ile tahminler arasındaki ortalama karesel hatayı hesaplayan bir kayıp fonksiyonunu göstermektedir:
def custom_mean_squared_error(y_true, y_pred):
return tf.math.reduce_mean(tf.square(y_true - y_pred))
model = get_uncompiled_model()
model.compile(optimizer=keras.optimizers.Adam(), loss=custom_mean_squared_error)
# We need to one-hot encode the labels to use MSE
y_train_one_hot = tf.one_hot(y_train, depth=10)
model.fit(x_train, y_train_one_hot, batch_size=64, epochs=1)
782/782 [==============================] - 2s 2ms/step - loss: 0.0162 <keras.callbacks.History at 0x7ff8881ba250>
Eğer yanında parametrelerinde götüren bir kayıp fonksiyonunu gerekiyorsa y_true
ve y_pred
, sen alt sınıf tf.keras.losses.Loss
sınıf ve aşağıdaki iki yöntem uygulamak:
-
__init__(self)
: parametrelerini kabul senin kaybı fonksiyonunun çağrı sırasında geçmek -
call(self, y_true, y_pred)
: Modelin kaybını hesaplamak için hedefler (y_true) ve model tahminler (y_pred) kullanın
Diyelim ki ortalama kare hatası kullanmak istiyorsunuz, ancak 0,5'ten uzak tahmin değerlerini teşvikten arındıracak ek bir terimle (kategorik hedeflerin tek sıcak kodlu olduğunu ve 0 ile 1 arasında değerler aldığını varsayıyoruz). Bu, modelin fazla kendinden emin olmaması için bir teşvik yaratır, bu da fazla takmayı azaltmaya yardımcı olabilir (denemeden işe yarayıp yaramadığını bilemeyiz!).
Bunu nasıl yapacağınız aşağıda açıklanmıştır:
class CustomMSE(keras.losses.Loss):
def __init__(self, regularization_factor=0.1, name="custom_mse"):
super().__init__(name=name)
self.regularization_factor = regularization_factor
def call(self, y_true, y_pred):
mse = tf.math.reduce_mean(tf.square(y_true - y_pred))
reg = tf.math.reduce_mean(tf.square(0.5 - y_pred))
return mse + reg * self.regularization_factor
model = get_uncompiled_model()
model.compile(optimizer=keras.optimizers.Adam(), loss=CustomMSE())
y_train_one_hot = tf.one_hot(y_train, depth=10)
model.fit(x_train, y_train_one_hot, batch_size=64, epochs=1)
782/782 [==============================] - 2s 2ms/step - loss: 0.0388 <keras.callbacks.History at 0x7ff8882130d0>
Özel metrikler
API parçası olmayan bir metrik gerekiyorsa, kolayca sınıflara göre özel metrik oluşturabilirsiniz tf.keras.metrics.Metric
sınıfını. 4 yöntem uygulamanız gerekecek:
-
__init__(self)
, hangi size metrik için durum değişkenleri yaratacaktır. -
update_state(self, y_true, y_pred, sample_weight=None)
hedefler y_true ve model tahminler durum değişkenlerini güncellemek için y_pred kullanır. -
result(self)
kesin sonuçları hesaplamak için durum değişkenlerini kullanır. -
reset_state(self)
metrik durumunu reinitializes.
Devlet güncelleme ve sonuçları hesaplama ayrı (tutulur update_state()
ve result()
bazı durumlarda, sonuçlar hesaplama çok pahalı olabilir çünkü sırasıyla) ve sadece periyodik yapılırdı.
İşte nasıl uygulanacağını gösteren basit bir örnek CategoricalTruePositives
metrik birçok örnekler doğru belirli bir sınıfa ait olarak sınıflandırıldı nasıl sayar:
class CategoricalTruePositives(keras.metrics.Metric):
def __init__(self, name="categorical_true_positives", **kwargs):
super(CategoricalTruePositives, self).__init__(name=name, **kwargs)
self.true_positives = self.add_weight(name="ctp", initializer="zeros")
def update_state(self, y_true, y_pred, sample_weight=None):
y_pred = tf.reshape(tf.argmax(y_pred, axis=1), shape=(-1, 1))
values = tf.cast(y_true, "int32") == tf.cast(y_pred, "int32")
values = tf.cast(values, "float32")
if sample_weight is not None:
sample_weight = tf.cast(sample_weight, "float32")
values = tf.multiply(values, sample_weight)
self.true_positives.assign_add(tf.reduce_sum(values))
def result(self):
return self.true_positives
def reset_state(self):
# The state of the metric will be reset at the start of each epoch.
self.true_positives.assign(0.0)
model = get_uncompiled_model()
model.compile(
optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=[CategoricalTruePositives()],
)
model.fit(x_train, y_train, batch_size=64, epochs=3)
Epoch 1/3 782/782 [==============================] - 2s 3ms/step - loss: 0.3404 - categorical_true_positives: 45217.0000 Epoch 2/3 782/782 [==============================] - 2s 3ms/step - loss: 0.1588 - categorical_true_positives: 47606.0000 Epoch 3/3 782/782 [==============================] - 2s 3ms/step - loss: 0.1168 - categorical_true_positives: 48278.0000 <keras.callbacks.History at 0x7ff8880a3610>
Standart imzaya uymayan kayıpları ve ölçümleri işleme
Kayıpların ve metrik ezici çoğunluğu elde hesaplanabilir y_true
ve y_pred
nerede, y_pred
ama hepsi değil - Modelinizin bir çıkıştır. Örneğin, bir düzenlileştirme kaybı yalnızca bir katmanın etkinleştirilmesini gerektirebilir (bu durumda hedef yoktur) ve bu etkinleştirme bir model çıktısı olmayabilir.
Bu gibi durumlarda, Arayabileceğin self.add_loss(loss_value)
özel bir tabakanın çağrı yöntemiyle içinden. Bu şekilde eklenen Zararlar eğitim sırasında "ana" kayıp eklenebilmeniz (geçirilen birine compile()
). İşte aktivite düzenleme ekleyen basit bir örnek (aktivite düzenlemesinin tüm Keras katmanlarında yerleşik olduğunu unutmayın - bu katman yalnızca somut bir örnek sağlamak içindir):
class ActivityRegularizationLayer(layers.Layer):
def call(self, inputs):
self.add_loss(tf.reduce_sum(inputs) * 0.1)
return inputs # Pass-through layer.
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
# Insert activity regularization as a layer
x = ActivityRegularizationLayer()(x)
x = layers.Dense(64, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(
optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
)
# The displayed loss will be much higher than before
# due to the regularization component.
model.fit(x_train, y_train, batch_size=64, epochs=1)
782/782 [==============================] - 2s 2ms/step - loss: 2.4545 <keras.callbacks.History at 0x7ff87c53f310>
Sen kullanarak, metrik değerleri giriş için aynı şeyi yapabilirsiniz add_metric()
:
class MetricLoggingLayer(layers.Layer):
def call(self, inputs):
# The `aggregation` argument defines
# how to aggregate the per-batch values
# over each epoch:
# in this case we simply average them.
self.add_metric(
keras.backend.std(inputs), name="std_of_activation", aggregation="mean"
)
return inputs # Pass-through layer.
inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
# Insert std logging as a layer.
x = MetricLoggingLayer()(x)
x = layers.Dense(64, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, name="predictions")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(
optimizer=keras.optimizers.RMSprop(learning_rate=1e-3),
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
)
model.fit(x_train, y_train, batch_size=64, epochs=1)
782/782 [==============================] - 2s 2ms/step - loss: 0.3461 - std_of_activation: 0.9929 <keras.callbacks.History at 0x7ff87c3d5bd0>
Gelen Fonksiyonel API , ayrıca çağırabilirsiniz model.add_loss(loss_tensor)
veya model.add_metric(metric_tensor, name, aggregation)
.
İşte basit bir örnek:
inputs = keras.Input(shape=(784,), name="digits")
x1 = layers.Dense(64, activation="relu", name="dense_1")(inputs)
x2 = layers.Dense(64, activation="relu", name="dense_2")(x1)
outputs = layers.Dense(10, name="predictions")(x2)
model = keras.Model(inputs=inputs, outputs=outputs)
model.add_loss(tf.reduce_sum(x1) * 0.1)
model.add_metric(keras.backend.std(x1), name="std_of_activation", aggregation="mean")
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
)
model.fit(x_train, y_train, batch_size=64, epochs=1)
782/782 [==============================] - 2s 3ms/step - loss: 2.4647 - std_of_activation: 0.0017 <keras.callbacks.History at 0x7ff87c216f90>
Eğer aracılığıyla kayıpları geçtiğinde Not o add_loss()
, bu çağrı mümkün hale compile()
model zaten en aza indirmek için bir kayıp olduğundan, bir kayıp fonksiyonu olmadan.
Aşağıdaki düşünün LogisticEndpoint
katmanı: Bu girişler hedefleri ve logits olarak alır ve üzerinden bir crossentropy kaybını izler add_loss()
. Ayrıca yoluyla sınıflandırma doğruluğunu izler add_metric()
.
class LogisticEndpoint(keras.layers.Layer):
def __init__(self, name=None):
super(LogisticEndpoint, self).__init__(name=name)
self.loss_fn = keras.losses.BinaryCrossentropy(from_logits=True)
self.accuracy_fn = keras.metrics.BinaryAccuracy()
def call(self, targets, logits, sample_weights=None):
# Compute the training-time loss value and add it
# to the layer using `self.add_loss()`.
loss = self.loss_fn(targets, logits, sample_weights)
self.add_loss(loss)
# Log accuracy as a metric and add it
# to the layer using `self.add_metric()`.
acc = self.accuracy_fn(targets, logits, sample_weights)
self.add_metric(acc, name="accuracy")
# Return the inference-time prediction tensor (for `.predict()`).
return tf.nn.softmax(logits)
Bir olmadan derlenmiş iki girişlerin (girdi verileri ve hedefleri), bir modelde kullanabilirsiniz loss
böyle argüman:
import numpy as np
inputs = keras.Input(shape=(3,), name="inputs")
targets = keras.Input(shape=(10,), name="targets")
logits = keras.layers.Dense(10)(inputs)
predictions = LogisticEndpoint(name="predictions")(logits, targets)
model = keras.Model(inputs=[inputs, targets], outputs=predictions)
model.compile(optimizer="adam") # No loss argument!
data = {
"inputs": np.random.random((3, 3)),
"targets": np.random.random((3, 10)),
}
model.fit(data)
1/1 [==============================] - 0s 414ms/step - loss: 0.9889 - binary_accuracy: 0.0000e+00 <keras.callbacks.History at 0x7ff87c0848d0>
Çok girişli modelleri eğitme hakkında daha fazla bilgi için bölüm çoklu giriş, çoklu çıkış modellerine veri geçirilmesi bkz.
Bir doğrulama bekletme setini otomatik olarak ayırma
Gördüğünü birinci uç uca örnekte, kullanılan validation_data
NumPy diziler bir demet için bağımsız değişkeni (x_val, y_val)
her dönemin sonunda bir doğrulama kaybı ve doğrulama ölçümlerini değerlendirilmesi için modele.
Burada başka bir seçenek: argüman validation_split
verir doğrulama için eğitim verilerinin otomatik olarak yedek parça için. Bağımsız değişken değeri 0, daha yüksek bir sayı olarak ayarlanır ve Örneğin 1 'den daha düşük olmalıdır, böylece doğrulama için rezerve edilecek veri kısmını temsil validation_split=0.2
araçları "doğrulama için veri% 20", ve validation_split=0.6
araçları "doğrulama için veri% 60".
Doğrulama hesaplanır yolu ile alınan dizilerin son x% numune alarak bir fit()
herhangi bir karma önce çağrı.
Not yalnızca kullanabileceği validation_split
zaman NumPy verilerle eğitimi.
model = get_compiled_model()
model.fit(x_train, y_train, batch_size=64, validation_split=0.2, epochs=1)
625/625 [==============================] - 2s 3ms/step - loss: 0.3682 - sparse_categorical_accuracy: 0.8957 - val_loss: 0.2276 - val_sparse_categorical_accuracy: 0.9301 <keras.callbacks.History at 0x7ff81c680890>
tf.data Veri Kümelerinden eğitim ve değerlendirme
Son birkaç paragraf olarak, kayıpları, ölçümleri ve optimize nasıl işleneceğini gördüm ve nasıl kullanılacağı gördüğüm validation_data
ve validation_split
içinde argümanları fit()
, veri NumPy diziler olarak geçirildiğinde.
Verileriniz şeklinde giriyor şimdi durumda bir göz atalım tf.data.Dataset
nesne.
tf.data
API hızlı ve ölçeklenebilir bir şekilde yaparız yükleme için TensorFlow 2.0 kamu ve önişleme veri kümesidir.
Oluşturma konusunda tam bir kılavuz için Datasets
, bkz tf.data belgelerine .
Bir geçebilir Dataset
yöntemleri doğrudan örneğini fit()
, evaluate()
ve predict()
:
model = get_compiled_model()
# First, let's create a training Dataset instance.
# For the sake of our example, we'll use the same MNIST data as before.
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
# Shuffle and slice the dataset.
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
# Now we get a test dataset.
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_dataset = test_dataset.batch(64)
# Since the dataset already takes care of batching,
# we don't pass a `batch_size` argument.
model.fit(train_dataset, epochs=3)
# You can also evaluate or predict on a dataset.
print("Evaluate")
result = model.evaluate(test_dataset)
dict(zip(model.metrics_names, result))
Epoch 1/3 782/782 [==============================] - 2s 3ms/step - loss: 0.3372 - sparse_categorical_accuracy: 0.9047 Epoch 2/3 782/782 [==============================] - 2s 3ms/step - loss: 0.1596 - sparse_categorical_accuracy: 0.9523 Epoch 3/3 782/782 [==============================] - 2s 3ms/step - loss: 0.1171 - sparse_categorical_accuracy: 0.9655 Evaluate 157/157 [==============================] - 0s 2ms/step - loss: 0.1211 - sparse_categorical_accuracy: 0.9648 {'loss': 0.12107347697019577, 'sparse_categorical_accuracy': 0.9648000001907349}
Veri Kümesinin her dönemin sonunda sıfırlandığını ve böylece bir sonraki dönemde yeniden kullanılabileceğini unutmayın.
Bu DataSet gruplar belirli sayıda yalnızca eğitim çalıştırmak istiyorsanız, sen geçebilir steps_per_epoch
birçok eğitim sonraki dönemin geçmeden önce bu DataSet kullanarak çalışmalıdır modeli adımları nasıl belirtir argüman.
Bunu yaparsanız, veri kümesi her dönemin sonunda sıfırlanmaz, bunun yerine sonraki partileri çizmeye devam ederiz. Veri kümesi sonunda veri tükenecektir (sonsuz döngülü bir veri kümesi olmadığı sürece).
model = get_compiled_model()
# Prepare the training dataset
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
# Only use the 100 batches per epoch (that's 64 * 100 samples)
model.fit(train_dataset, epochs=3, steps_per_epoch=100)
Epoch 1/3 100/100 [==============================] - 1s 3ms/step - loss: 0.7937 - sparse_categorical_accuracy: 0.7894 Epoch 2/3 100/100 [==============================] - 0s 3ms/step - loss: 0.3699 - sparse_categorical_accuracy: 0.8938 Epoch 3/3 100/100 [==============================] - 0s 3ms/step - loss: 0.3155 - sparse_categorical_accuracy: 0.9061 <keras.callbacks.History at 0x7ff81c587e90>
Doğrulama veri kümesi kullanma
Bir geçebilir Dataset
olarak örneğini validation_data
içinde argüman fit()
:
model = get_compiled_model()
# Prepare the training dataset
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
# Prepare the validation dataset
val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_dataset = val_dataset.batch(64)
model.fit(train_dataset, epochs=1, validation_data=val_dataset)
782/782 [==============================] - 3s 3ms/step - loss: 0.3380 - sparse_categorical_accuracy: 0.9035 - val_loss: 0.2015 - val_sparse_categorical_accuracy: 0.9405 <keras.callbacks.History at 0x7ff81c30e450>
Her dönemin sonunda model, doğrulama veri kümesi üzerinde yinelenecek ve doğrulama kaybı ve doğrulama ölçütlerini hesaplayacaktır.
Yalnızca bu veri kümesi dan partileri belirli sayıda doğrulama çalıştırmak istiyorsanız, sen geçebilir validation_steps
birçok doğrulama doğrulama kesintiye ve bir sonraki dönemin geçmeden önce doğrulama veri kümesi ile çalışmalıdır modeli adımları nasıl belirtir argüman:
model = get_compiled_model()
# Prepare the training dataset
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
# Prepare the validation dataset
val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_dataset = val_dataset.batch(64)
model.fit(
train_dataset,
epochs=1,
# Only run validation using the first 10 batches of the dataset
# using the `validation_steps` argument
validation_data=val_dataset,
validation_steps=10,
)
782/782 [==============================] - 3s 3ms/step - loss: 0.3369 - sparse_categorical_accuracy: 0.9036 - val_loss: 0.2953 - val_sparse_categorical_accuracy: 0.9187 <keras.callbacks.History at 0x7ff81c30e310>
Doğrulama veri kümesinin her kullanımdan sonra sıfırlanacağını unutmayın (böylece çağdan çağa her zaman aynı örnekler üzerinde değerlendirme yapacaksınız).
Bağımsız değişken validation_split
(eğitim verileri bir uzatma grubunun üretilmesi) gelen eğitim sırasında desteklenmez Dataset
bu özelliği ile, genel olarak mümkün değildir endeksi yeteneği veri setlerinin örnekleri gerektirdiği için, nesneler Dataset
API.
Desteklenen diğer giriş biçimleri
NumPy diziler, istekli tensörlerin ve TensorFlow yanında Datasets
, bu Pandalar dataframes kullanarak Keras modeli eğitmek mümkündür, ya da Python jeneratörlerden verilerin ve etiketlerin verim toplu halde.
Özellikle, keras.utils.Sequence
sınıf teklifler basit arayüz-çoklu işlem farkında ve karıştırılan olabilir edilir Python veri jeneratörleri inşa etmek.
Genel olarak şunları kullanmanızı öneririz:
- Verileriniz küçükse ve belleğe sığıyorsa NumPy giriş verileri
-
Dataset
Eğer büyük veri kümelerini varsa ve dağıtılan eğitim yapmak gerekirse nesneleri -
Sequence
size büyük veri kümelerini varsa ve (eğer veri yükleme veya ön düzenleme için harici kütüphaneleri itimat eğer örneğin) TensorFlow içinde yapılamaz özel Python tarafın çalışmasında çok yapmak gerekirse itiraz ediyor.
Bir kullanma keras.utils.Sequence
girdi olarak nesne
keras.utils.Sequence
iki önemli özelliklere sahip bir Python jeneratör elde etmek alt sınıf bir yardımcı programdır:
- Çoklu işlem ile iyi çalışır.
- Bu karıştırılan olabilir (örn geçerken
shuffle=True
içindefit()
).
Bir Sequence
iki yöntem uygulamak gerekir:
-
__getitem__
-
__len__
Yöntem __getitem__
tam bir toplu döndürmelidir. Eğer dönemini arasında veri kümesini değiştirmek isterseniz, uygulayabilir on_epoch_end
.
İşte hızlı bir örnek:
from skimage.io import imread
from skimage.transform import resize
import numpy as np
# Here, `filenames` is list of path to the images
# and `labels` are the associated labels.
class CIFAR10Sequence(Sequence):
def __init__(self, filenames, labels, batch_size):
self.filenames, self.labels = filenames, labels
self.batch_size = batch_size
def __len__(self):
return int(np.ceil(len(self.filenames) / float(self.batch_size)))
def __getitem__(self, idx):
batch_x = self.filenames[idx * self.batch_size:(idx + 1) * self.batch_size]
batch_y = self.labels[idx * self.batch_size:(idx + 1) * self.batch_size]
return np.array([
resize(imread(filename), (200, 200))
for filename in batch_x]), np.array(batch_y)
sequence = CIFAR10Sequence(filenames, labels, batch_size)
model.fit(sequence, epochs=10)
Numune ağırlığını ve sınıf ağırlığını kullanma
Varsayılan ayarlarla, bir örneğin ağırlığına, veri kümesindeki frekansına göre karar verilir. Örnekleme frekansından bağımsız olarak verileri ağırlıklandırmanın iki yöntemi vardır:
- sınıf ağırlıkları
- Örnek ağırlıklar
sınıf ağırlıkları
Bu bir sözlük ileterek ayarlanır class_weight
için argüman Model.fit()
. Bu sözlük, sınıf indekslerini bu sınıfa ait örnekler için kullanılması gereken ağırlıkla eşler.
Bu, yeniden örnekleme yapmadan sınıfları dengelemek veya belirli bir sınıfa daha fazla önem veren bir modeli eğitmek için kullanılabilir.
Sınıf "0" Verilerinizde sınıfında "1" olarak temsil yarısı ise Örneğin, şunu kullanabilirsiniz Model.fit(..., class_weight={0: 1., 1: 0.5})
.
Sınıf #5'in (MNIST veri kümesindeki "5" rakamıdır) doğru sınıflandırmasına daha fazla önem vermek için sınıf ağırlıklarını veya örnek ağırlıkları kullandığımız bir NumPy örneği.
import numpy as np
class_weight = {
0: 1.0,
1: 1.0,
2: 1.0,
3: 1.0,
4: 1.0,
# Set weight "2" for class "5",
# making this class 2x more important
5: 2.0,
6: 1.0,
7: 1.0,
8: 1.0,
9: 1.0,
}
print("Fit with class weight")
model = get_compiled_model()
model.fit(x_train, y_train, class_weight=class_weight, batch_size=64, epochs=1)
Fit with class weight 782/782 [==============================] - 2s 3ms/step - loss: 0.3708 - sparse_categorical_accuracy: 0.9032 <keras.callbacks.History at 0x7ff80c7ddd10>
Örnek ağırlıklar
İnce taneli kontrol için veya bir sınıflandırıcı oluşturmuyorsanız, "örnek ağırlıkları" kullanabilirsiniz.
- NumPy verilerinden eğitim Zaman: Pass
sample_weight
için argümanModel.fit()
. - Dan eğitim yaparken
tf.data
veya Yineleyici başka tür: Verim(input_batch, label_batch, sample_weight_batch)
demetler.
"Numune ağırlıkları" dizisi, toplam kaybın hesaplanmasında bir partideki her numunenin ne kadar ağırlığa sahip olması gerektiğini belirten bir sayı dizisidir. Dengesiz sınıflandırma problemlerinde yaygın olarak kullanılır (nadir görülen sınıflara daha fazla ağırlık verilmesi fikri).
Kullanılan ağırlıklar ve sıfır olduğunda, dizi kaybı işlevi (tamamen kaybına yol bazı numunelerin katkı atılması) için bir maske olarak kullanılabilir.
sample_weight = np.ones(shape=(len(y_train),))
sample_weight[y_train == 5] = 2.0
print("Fit with sample weight")
model = get_compiled_model()
model.fit(x_train, y_train, sample_weight=sample_weight, batch_size=64, epochs=1)
Fit with sample weight 782/782 [==============================] - 2s 3ms/step - loss: 0.3806 - sparse_categorical_accuracy: 0.9000 <keras.callbacks.History at 0x7ff80c650350>
İşte eşleşen var Dataset
örneği:
sample_weight = np.ones(shape=(len(y_train),))
sample_weight[y_train == 5] = 2.0
# Create a Dataset that includes sample weights
# (3rd element in the return tuple).
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train, sample_weight))
# Shuffle and slice the dataset.
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
model = get_compiled_model()
model.fit(train_dataset, epochs=1)
782/782 [==============================] - 3s 3ms/step - loss: 0.3588 - sparse_categorical_accuracy: 0.9070 <keras.callbacks.History at 0x7ff80c51cb50>
Verileri çok girişli, çok çıkışlı modellere geçirme
Önceki örneklerde, tek bir giriş (şekilli bir tensör bir modeli dikkate edildi (764,)
) ve tek bir çıkış (şekilli bir tahmini tensör (10,)
). Peki ya birden fazla girdisi veya çıktısı olan modeller?
Şeklinde bir görüntü girişi, aşağıdaki model göz önünde (32, 32, 3)
(diğer bir deyişle en (height, width, channels)
) ve şekilli bir zaman serisi, giriş (None, 10)
(en olduğu (timesteps, features)
). Bizim modeli Bu girişlerin kombinasyonundan hesaplanır iki çıkışa sahip olacaktır: bir "puan" (şekil (1,)
) ve (şekil beş sınıfları üzerinde bir olasılık dağılımı (5,)
).
image_input = keras.Input(shape=(32, 32, 3), name="img_input")
timeseries_input = keras.Input(shape=(None, 10), name="ts_input")
x1 = layers.Conv2D(3, 3)(image_input)
x1 = layers.GlobalMaxPooling2D()(x1)
x2 = layers.Conv1D(3, 3)(timeseries_input)
x2 = layers.GlobalMaxPooling1D()(x2)
x = layers.concatenate([x1, x2])
score_output = layers.Dense(1, name="score_output")(x)
class_output = layers.Dense(5, name="class_output")(x)
model = keras.Model(
inputs=[image_input, timeseries_input], outputs=[score_output, class_output]
)
Burada ne yaptığımızı açıkça görebilmeniz için bu modeli çizelim (çizimde gösterilen şekillerin numune başına şekiller yerine toplu şekiller olduğuna dikkat edin).
keras.utils.plot_model(model, "multi_input_and_output_model.png", show_shapes=True)
Derleme zamanında, kayıp fonksiyonlarını bir liste halinde ileterek farklı çıktılara farklı kayıplar belirtebiliriz:
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss=[keras.losses.MeanSquaredError(), keras.losses.CategoricalCrossentropy()],
)
Modele sadece tek bir kayıp fonksiyonu iletseydik, her çıktıya aynı kayıp fonksiyonu uygulanırdı (ki bu burada uygun değildir).
Aynı şekilde metrikler için:
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss=[keras.losses.MeanSquaredError(), keras.losses.CategoricalCrossentropy()],
metrics=[
[
keras.metrics.MeanAbsolutePercentageError(),
keras.metrics.MeanAbsoluteError(),
],
[keras.metrics.CategoricalAccuracy()],
],
)
Çıktı katmanlarımıza isimler verdiğimiz için, çıktı başına kayıpları ve ölçümleri bir dict ile de belirtebiliriz:
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss={
"score_output": keras.losses.MeanSquaredError(),
"class_output": keras.losses.CategoricalCrossentropy(),
},
metrics={
"score_output": [
keras.metrics.MeanAbsolutePercentageError(),
keras.metrics.MeanAbsoluteError(),
],
"class_output": [keras.metrics.CategoricalAccuracy()],
},
)
2'den fazla çıktınız varsa, açık adların ve diktelerin kullanılmasını öneririz.
Bu kullanarak, (örneğin, bir sınıf kaybının önemini 2 katına vererek, ayrıcalık bizim örneğimizde "skor" kayıp isteyebilirsiniz) farklı çıkış özgü kayıpları farklı ağırlıklar vermek mümkündür loss_weights
argüman:
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss={
"score_output": keras.losses.MeanSquaredError(),
"class_output": keras.losses.CategoricalCrossentropy(),
},
metrics={
"score_output": [
keras.metrics.MeanAbsolutePercentageError(),
keras.metrics.MeanAbsoluteError(),
],
"class_output": [keras.metrics.CategoricalAccuracy()],
},
loss_weights={"score_output": 2.0, "class_output": 1.0},
)
Bu çıktılar tahmin amaçlıysa ancak eğitim amaçlı değilse, belirli çıktılar için bir kayıp hesaplamamayı da seçebilirsiniz:
# List loss version
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss=[None, keras.losses.CategoricalCrossentropy()],
)
# Or dict loss version
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss={"class_output": keras.losses.CategoricalCrossentropy()},
)
Çoklu giriş ya da çoklu çıkış modeline veri geçen fit()
derleme bir kayıp fonksiyonunu belirlemek gibi benzer bir şekilde çalışır: 1 ile NumPy dizilerin listelerini (geçebilir: 1 eşleme bir kayıp fonksiyonunu alınan çıktılara ) ya da NumPy diziler çıkış adları haritalama dicts.
model.compile(
optimizer=keras.optimizers.RMSprop(1e-3),
loss=[keras.losses.MeanSquaredError(), keras.losses.CategoricalCrossentropy()],
)
# Generate dummy NumPy data
img_data = np.random.random_sample(size=(100, 32, 32, 3))
ts_data = np.random.random_sample(size=(100, 20, 10))
score_targets = np.random.random_sample(size=(100, 1))
class_targets = np.random.random_sample(size=(100, 5))
# Fit on lists
model.fit([img_data, ts_data], [score_targets, class_targets], batch_size=32, epochs=1)
# Alternatively, fit on dicts
model.fit(
{"img_input": img_data, "ts_input": ts_data},
{"score_output": score_targets, "class_output": class_targets},
batch_size=32,
epochs=1,
)
4/4 [==============================] - 2s 9ms/step - loss: 5.6917 - score_output_loss: 0.1031 - class_output_loss: 5.5886 4/4 [==============================] - 0s 6ms/step - loss: 4.4108 - score_output_loss: 0.0999 - class_output_loss: 4.3109 <keras.callbacks.History at 0x7ff80c3b4110>
İşte Dataset
kullanım durumu: Biz NumPy diziler için ne yaptığını, benzer şekilde Dataset
dicts bir başlığın dönmelidir.
train_dataset = tf.data.Dataset.from_tensor_slices(
(
{"img_input": img_data, "ts_input": ts_data},
{"score_output": score_targets, "class_output": class_targets},
)
)
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
model.fit(train_dataset, epochs=1)
2/2 [==============================] - 0s 21ms/step - loss: 4.2451 - score_output_loss: 0.0993 - class_output_loss: 4.1458 <keras.callbacks.History at 0x7ff80c3ed450>
Geri aramaları kullanma
Keras'taki geri aramalar, eğitim sırasında farklı noktalarda çağrılan nesnelerdir (bir çağın başlangıcında, bir yığının sonunda, bir çağın sonunda, vb.). Aşağıdakiler gibi belirli davranışları uygulamak için kullanılabilirler:
- Eğitim sırasında farklı noktalarda doğrulama yapmak (yerleşik dönem başına doğrulamanın ötesinde)
- Modeli düzenli aralıklarla veya belirli bir doğruluk eşiğini aştığında kontrol etme
- Eğitim plato gibi göründüğünde modelin öğrenme oranını değiştirme
- Antrenman plato yapıyor gibi göründüğünde üst katmanların ince ayarını yapmak
- Eğitim bittiğinde veya belirli bir performans eşiği aşıldığında e-posta veya anlık mesaj bildirimleri gönderme
- Vb.
Callbacks geçirme ifadenize liste olarak geçirilebilir fit()
:
model = get_compiled_model()
callbacks = [
keras.callbacks.EarlyStopping(
# Stop training when `val_loss` is no longer improving
monitor="val_loss",
# "no longer improving" being defined as "no better than 1e-2 less"
min_delta=1e-2,
# "no longer improving" being further defined as "for at least 2 epochs"
patience=2,
verbose=1,
)
]
model.fit(
x_train,
y_train,
epochs=20,
batch_size=64,
callbacks=callbacks,
validation_split=0.2,
)
Epoch 1/20 625/625 [==============================] - 2s 3ms/step - loss: 0.3725 - sparse_categorical_accuracy: 0.8939 - val_loss: 0.2314 - val_sparse_categorical_accuracy: 0.9321 Epoch 2/20 625/625 [==============================] - 2s 3ms/step - loss: 0.1805 - sparse_categorical_accuracy: 0.9471 - val_loss: 0.2012 - val_sparse_categorical_accuracy: 0.9379 Epoch 3/20 625/625 [==============================] - 2s 3ms/step - loss: 0.1346 - sparse_categorical_accuracy: 0.9603 - val_loss: 0.1651 - val_sparse_categorical_accuracy: 0.9505 Epoch 4/20 625/625 [==============================] - 2s 3ms/step - loss: 0.1065 - sparse_categorical_accuracy: 0.9684 - val_loss: 0.1510 - val_sparse_categorical_accuracy: 0.9571 Epoch 5/20 625/625 [==============================] - 2s 3ms/step - loss: 0.0884 - sparse_categorical_accuracy: 0.9734 - val_loss: 0.1505 - val_sparse_categorical_accuracy: 0.9538 Epoch 6/20 625/625 [==============================] - 2s 3ms/step - loss: 0.0746 - sparse_categorical_accuracy: 0.9778 - val_loss: 0.1508 - val_sparse_categorical_accuracy: 0.9575 Epoch 00006: early stopping <keras.callbacks.History at 0x7ff80c64cad0>
Birçok yerleşik geri arama mevcuttur
Keras'ta halihazırda mevcut olan birçok yerleşik geri arama vardır, örneğin:
-
ModelCheckpoint
: Periyodik modelini kaydedin. -
EarlyStopping
: Dur eğitim eğitim doğrulama ölçümleri iyileştirilmesi artık olduğunda. -
TensorBoard
: görüntülendi olabilir periyodik yazma modeli günlükleri TensorBoard (bölüm "Görselleştirme" içinde daha fazla ayrıntı). -
CSVLogger
: bir CSV dosyası kaybı ve ölçülerine veriler akışları. - vb.
Bkz geri aramaları belgelerine tam listesi için.
Kendi geri aramanızı yazma
Sen taban sınıfı uzatarak özel geri arama oluşturabilir keras.callbacks.Callback
. Bir geri arama sınıf özellik sayesinde ilişkili modeline erişimi olan self.model
.
Okumak için emin olun , özel geri aramalar yazmaya komple rehber .
Eğitim sırasında toplu iş başına kayıp değerlerinin bir listesini kaydetmeye ilişkin basit bir örnek:
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs):
self.per_batch_losses = []
def on_batch_end(self, batch, logs):
self.per_batch_losses.append(logs.get("loss"))
Kontrol noktası modelleri
Modelinizi nispeten büyük veri kümelerinde eğitirken, modelinizin kontrol noktalarını sık aralıklarla kaydetmek çok önemlidir.
Bunu başarmak için en kolay yolu ile ModelCheckpoint
callback'inde:
model = get_compiled_model()
callbacks = [
keras.callbacks.ModelCheckpoint(
# Path where to save the model
# The two parameters below mean that we will overwrite
# the current checkpoint if and only if
# the `val_loss` score has improved.
# The saved model name will include the current epoch.
filepath="mymodel_{epoch}",
save_best_only=True, # Only save a model if `val_loss` has improved.
monitor="val_loss",
verbose=1,
)
]
model.fit(
x_train, y_train, epochs=2, batch_size=64, callbacks=callbacks, validation_split=0.2
)
Epoch 1/2 613/625 [============================>.] - ETA: 0s - loss: 0.3693 - sparse_categorical_accuracy: 0.8972 Epoch 00001: val_loss improved from inf to 0.23508, saving model to mymodel_1 2021-11-12 20:11:50.182298: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. INFO:tensorflow:Assets written to: mymodel_1/assets 625/625 [==============================] - 3s 4ms/step - loss: 0.3660 - sparse_categorical_accuracy: 0.8979 - val_loss: 0.2351 - val_sparse_categorical_accuracy: 0.9273 Epoch 2/2 620/625 [============================>.] - ETA: 0s - loss: 0.1659 - sparse_categorical_accuracy: 0.9507 Epoch 00002: val_loss improved from 0.23508 to 0.16898, saving model to mymodel_2 INFO:tensorflow:Assets written to: mymodel_2/assets 625/625 [==============================] - 2s 3ms/step - loss: 0.1657 - sparse_categorical_accuracy: 0.9507 - val_loss: 0.1690 - val_sparse_categorical_accuracy: 0.9482 <keras.callbacks.History at 0x7ff8b577cc90>
ModelCheckpoint
geri arama hata toleransını uygulamak için kullanılabilir: vaka eğitimde modelin son kaydedilen durumundan yeniden başlatma eğitimi yeteneği rastgele kesintiye uğrar. İşte temel bir örnek:
import os
# Prepare a directory to store all the checkpoints.
checkpoint_dir = "./ckpt"
if not os.path.exists(checkpoint_dir):
os.makedirs(checkpoint_dir)
def make_or_restore_model():
# Either restore the latest model, or create a fresh one
# if there is no checkpoint available.
checkpoints = [checkpoint_dir + "/" + name for name in os.listdir(checkpoint_dir)]
if checkpoints:
latest_checkpoint = max(checkpoints, key=os.path.getctime)
print("Restoring from", latest_checkpoint)
return keras.models.load_model(latest_checkpoint)
print("Creating a new model")
return get_compiled_model()
model = make_or_restore_model()
callbacks = [
# This callback saves a SavedModel every 100 batches.
# We include the training loss in the saved model name.
keras.callbacks.ModelCheckpoint(
filepath=checkpoint_dir + "/ckpt-loss={loss:.2f}", save_freq=100
)
]
model.fit(x_train, y_train, epochs=1, callbacks=callbacks)
Creating a new model 88/1563 [>.............................] - ETA: 3s - loss: 1.1203 - sparse_categorical_accuracy: 0.6911INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=1.04/assets 185/1563 [==>...........................] - ETA: 6s - loss: 0.7768 - sparse_categorical_accuracy: 0.7858INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.75/assets 286/1563 [====>.........................] - ETA: 6s - loss: 0.6382 - sparse_categorical_accuracy: 0.8211INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.63/assets 383/1563 [======>.......................] - ETA: 6s - loss: 0.5584 - sparse_categorical_accuracy: 0.8433INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.55/assets 484/1563 [========>.....................] - ETA: 6s - loss: 0.5032 - sparse_categorical_accuracy: 0.8578INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.50/assets 586/1563 [==========>...................] - ETA: 5s - loss: 0.4644 - sparse_categorical_accuracy: 0.8684INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.46/assets 685/1563 [============>.................] - ETA: 5s - loss: 0.4356 - sparse_categorical_accuracy: 0.8762INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.43/assets 783/1563 [==============>...............] - ETA: 5s - loss: 0.4127 - sparse_categorical_accuracy: 0.8825INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.41/assets 883/1563 [===============>..............] - ETA: 4s - loss: 0.3958 - sparse_categorical_accuracy: 0.8868INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.39/assets 985/1563 [=================>............] - ETA: 3s - loss: 0.3766 - sparse_categorical_accuracy: 0.8918INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.38/assets 1086/1563 [===================>..........] - ETA: 3s - loss: 0.3624 - sparse_categorical_accuracy: 0.8958INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.36/assets 1184/1563 [=====================>........] - ETA: 2s - loss: 0.3498 - sparse_categorical_accuracy: 0.8994INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.35/assets 1283/1563 [=======================>......] - ETA: 1s - loss: 0.3383 - sparse_categorical_accuracy: 0.9029INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.34/assets 1386/1563 [=========================>....] - ETA: 1s - loss: 0.3265 - sparse_categorical_accuracy: 0.9058INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.33/assets 1485/1563 [===========================>..] - ETA: 0s - loss: 0.3184 - sparse_categorical_accuracy: 0.9081INFO:tensorflow:Assets written to: ./ckpt/ckpt-loss=0.32/assets 1563/1563 [==============================] - 11s 7ms/step - loss: 0.3122 - sparse_categorical_accuracy: 0.9097 <keras.callbacks.History at 0x7ff8b53e1dd0>
Ayrıca, modelleri kaydetmek ve geri yüklemek için kendi geri aramanızı yazın.
Serileştirme ve tasarrufuna yönelik tam bir kılavuz için, bkz tasarrufu ve Modeller seri için rehber .
Öğrenme oranı çizelgelerini kullanma
Derin öğrenme modellerini eğitirken yaygın bir kalıp, eğitim ilerledikçe öğrenmeyi kademeli olarak azaltmaktır. Bu genellikle "öğrenme hızı düşüşü" olarak bilinir.
Öğrenme azalma programı statik (mevcut dönemin veya mevcut parti indeksinin bir fonksiyonu olarak önceden sabitlenir) veya dinamik (modelin mevcut davranışına, özellikle doğrulama kaybına yanıt veren) olabilir.
Bir optimize ediciye bir zamanlama geçirme
Kolayca gibi bir zamanlama nesnesi ileterek statik öğrenme hızı çürüme programını kullanabilirsiniz learning_rate
sizin optimizer içinde argüman:
initial_learning_rate = 0.1
lr_schedule = keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate, decay_steps=100000, decay_rate=0.96, staircase=True
)
optimizer = keras.optimizers.RMSprop(learning_rate=lr_schedule)
Çeşitli dahili içinde programları mevcuttur: ExponentialDecay
, PiecewiseConstantDecay
, PolynomialDecay
ve InverseTimeDecay
.
Dinamik bir öğrenme oranı çizelgesi uygulamak için geri aramaları kullanma
Optimize edicinin doğrulama ölçümlerine erişimi olmadığından, dinamik bir öğrenme oranı çizelgesi (örneğin, doğrulama kaybı artık iyileşmediğinde öğrenme oranını azaltmak) bu zamanlama nesneleriyle gerçekleştirilemez.
Ancak, geri aramaların doğrulama ölçümleri dahil tüm ölçümlere erişimi vardır! Böylece, optimize edicideki mevcut öğrenme oranını değiştiren bir geri arama kullanarak bu modeli elde edebilirsiniz. Aslında bu bile yerleşik olarak ReduceLROnPlateau
callback'inde.
Eğitim sırasında kayıp ve ölçümleri görselleştirme
Eğitim sırasında modelinize bir göz tutmak için en iyi yolu kullanmaktır TensorBoard - Eğer size sağladığı yerel çalışabileceği tarayıcı tabanlı bir uygulama:
- Eğitim ve değerlendirme için kayıp ve metriklerin canlı grafikleri
- (isteğe bağlı olarak) Katman aktivasyonlarınızın histogramlarının görselleştirmeleri
- (isteğe bağlı olarak) gömme alanlarının 3D görselleştirme sizin tarafından öğrenilen
Embedding
katmanları
TensorFlow'u pip ile kurduysanız, komut satırından TensorBoard'u başlatabilmeniz gerekir:
tensorboard --logdir=/full_path_to_your_logs
TensorBoard geri aramasını kullanma
Bir Keras modeli ile TensorBoard kullanımı en kolay yolu, fit()
yöntemi olup TensorBoard
geri arama.
En basit durumda, geri aramanın günlükleri nereye yazmasını istediğinizi belirtmeniz yeterlidir ve hazırsınız:
keras.callbacks.TensorBoard(
log_dir="/full_path_to_your_logs",
histogram_freq=0, # How often to log histogram visualizations
embeddings_freq=0, # How often to log embedding visualizations
update_freq="epoch",
) # How often to write logs (default: once per epoch)
<keras.callbacks.TensorBoard at 0x7ff88c8c04d0>
Daha fazla bilgi için, bkz belgelerine TensorBoard
geri arama .