Câu hỏi:

code mô hình Vision Transformers (ViT) bằng keras có comment chi tiết dễ hiểu cho bài toán classifier


Dưới đây là một đoạn mã mô phỏng cơ bản cho mô hình Vision Transformers (ViT) sử dụng Keras.

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

'''
Chúng ta bắt đầu bằng việc xác định một số tham số quan trọng như kích thước patch và độ sâu của mô hình transformer.
'''
patch_size = 16  # We'll use patches of 16x16 pixels
embed_dim = 64  # Embedding size for each patch
num_heads = 4  # Number of attention heads
ff_dim = 128  # Hidden layer size in MLP
num_patches = (32 // patch_size) ** 2
depth = 6  # Depth of the transformer network

'''
Cắt ảnh thành các patch 16x16 và chuyển chúng thành các vector nhúng.
'''
class Patches(layers.Layer):
    def __init__(self, patch_size):
        super(Patches, self).__init__()
        self.patch_size = patch_size

    def call(self, images):
        batch_size = tf.shape(images)[0]
        patches = tf.image.extract_patches(
            images=images,
            sizes=[1, self.patch_size, self.patch_size, 1],
            strides=[1, self.patch_size, self.patch_size, 1],
            rates=[1, 1, 1, 1],
            padding="VALID",
        )
        patch_dims = patches.shape[-1]
        patches = tf.reshape(patches, [batch_size, -1, patch_dims])
        return patches

'''
Mô hình transformer.
'''
class TransformerBlock(layers.Layer):
    def __init__(self, embed_dim, num_heads, ff_dim):
        super(TransformerBlock, self).__init__()
        self.embed_dim = embed_dim
        self.num_heads = num_heads
        self.ff_dim = ff_dim
        self.att = layers.MultiHeadAttention(
            num_heads=num_heads, key_dim=embed_dim
        )
        self.ffn = keras.Sequential(
            [layers.Dense(ff_dim, activation="relu"), layers.Dense(embed_dim),]
        )
        self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)
        self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)

    def call(self, inputs):
        x = self.layernorm1(inputs + self.att(inputs, inputs))
        return self.layernorm2(x + self.ffn(x))


'''
Áp dụng toàn bộ mô hình.
'''
inputs = layers.Input(shape=(32, 32, 3))
x = Patches(patch_size)(inputs)
x = layers.Dense(embed_dim)(x)
x = TransformerBlock(embed_dim, num_heads, ff_dim)(x)
x = layers.GlobalAvgPool1D()(x)
outputs = layers.Dense(10, activation='softmax')(x)

model = keras.Model(inputs=inputs, outputs=outputs)

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

Ghi chú:

Để tìm hiểu thêm về cách hoạt động của các thuật toán AI cũng như tiếp tục thảo luận và tìm hiểu về ViT và các mô hình AI khác, hãy tham gia cộng đồng trituenhantao.io. Nơi đó, bạn không chỉ tìm hiểu được nhiều hơn, mà còn có thể chia sẻ kiến thức của mình!


Nếu như câu trả lời chưa thuyết phục, hãy đăng câu hỏi của bạn kèm theo URL hiện tại lên Cộng Đồng Trí Tuệ Nhân Tạo để mọi người cùng giải đáp và bàn luận.
Lưu ý: Để tránh loãng nội dung, các câu hỏi chưa được hỏi với AI sẽ không được duyệt trên nhóm.
Trang chủ | Hỏi tiếp | Xem lịch sử