Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีใช้ Functional API สร้าง Residual Connections ด้วย Python

Keras อยู่ในแพ็กเกจ TensorFlow เข้าถึงด้วย from tensorflow import keras Functional API ยืดหยุ่นกว่า Sequential API รองรับ Non-linear topology, Shared layers, Multiple I/O โมเดลเป็น DAG ของเลเยอร์

ตัวอย่าง: Toy ResNet สำหรับ CIFAR-10

print("Toy ResNet model for CIFAR10")
print("Layers generated for model")

inputs = keras.Input(shape=(32, 32, 3), name="img")
x = layers.Conv2D(32, 3, activation="relu")(inputs)
x = layers.Conv2D(64, 3, activation="relu")(x)
block_1_output = layers.MaxPooling2D(3)(x)

x = layers.Conv2D(64, 3, activation="relu", padding="same")(block_1_output)
x = layers.Conv2D(64, 3, activation="relu", padding="same")(x)
block_2_output = layers.add([x, block_1_output])  # Residual connection

x = layers.Conv2D(64, 3, activation="relu", padding="same")(block_2_output)
x = layers.Conv2D(64, 3, activation="relu", padding="same")(x)
block_3_output = layers.add([x, block_2_output])  # Residual connection

x = layers.Conv2D(64, 3, activation="relu")(block_3_output)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(256, activation="relu")(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(10)(x)

model = keras.Model(inputs, outputs, name="toy_resnet")
print("More information about the model")
model.summary()

Code credit: TensorFlow Keras Functional Guide

ผลลัพธ์ (Model Summary)

Model: "toy_resnet"
_________________________________________________________________
Layer (type)                 Output Shape              Param #    Connected to
=================================================================
img (InputLayer)             [(None, 32, 32, 3)]       0
conv2d_32 (Conv2D)           (None, 30, 30, 32)        896        img[0][0]
conv2d_33 (Conv2D)           (None, 28, 28, 64)        18496      conv2d_32[0][0]
max_pooling2d_8 (MaxPooling2D) (None, 9, 9, 64)       0          conv2d_33[0][0]
conv2d_34 (Conv2D)           (None, 9, 9, 64)          36928      max_pooling2d_8[0][0]
conv2d_35 (Conv2D)           (None, 9, 9, 64)          36928      conv2d_34[0][0]
add_12 (Add)                 (None, 9, 9, 64)          0          conv2d_35[0][0], max_pooling2d_8[0][0]
conv2d_36 (Conv2D)           (None, 9, 9, 64)          36928      add_12[0][0]
conv2d_37 (Conv2D)           (None, 9, 9, 64)          36928      conv2d_36[0][0]
add_13 (Add)                 (None, 9, 9, 64)          0          conv2d_37[0][0], add_12[0][0]
conv2d_38 (Conv2D)           (None, 7, 7, 64)          36928      add_13[0][0]
global_average_pooling2d_1   (None, 64)                0          conv2d_38[0][0]
dense_40 (Dense)             (None, 256)               16640      global_average_pooling2d_1[0][0]
dropout_2 (Dropout)          (None, 256)               0          dense_40[0][0]
dense_41 (Dense)             (None, 10)                2570       dropout_2[0][0]
=================================================================
Total params: 223,242
Trainable params: 223,242
Non-trainable params: 0
_________________________________________________________________

คำอธิบาย

  • โมเดลมี Multiple Inputs/Outputs
  • Functional API จัดการ Non-linear connectivity ได้ง่าย
  • เลเยอร์ไม่ได้เชื่อมต่อแบบ Sequential → Sequential API ใช้ไม่ได้
  • Residual Connections (Skip Connections) ช่วยให้ Gradient ไหลได้ดีขึ้น
  • ตัวอย่างสร้าง ResNet แบบง่ายกับ CIFAR-10