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