Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cách dùng Functional API làm việc với kết nối tàn dư (residual connections) trong Python

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.