Bir sorunuz mu var? TensorFlow Forum Ziyaret Forumunda toplulukla bağlantı kurun

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

Kurulum

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üne 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 0x7f8af834ccc0>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f8ba42a2080>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f8af4506240>]

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

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 de 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, bunun gibi 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.37242043,  0.8652495 ,  0.27929688],
        [-0.1227327 ,  0.80179167,  0.4077394 ],
        [-0.05193728,  0.6267668 , -0.00613904],
        [ 0.57773185, -0.54531974,  0.8418772 ]], 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 , bu "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 bilebilir:

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ğine dikkat model.layers , çünkü bu bir katman değildir:

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

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 modellerin her zaman ağırlıkları vardır (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 niteliğ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 aktarmak için 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 yineleme model.layers ve sonuncusu hariç her katmanda layer.trainable = False . Böyle:

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. Böyle:

# 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 sık sık bu iki kalıbı kullanırken 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 .: