หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

แบบจำลองตามลำดับ

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

ติดตั้ง

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

เมื่อใดจึงจะใช้แบบจำลองลำดับ

แบบจำลอง Sequential เหมาะสำหรับ สแต็กธรรมดาของเลเยอร์ ที่แต่ละชั้น มีเทนเซอร์หนึ่งอินพุทและเอาท์พุต 1 ตัว

แผนผังโมเดล Sequential ดังต่อไปนี้:

 # 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)
 

เทียบเท่ากับฟังก์ชั่นนี้:

 # 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 = keras.Sequential(
    [
        layers.Dense(2, activation="relu"),
        layers.Dense(3, activation="relu"),
        layers.Dense(4),
    ]
)
 

ชั้นมันจะสามารถเข้าถึงได้ผ่านทาง layers แอตทริบิวต์:

 model.layers
 
[<tensorflow.python.keras.layers.core.Dense at 0x7f37ffe66668>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f37f553fc50>,
 <tensorflow.python.keras.layers.core.Dense at 0x7f37680de2b0>]

นอกจากนี้คุณยังสามารถสร้างแบบจำลองลำดับเพิ่มขึ้นโดยใช้วิธีการ add() :

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

โปรดทราบว่านอกจากนี้ยังมีวิธี pop() สอดคล้องกันในการลบเลเยอร์: แบบจำลองตามลำดับจะมีลักษณะคล้ายกับรายการเลเยอร์

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

นอกจากนี้โปรดทราบว่า Constructor Constructor ยอมรับอาร์กิวเมนต์ name เช่นเดียวกับเลเยอร์หรือโมเดลใน Keras สิ่งนี้มีประโยชน์ในการใส่คำอธิบายกราฟ TensorBoard ด้วยชื่อที่มีความหมาย

 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"))
 

การระบุรูปร่างอินพุตล่วงหน้า

โดยทั่วไปเลเยอร์ทั้งหมดใน Keras จำเป็นต้องรู้รูปร่างของอินพุตเพื่อให้สามารถสร้างน้ำหนักได้ ดังนั้นเมื่อคุณสร้างเลเยอร์เช่นนี้เริ่มแรกมันไม่มีน้ำหนัก:

 layer = layers.Dense(3)
layer.weights  # Empty
 
[]

มันสร้างน้ำหนักของมันในครั้งแรกที่มีการเรียกใช้กับอินพุตเนื่องจากรูปร่างของน้ำหนักขึ้นอยู่กับรูปร่างของอินพุต:

 # 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.8131663 , -0.49988765, -0.02397203],
        [-0.3190418 ,  0.01101786,  0.85226357],
        [-0.602435  , -0.10381919,  0.63280225],
        [-0.3388477 ,  0.11859643, -0.10677373]], dtype=float32)>,
 <tf.Variable 'dense_6/bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>]

