Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Sıralı model

TensorFlow.org'da görüntüleyin Google Colab'de çalıştırın Kaynağı GitHub'da görüntüleyin Defteri indirin

Kurmak

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

Sıralı model ne zaman kullanılır?

Sequential model, her katmanın tam olarak bir giriş tensörü ve bir çıkış tensörüne sahip olduğu düz bir katman yığını için uygundur.

Şematik olarak, aşağıdaki Sequential model:

# 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 işleve 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)))

Sıralı model şu durumlarda uygun değildir :

  • Modelinizin birden çok girişi veya birden çok çıkışı var
  • Katmanlarınızdan herhangi birinin birden çok girişi veya birden çok çıkışı var
  • Katman paylaşımı yapmanız gerekiyor
  • Doğrusal olmayan topoloji istiyorsunuz (örneğin, bir artık bağlantı, çok dallı bir model)

Sıralı bir model oluşturma

Sıralı yapıcıya 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),
    ]
)

Katmanlarına, layers özelliği aracılığıyla erişilebilir:

model.layers
[<tensorflow.python.keras.layers.core.Dense at 0x7f65406f4cf8>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f65407f4128>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f652e69a9b0>]

Ayrıca add() yöntemiyle artımlı olarak Sıralı bir model oluşturabilirsiniz:

model = keras.Sequential()
model.add(layers.Dense(2, activation="relu"))
model.add(layers.Dense(3, activation="relu"))
model.add(layers.Dense(4))

Ayrıca katmanları kaldırmak için karşılık gelen bir pop() yöntemi olduğunu unutmayın: Sıralı bir model, bir katman listesi gibi davranır.

model.pop()
print(len(model.layers))  # 2
2

Ayrıca, Sıralı yapıcının Keras'taki herhangi bir katman veya model gibi bir name bağımsız değişkenini kabul ettiğini unutmayın. Bu, TensorBoard grafiklerine anlamsal olarak anlamlı adlar 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ş şeklini önceden belirleme

Genel olarak, Keras'taki tüm katmanların ağırlıklarını oluşturabilmek için girdilerinin şeklini bilmesi gerekir. Dolayısıyla, böyle bir katman oluşturduğunuzda, başlangıçta ağırlıkları 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.624763  ,  0.4083134 , -0.5529761 ],
        [ 0.6743641 , -0.5915712 , -0.7844806 ],
        [ 0.5746553 , -0.5919968 , -0.56293225],
        [ 0.0971899 , -0.7555427 , -0.44926038]], dtype=float32)>,
 <tf.Variable 'dense_6/bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>]

Doğal olarak, bu Sıralı modeller için de geçerlidir. Girdi şekli olmayan bir Sıralı modeli model.weights , "inşa edilmiş" değildir: ağırlıkları yoktur (ve model.weights çağırmak sadece bunu belirten bir hatayla sonuçlanır). Ağırlıklar, model ilk olarak bazı girdi verilerini 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 model "oluşturulduktan" sonra, içeriğini görüntülemek için summary() yöntemini çağırabilirsiniz:

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, bir Sıralı modeli aşamalı olarak oluştururken, mevcut çıktı şekli de dahil olmak üzere modelin şimdiye kadarki özetini görüntüleyebilmek çok yararlı olabilir. Bu durumda, modelinize bir Input nesnesi geçirerek başlamalısınız, böylece başlangıçtan itibaren girdi şeklini bilir:

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
_________________________________________________________________

Input nesnesinin model.layers parçası olarak görüntülenmediğini model.layers , çünkü bu bir katman değildir:

model.layers
[<tensorflow.python.keras.layers.core.Dense at 0x7f65406b2dd8>]

Basit bir alternatif, ilk katmanınıza bir input_shape argümanı input_shape :

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 giriş şekli ile oluşturulan modeller her zaman ağırlıklara sahiptir (herhangi bir veriyi görmeden önce bile) 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 belirtmeniz önerilen bir en iyi uygulamadır.

Yaygın bir hata ayıklama iş akışı: add() + summary()

Yeni bir Sıralı mimari oluştururken, katmanları add() ile artımlı olarak istiflemek ve sık sık model özetleri yazdırmak yararlıdır. Örneğin, bu, bir Conv2D ve MaxPooling2D katman yığınının görüntü özelliği haritalarını nasıl altörneklediğini MaxPooling2D :

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:

Sıralı bir modelle özellik çıkarma

Sıralı bir model oluşturulduktan sonra, bir İşlevsel API modeli gibi davranır. Bu, her katmanın bir input ve output özelliği olduğu anlamına gelir. Bu özellikler, bir Sıralı modeldeki tüm ara katmanların çıktılarını hızlı bir şekilde çıkaran bir model oluşturmak 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)

Aşağıda, yalnızca bir katmandan özellik çıkaran benzer bir örnek verilmiştir:

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

Transfer öğrenimi, bir modeldeki alt katmanların dondurulmasından ve yalnızca üst katmanların eğitilmesinden oluşur. Eğer buna aşina değilseniz, öğrenmeyi aktarma rehberimizi okuduğunuzdan emin olun.

Sıralı modelleri içeren iki yaygın transfer öğrenme planı aşağıda verilmiştir.

Öncelikle sıralı bir modeliniz olduğunu ve sonuncusu hariç tüm katmanları dondurmak istediğinizi varsayalım. Bu durumda, model.layers üzerinde model.layers ve sonuncusu hariç her katmanda layer.trainable = False . 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 ortak plan, önceden eğitilmiş bir modeli ve bazı yeni başlatılmış sınıflandırma katmanlarını istiflemek 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ı kullanırken sık sık bulacaksınız.

Sıralı modeller hakkında bilmeniz gereken her şey bu!

Keras'ta model oluşturma hakkında daha fazla bilgi edinmek için bkz .: