Keras có sẵn trong TensorFlow: import tensorflow; from tensorflow import keras.
Functional API tạo mô hình linh hoạt: topo không tuyến tính, chia sẻ lớp, nhiều đầu vào/đầu ra. Mô hình học sâu là DAG các lớp.
Sử dụng Google Colab. Dưới đây code xây dựng mô hình ResNet đơn giản cho CIFAR-10 với kết nối tàn dư:
Ví dụ
print("Mô hình ResNet mẫu cho CIFAR10")
print("Tạo các lớp cho mô hình")
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])
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])
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("Thông tin mô hình")
model.summary()
Nguồn: TensorFlow Guide
Đầu ra
Mô hình ResNet mẫu cho CIFAR10 Tạo các lớp cho mô hình Thông tin mô hình 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 _________________________________________________________________
Giải thích
- Mô hình có nhiều đầu vào/đầu ra, topo không tuyến tính.
- Functional API dễ dàng xử lý kết nối không tuần tự.
- Sequential API không thể làm việc với cấu trúc này.
- Kết nối tàn dư (residual connections) cho phép cộng đầu ra của khối trước vào khối sau (layers.add).
- Ví dụ xây dựng ResNet mẫu với CIFAR-10.