โดยธรรมชาติแล้วสิ่งนี้ยังใช้กับโมเดลต่อเนื่อง เมื่อคุณสร้างอินสแตนซ์ของรูปแบบต่อเนื่องโดยไม่มีรูปร่างอินพุตมันจะไม่ "ถูกสร้าง": ไม่มีน้ำหนัก (และการเรียกใช้ model.weights น้ำหนักถูกสร้างขึ้นเมื่อโมเดลเห็นข้อมูลอินพุตเป็นครั้งแรก:

 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

เมื่อแบบจำลองถูก "สร้างขึ้น" คุณสามารถเรียกใช้วิธีการ summary() เพื่อแสดงเนื้อหา:

 model.summary()
 
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_7 (Dense)              multiple                  10        
_________________________________________________________________
dense_8 (Dense)              multiple                  9         
_________________________________________________________________
dense_9 (Dense)              multiple                  16        
=================================================================
Total params: 35
Trainable params: 35
Non-trainable params: 0
_________________________________________________________________

อย่างไรก็ตามมันจะมีประโยชน์มากเมื่อสร้างแบบจำลองแบบลำดับเพิ่มขึ้นเพื่อให้สามารถแสดงสรุปของแบบจำลองจนถึงปัจจุบันรวมถึงรูปร่างผลลัพธ์ปัจจุบัน ในกรณีนี้คุณควรเริ่มต้นโมเดลของคุณโดยส่งวัตถุ Input ไปยังโมเดลของคุณเพื่อให้ทราบถึงรูปร่างอินพุตของมันตั้งแต่เริ่มต้น:

 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 จะไม่แสดงเป็นส่วนหนึ่งของ model.layers เนื่องจากไม่ใช่เลเยอร์:

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

ทางเลือกง่ายๆคือเพียงแค่ส่งอาร์กิวเมนต์ 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
_________________________________________________________________

โมเดลที่สร้างด้วยรูปร่างอินพุตที่กำหนดไว้ล่วงหน้าเช่นนี้จะมีน้ำหนักเสมอ (แม้กระทั่งก่อนที่จะเห็นข้อมูลใด ๆ ) และมีรูปร่างเอาต์พุตที่กำหนดไว้เสมอ

โดยทั่วไปแล้วมันเป็นวิธีปฏิบัติที่ดีที่สุดที่แนะนำให้ระบุรูปแบบการป้อนข้อมูลของตัวแบบลำดับล่วงหน้าเสมอหากคุณรู้ว่ามันคืออะไร

เวิร์กโฟลว์การดีบักทั่วไป: add() + summary()

เมื่อสร้างสถาปัตยกรรมแบบลำดับใหม่จะมีประโยชน์ในการเพิ่มเลเยอร์เลเยอร์ด้วยการ add() และสรุปรูปแบบการพิมพ์บ่อยครั้ง ตัวอย่างเช่นสิ่งนี้ช่วยให้คุณสามารถตรวจสอบว่าสแต็กของ Conv2D และ 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
_________________________________________________________________

มีประโยชน์จริงไหม

จะทำอย่างไรเมื่อคุณมีแบบจำลอง

เมื่อสถาปัตยกรรมแบบจำลองของคุณพร้อมคุณจะต้อง:

การแยกคุณลักษณะด้วยแบบจำลองลำดับ

เมื่อสร้างแบบจำลองตามลำดับแล้วมันจะทำงานเหมือนแบบ API การทำงาน ซึ่งหมายความว่าทุกชั้นมีแอตทริบิวต์ input และ output แอ็ตทริบิวต์เหล่านี้สามารถใช้ในการทำสิ่งต่าง ๆ ได้อย่างรวดเร็วเช่นการสร้างแบบจำลองที่แยกเอาท์พุทของเลเยอร์กลางทั้งหมดในโมเดลซีเควนเชียล:

 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)
 

นี่คือตัวอย่างที่คล้ายกันที่ดึงคุณลักษณะจากเลเยอร์เดียวเท่านั้น:

 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)
 

ถ่ายโอนการเรียนรู้ด้วยตัวแบบลำดับ

การเรียนรู้การโอนประกอบด้วยการแช่แข็งชั้นล่างในรูปแบบและการฝึกอบรมเฉพาะชั้นบนสุดเท่านั้น หากคุณไม่คุ้นเคยโปรดอ่าน คู่มือ ของเรา เพื่อถ่ายโอนการเรียนรู้

นี่คือพิมพ์เขียวการเรียนรู้การถ่ายโอนทั่วไปสองแบบที่เกี่ยวข้องกับโมเดลลำดับ

ก่อนอื่นสมมติว่าคุณมีรูปแบบตามลำดับและคุณต้องการตรึงทุกชั้นยกเว้นชั้นสุดท้าย ในกรณีนี้คุณจะทำซ้ำมากกว่า model.layers และตั้งค่า layer.trainable = False ในแต่ละชั้นยกเว้นชั้นสุดท้าย แบบนี้:

 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(...)
 

พิมพ์เขียวทั่วไปอีกอันหนึ่งคือการใช้แบบจำลองแบบต่อเนื่องเพื่อจัดเรียงแบบจำลองที่ผ่านการฝึกอบรมมาแล้วและชั้นการจำแนกประเภทที่เริ่มต้นใหม่ แบบนี้:

 # 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(...)
 

หากคุณถ่ายโอนการเรียนรู้คุณอาจพบว่าตัวเองใช้รูปแบบทั้งสองนี้บ่อยครั้ง

นั่นคือทั้งหมดที่คุณต้องรู้เกี่ยวกับโมเดลต่อเนื่อง!

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับแบบจำลองอาคารใน Keras ให้ดู: