TensorFlow.org'da görüntüleyin | Google Colab'da çalıştırın | Kaynağı GitHub'da görüntüleyin | Not defterini indir |
Kurmak
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
Sıralı model ne zaman kullanılır?
Bir Sequential
model her tabaka tam bir giriş tensörü ve bir çıkış tensörünün sahip tabakaların düz bir yığını için uygundur.
Şematik, aşağıdaki Sequential
modeli:
# Define Sequential model with 3 layers
model = keras.Sequential(
[
layers.Dense(2, activation="relu", name="layer1"),
layers.Dense(3, activation="relu", name="layer2"),
layers.Dense(4, name="layer3"),
]
)
# Call model on a test input
x = tf.ones((3, 3))
y = model(x)
bu fonksiyona eşdeğerdir:
# Create 3 layers
layer1 = layers.Dense(2, activation="relu", name="layer1")
layer2 = layers.Dense(3, activation="relu", name="layer2")
layer3 = layers.Dense(4, name="layer3")
# Call layers on a test input
x = tf.ones((3, 3))
y = layer3(layer2(layer1(x)))
Aşamaları modeli, uygun değildir:
- Modelinizin birden çok girdisi veya birden çok çıktısı var
- Katmanlarınızdan herhangi birinin birden çok girdisi veya birden çok çıktısı var
- Katman paylaşımı yapmanız gerekiyor
- Doğrusal olmayan topoloji istiyorsunuz (ör. artık bağlantı, çok dallı model)
Sıralı bir model oluşturma
Sıralı oluşturucuya bir katman listesi ileterek Sıralı bir model oluşturabilirsiniz:
model = keras.Sequential(
[
layers.Dense(2, activation="relu"),
layers.Dense(3, activation="relu"),
layers.Dense(4),
]
)
Onun katmanları aracılığıyla erişilebilir layers
özniteliği:
model.layers
[<keras.layers.core.Dense at 0x7fdc784478d0>, <keras.layers.core.Dense at 0x7fdbbc3c4650>, <keras.layers.core.Dense at 0x7fdbbc3c4a10>]
Ayrıca yoluyla adım adım bir Sıralı modeli oluşturabilirsiniz add()
yöntemiyle:
model = keras.Sequential()
model.add(layers.Dense(2, activation="relu"))
model.add(layers.Dense(3, activation="relu"))
model.add(layers.Dense(4))
Not karşılık gelen bir zamanda var ki pop()
tabakaları kaldırmak için bir yöntem: bir sıralı modeli davranır çok katmandan listesi gibi.
model.pop()
print(len(model.layers)) # 2
2
Ayrıca Sıralı yapıcı bir kabul ettiğine dikkatinizi name
sadece keras herhangi katmana veya modeli gibi, argüman. Bu, TensorBoard grafiklerine anlamsal olarak anlamlı adlarla açıklama eklemek için kullanışlıdır.
model = keras.Sequential(name="my_sequential")
model.add(layers.Dense(2, activation="relu", name="layer1"))
model.add(layers.Dense(3, activation="relu", name="layer2"))
model.add(layers.Dense(4, name="layer3"))
Giriş şeklinin önceden belirtilmesi
Genel olarak, Keras'taki tüm katmanların ağırlıklarını oluşturabilmeleri için girdilerinin şeklini bilmesi gerekir. Bu nedenle, bunun gibi bir katman oluşturduğunuzda, başlangıçta ağırlığı yoktur:
layer = layers.Dense(3)
layer.weights # Empty
[]
Ağırlıkların şekli girdilerin şekline bağlı olduğundan, bir girdiye ilk çağrıldığında ağırlıklarını oluşturur:
# Call layer on a test input
x = tf.ones((1, 4))
y = layer(x)
layer.weights # Now it has weights, of shape (4, 3) and (3,)
[<tf.Variable 'dense_6/kernel:0' shape=(4, 3) dtype=float32, numpy= array([[ 0.5319189 , -0.8767905 , -0.63919735], [-0.6276014 , 0.1689707 , -0.57695866], [ 0.6710613 , 0.5354214 , -0.00893992], [ 0.15670097, -0.15280598, 0.8865864 ]], dtype=float32)>, <tf.Variable 'dense_6/bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>]
Doğal olarak, bu aynı zamanda Sıralı modeller için de geçerlidir. Eğer, bu "inşa" değil bir giriş şekli olmadan Sıralı modeli örneğini zaman: hiçbir ağırlıkları vardır (ve arama model.weights
hatayla sonuçları sadece bu belirten). Ağırlıklar, model bazı girdi verilerini ilk gördüğünde oluşturulur:
model = keras.Sequential(
[
layers.Dense(2, activation="relu"),
layers.Dense(3, activation="relu"),
layers.Dense(4),
]
) # No weights at this stage!
# At this point, you can't do this:
# model.weights
# You also can't do this:
# model.summary()
# Call the model on a test input
x = tf.ones((1, 4))
y = model(x)
print("Number of weights after calling the model:", len(model.weights)) # 6
Number of weights after calling the model: 6
Bir modeli "inşa" sonra, onun çağırabilirsiniz summary()
içeriğini görüntülemek için bir yöntem:
model.summary()
Model: "sequential_3" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_7 (Dense) (1, 2) 10 _________________________________________________________________ dense_8 (Dense) (1, 3) 9 _________________________________________________________________ dense_9 (Dense) (1, 4) 16 ================================================================= Total params: 35 Trainable params: 35 Non-trainable params: 0 _________________________________________________________________
Bununla birlikte, mevcut çıktı şekli de dahil olmak üzere modelin şu ana kadarki özetini görüntüleyebilmek için aşamalı olarak bir Sıralı model oluştururken çok yararlı olabilir. Bu durumda, bir ileterek modelinizi başlamalıdır Input
baştan onun giriş şeklini bilmesi, modeliniz nesneyi:
model = keras.Sequential()
model.add(keras.Input(shape=(4,)))
model.add(layers.Dense(2, activation="relu"))
model.summary()
Model: "sequential_4" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_10 (Dense) (None, 2) 10 ================================================================= Total params: 10 Trainable params: 10 Non-trainable params: 0 _________________________________________________________________
Not, Input
nesne parçası olarak gösterilmez model.layers
bir tabaka olmadığı için,:
model.layers
[<keras.layers.core.Dense at 0x7fdbbc37c390>]
Basit bir alternatif sadece bir geçmektir input_shape
ilk katmana argüman:
model = keras.Sequential()
model.add(layers.Dense(2, activation="relu", input_shape=(4,)))
model.summary()
Model: "sequential_5" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_11 (Dense) (None, 2) 10 ================================================================= Total params: 10 Trainable params: 10 Non-trainable params: 0 _________________________________________________________________
Bunun gibi önceden tanımlanmış bir girdi şekliyle oluşturulan modeller her zaman (herhangi bir veriyi görmeden önce bile) ağırlıklara sahiptir ve her zaman tanımlanmış bir çıktı şekline sahiptir.
Genel olarak, ne olduğunu biliyorsanız, bir Sıralı modelin giriş şeklini her zaman önceden belirtmek önerilen bir en iyi uygulamadır.
Ortak bir hata giderme akışı: add()
+ summary()
Yeni Sıralı mimarisini oluştururken, bu adım adım ile katmanları yığını faydalıdır add()
ve sıklıkla modeli özetleri yazdırın. Örneğin, bu bir yığın nasıl izlemek sağlar Conv2D
ve MaxPooling2D
katmanları görüntü özelliği haritalar altörnekleme edilir:
model = keras.Sequential()
model.add(keras.Input(shape=(250, 250, 3))) # 250x250 RGB images
model.add(layers.Conv2D(32, 5, strides=2, activation="relu"))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.MaxPooling2D(3))
# Can you guess what the current output shape is at this point? Probably not.
# Let's just print it:
model.summary()
# The answer was: (40, 40, 32), so we can keep downsampling...
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.MaxPooling2D(3))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.MaxPooling2D(2))
# And now?
model.summary()
# Now that we have 4x4 feature maps, time to apply global max pooling.
model.add(layers.GlobalMaxPooling2D())
# Finally, we add a classification layer.
model.add(layers.Dense(10))
Model: "sequential_6" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 123, 123, 32) 2432 _________________________________________________________________ conv2d_1 (Conv2D) (None, 121, 121, 32) 9248 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 40, 40, 32) 0 ================================================================= Total params: 11,680 Trainable params: 11,680 Non-trainable params: 0 _________________________________________________________________ Model: "sequential_6" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 123, 123, 32) 2432 _________________________________________________________________ conv2d_1 (Conv2D) (None, 121, 121, 32) 9248 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 40, 40, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 38, 38, 32) 9248 _________________________________________________________________ conv2d_3 (Conv2D) (None, 36, 36, 32) 9248 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 12, 12, 32) 0 _________________________________________________________________ conv2d_4 (Conv2D) (None, 10, 10, 32) 9248 _________________________________________________________________ conv2d_5 (Conv2D) (None, 8, 8, 32) 9248 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 4, 4, 32) 0 ================================================================= Total params: 48,672 Trainable params: 48,672 Non-trainable params: 0 _________________________________________________________________
Çok pratik, değil mi?
Bir modeliniz olduğunda ne yapmalısınız?
Model mimariniz hazır olduğunda şunları yapmak isteyeceksiniz:
- Modelinizi eğitin, değerlendirin ve çıkarım yapın. Bizim bakın döngüler yerleşik ile eğitim ve değerlendirme rehberi
- Modelinizi diske kaydedin ve geri yükleyin. Bizim Bkz serileştirme & tasarrufa kılavuzu .
- Birden çok GPU'dan yararlanarak model eğitimini hızlandırın. Bizim Bkz çoklu GPU ve dağıtılmış eğitime kılavuzu .
Sıralı bir modelle özellik çıkarma
Bir Sıralı modeli inşa edildikten sonra, bu bir gibi davranır Fonksiyonel API modeli . Her tabaka, sahip olan bu araçlar input
ve output
özelliği. Bu nitelikler, bir Sıralı modeldeki tüm ara katmanların çıktılarını çıkaran bir modelin hızlı bir şekilde oluşturulması gibi düzgün şeyler yapmak için kullanılabilir:
initial_model = keras.Sequential(
[
keras.Input(shape=(250, 250, 3)),
layers.Conv2D(32, 5, strides=2, activation="relu"),
layers.Conv2D(32, 3, activation="relu"),
layers.Conv2D(32, 3, activation="relu"),
]
)
feature_extractor = keras.Model(
inputs=initial_model.inputs,
outputs=[layer.output for layer in initial_model.layers],
)
# Call feature extractor on test input.
x = tf.ones((1, 250, 250, 3))
features = feature_extractor(x)
Yalnızca bir katmandan özellikleri çıkaran benzer bir örnek:
initial_model = keras.Sequential(
[
keras.Input(shape=(250, 250, 3)),
layers.Conv2D(32, 5, strides=2, activation="relu"),
layers.Conv2D(32, 3, activation="relu", name="my_intermediate_layer"),
layers.Conv2D(32, 3, activation="relu"),
]
)
feature_extractor = keras.Model(
inputs=initial_model.inputs,
outputs=initial_model.get_layer(name="my_intermediate_layer").output,
)
# Call feature extractor on test input.
x = tf.ones((1, 250, 250, 3))
features = feature_extractor(x)
Sıralı bir modelle öğrenmeyi aktarın
Aktarım öğrenimi, bir modelde alt katmanların dondurulmasından ve yalnızca üst katmanların eğitilmesinden oluşur. Onunla aşina değilseniz, bizim mutlaka okuyun transferi öğrenmeye kılavuzu .
İşte Sıralı modelleri içeren iki yaygın transfer öğrenme planı.
Öncelikle Diyelim ki Sıralı bir modeliniz var ve sonuncusu hariç tüm katmanları dondurmak istiyorsunuz. Bu durumda, sadece yinelerler üzerinde olur model.layers
ve set layer.trainable = False
sonuncusu hariç, her katmanda. Bunun gibi:
model = keras.Sequential([
keras.Input(shape=(784)),
layers.Dense(32, activation='relu'),
layers.Dense(32, activation='relu'),
layers.Dense(32, activation='relu'),
layers.Dense(10),
])
# Presumably you would want to first load pre-trained weights.
model.load_weights(...)
# Freeze all layers except the last one.
for layer in model.layers[:-1]:
layer.trainable = False
# Recompile and train (this will only update the weights of the last layer).
model.compile(...)
model.fit(...)
Diğer bir yaygın plan, önceden eğitilmiş bir modeli ve bazı yeni başlatılmış sınıflandırma katmanlarını yığmak için Sıralı bir model kullanmaktır. Bunun gibi:
# Load a convolutional base with pre-trained weights
base_model = keras.applications.Xception(
weights='imagenet',
include_top=False,
pooling='avg')
# Freeze the base model
base_model.trainable = False
# Use a Sequential model to add a trainable classifier on top
model = keras.Sequential([
base_model,
layers.Dense(1000),
])
# Compile & train
model.compile(...)
model.fit(...)
Transfer öğrenimi yaparsanız, muhtemelen kendinizi bu iki kalıbı sık sık kullanırken bulacaksınız.
Sıralı modeller hakkında bilmeniz gereken her şey bu kadar!
Keras'ta model oluşturma hakkında daha fazla bilgi edinmek için bkz.: