Lihat di TensorFlow.org | Jalankan di Google Colab | Lihat sumber di GitHub | Unduh buku catatan |
Mempersiapkan
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
Kapan menggunakan model Sequential
Sebuah Sequential
Model sesuai untuk tumpukan polos lapisan dimana masing-masing lapisan memiliki tepat satu tensor input dan satu output tensor.
Skematis, berikut 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)
setara dengan fungsi ini:
# 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)))
Model A Sequential tidak yang sesuai jika:
- Model Anda memiliki banyak input atau beberapa output
- Setiap lapisan Anda memiliki banyak input atau beberapa output
- Anda perlu melakukan berbagi lapisan
- Anda menginginkan topologi non-linier (misalnya koneksi residual, model multi-cabang)
Membuat model Sekuensial
Anda dapat membuat model Sequential dengan meneruskan daftar layer ke konstruktor Sequential:
model = keras.Sequential(
[
layers.Dense(2, activation="relu"),
layers.Dense(3, activation="relu"),
layers.Dense(4),
]
)
Lapisan yang dapat diakses melalui layers
atribut:
model.layers
[<keras.layers.core.Dense at 0x7fdc784478d0>, <keras.layers.core.Dense at 0x7fdbbc3c4650>, <keras.layers.core.Dense at 0x7fdbbc3c4a10>]
Anda juga dapat membuat model Sequential secara bertahap melalui add()
metode:
model = keras.Sequential()
model.add(layers.Dense(2, activation="relu"))
model.add(layers.Dense(3, activation="relu"))
model.add(layers.Dense(4))
Perhatikan bahwa ada juga yang sesuai pop()
metode untuk menghilangkan lapisan: model Sequential berperilaku sangat banyak seperti daftar lapisan.
model.pop()
print(len(model.layers)) # 2
2
Juga mencatat bahwa konstruktor Sequential menerima name
argumen, sama seperti lapisan atau model di Keras. Ini berguna untuk membubuhi keterangan grafik TensorBoard dengan nama yang bermakna secara semantik.
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"))
Menentukan bentuk input terlebih dahulu
Secara umum, semua layer di Keras perlu mengetahui bentuk inputnya agar dapat membuat bobotnya. Jadi ketika Anda membuat layer seperti ini, awalnya tidak memiliki bobot:
layer = layers.Dense(3)
layer.weights # Empty
[]
Ini menciptakan bobotnya saat pertama kali dipanggil pada input, karena bentuk bobot bergantung pada bentuk input:
# 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)>]
Tentu, ini juga berlaku untuk model Sequential. Bila Anda instantiate model Sequential tanpa bentuk masukan, itu tidak "dibangun": ia tidak memiliki bobot (dan memanggil model.weights
hasil dalam kesalahan yang menyatakan hanya ini). Bobot dibuat ketika model pertama kali melihat beberapa data input:
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
Setelah model "dibangun", Anda dapat menghubungi nya summary()
metode untuk menampilkan isinya:
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 _________________________________________________________________
Namun, ini bisa sangat berguna saat membangun model Sequential secara bertahap untuk dapat menampilkan ringkasan model sejauh ini, termasuk bentuk keluaran saat ini. Dalam hal ini, Anda harus mulai model Anda dengan melewati sebuah Input
objek untuk model Anda, sehingga tahu bentuk input dari awal:
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 _________________________________________________________________
Perhatikan bahwa Input
objek tidak ditampilkan sebagai bagian dari model.layers
, karena tidak lapisan:
model.layers
[<keras.layers.core.Dense at 0x7fdbbc37c390>]
Alternatif sederhana adalah dengan hanya lulus input_shape
argumen untuk lapisan pertama Anda:
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 _________________________________________________________________
Model yang dibuat dengan bentuk input yang telah ditentukan sebelumnya seperti ini selalu memiliki bobot (bahkan sebelum melihat data apa pun) dan selalu memiliki bentuk output yang ditentukan.
Secara umum, praktik terbaik yang disarankan untuk selalu menentukan bentuk input dari model Sequential terlebih dahulu jika Anda tahu apa itu.
Sebuah umum debugging alur kerja: add()
+ summary()
Ketika membangun sebuah arsitektur Sequential baru, ini berguna untuk secara bertahap tumpukan lapisan dengan add()
dan sering mencetak ringkasan Model. Sebagai contoh, ini memungkinkan Anda untuk memantau bagaimana setumpuk Conv2D
dan MaxPooling2D
lapisan yang downsampling peta fitur image:
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 _________________________________________________________________
Sangat praktis bukan?
Apa yang harus dilakukan setelah Anda memiliki model?
Setelah arsitektur model Anda siap, Anda akan ingin:
- Latih model Anda, evaluasi, dan jalankan inferensi. Lihat kami panduan untuk pelatihan dan evaluasi dengan built-loop
- Simpan model Anda ke disk dan pulihkan. Lihat kami panduan untuk serialisasi & hemat .
- Percepat pelatihan model dengan memanfaatkan beberapa GPU. Lihat kami panduan untuk multi-GPU dan pelatihan didistribusikan .
Ekstraksi fitur dengan model Sequential
Setelah model Sequential telah dibangun, itu berperilaku seperti model yang API Fungsional . Ini berarti bahwa setiap lapisan memiliki input
dan output
atribut. Atribut ini dapat digunakan untuk melakukan hal-hal yang rapi, seperti membuat model dengan cepat yang mengekstrak output dari semua lapisan perantara dalam model Sequential:
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)
Berikut adalah contoh serupa yang hanya mengekstrak fitur dari satu lapisan:
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)
Transfer pembelajaran dengan model Sequential
Pembelajaran transfer terdiri dari membekukan lapisan bawah dalam model dan hanya melatih lapisan atas. Jika Anda tidak terbiasa dengan hal itu, pastikan untuk membaca kami panduan untuk belajar mentransfer .
Berikut adalah dua cetak biru pembelajaran transfer umum yang melibatkan model Sequential.
Pertama, katakanlah Anda memiliki model Sequential, dan Anda ingin membekukan semua layer kecuali yang terakhir. Dalam hal ini, Anda akan hanya iterate lebih model.layers
dan set layer.trainable = False
pada setiap lapisan, kecuali yang terakhir. Seperti ini:
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(...)
Cetak biru umum lainnya adalah menggunakan model Sequential untuk menumpuk model yang telah dilatih sebelumnya dan beberapa lapisan klasifikasi yang baru diinisialisasi. Seperti ini:
# 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(...)
Jika Anda melakukan transfer learning, Anda mungkin akan sering menggunakan kedua pola ini.
Itu saja yang perlu Anda ketahui tentang model Sequential!
Untuk mengetahui lebih lanjut tentang model bangunan di Keras, lihat: