Mô hình đa đầu vào

Deep Learning nâng cao với PyTorch

Michal Oleszak

Machine Learning Engineer

Vì sao đa đầu vào?

Khai thác thêm thông tin

Sơ đồ mô hình nhận hai ảnh ô tô làm đầu vào và cho một đầu ra.

Mô hình đa phương thức

Sơ đồ mô hình nhận một ảnh và một đoạn văn bản làm đầu vào và xuất ra văn bản.

Học metric

Sơ đồ mô hình nhận hai ảnh khuôn mặt làm đầu vào và dự đoán liệu chúng có giống nhau không.

Học tự giám sát

Sơ đồ mô hình nhận hai phiên bản tăng cường của cùng một ảnh làm đầu vào và học rằng chúng giống nhau.

Deep Learning nâng cao với PyTorch

Bộ dữ liệu Omniglot

Một mẫu ảnh từ bộ dữ liệu Omniglot.

1 Lake, B. M., Salakhutdinov, R., and Tenenbaum, J. B. (2015). Human-level concept learning through probabilistic program induction. Science, 350(6266), 1332-1338.
Deep Learning nâng cao với PyTorch

Phân loại ký tự

Sơ đồ mô hình: ảnh ký tự được đưa vào mạng nơ-ron.

Deep Learning nâng cao với PyTorch

Phân loại ký tự

Sơ đồ mô hình: vector one-hot của bảng chữ cái được đưa vào mạng nơ-ron.

Deep Learning nâng cao với PyTorch

Phân loại ký tự

Sơ đồ mô hình: embedding của ký tự và bảng chữ cái được kết hợp.

Deep Learning nâng cao với PyTorch

Phân loại ký tự

Sơ đồ mô hình: từ embedding đã kết hợp, bộ phân loại dự đoán ký tự.

Deep Learning nâng cao với PyTorch

Dataset hai đầu vào

from PIL import Image

class OmniglotDataset(Dataset):

def __init__(self, transform, samples): self.transform = transform self.samples = samples
def __len__(self): return len(self.samples)
def __getitem__(self, idx): img_path, alphabet, label = self.samples[idx] img = Image.open(img_path).convert('L') img = self.transform(img) return img, alphabet, label
  • Gán mẫu và phép biến đổi

    print(samples[0])
    
    [(
      'omniglot_train/.../0459_14.png',
       array([1., 0., 0., ..., 0., 0., 0.]),
       0
     )]
    
  • Cài đặt __len__()

  • Tải và biến đổi ảnh

  • Trả về cả hai đầu vào và nhãn
Deep Learning nâng cao với PyTorch

Nối tensor

x = torch.tensor([
  [1, 2, 3],
])

y = torch.tensor([
  [4, 5, 6],
])

Nối theo trục 0

torch.cat((x, y), dim=0)
[[1, 2, 3],
 [4, 5, 6]]

Nối theo trục 1

torch.cat((x, y), dim=1)
[[1, 2, 3, 4, 5, 6]]
Deep Learning nâng cao với PyTorch

Kiến trúc hai đầu vào

class Net(nn.Module):
    def __init__(self):
        super().__init__()

self.image_layer = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.MaxPool2d(kernel_size=2), nn.ELU(), nn.Flatten(), nn.Linear(16*32*32, 128) )
self.alphabet_layer = nn.Sequential( nn.Linear(30, 8), nn.ELU(), )
self.classifier = nn.Sequential( nn.Linear(128 + 8, 964), )
  • Định nghĩa tầng xử lý ảnh
  • Định nghĩa tầng xử lý bảng chữ cái
  • Định nghĩa tầng phân loại
Deep Learning nâng cao với PyTorch

Kiến trúc hai đầu vào

def forward(self, x_image, x_alphabet):

x_image = self.image_layer(x_image)
x_alphabet = self.alphabet_layer(x_alphabet)
x = torch.cat((x_image, x_alphabet), dim=1)
return self.classifier(x)
  • Truyền ảnh qua tầng ảnh
  • Truyền bảng chữ cái qua tầng bảng chữ cái
  • Nối đầu ra của ảnh và bảng chữ cái
  • Truyền kết quả qua bộ phân loại
Deep Learning nâng cao với PyTorch

Vòng lặp huấn luyện

net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)

for epoch in range(10):
    for img, alpha, labels in dataloader_train:
        optimizer.zero_grad()
        outputs = net(img, alpha)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
  • Dữ liệu huấn luyện gồm ba mục:
    • Ảnh
    • Vector bảng chữ cái
    • Nhãn
  • Truyền cho mô hình ảnh và bảng chữ cái
Deep Learning nâng cao với PyTorch

Ayo berlatih!

Deep Learning nâng cao với PyTorch

Preparing Video For Download...