지난 몇 년 동안 Transformers는 머신러닝의 NLP 영역을 변화시켰습니다. GPT 및 BERT와 같은 모델 인간의 언어를 이해하고 생성하는 데 새로운 기준을 세웠습니다. 이제 동일한 원칙이 컴퓨터 비전 영역에도 적용되었습니다. 컴퓨터 비전 분야의 최근 발전은 비전입니다. 변압기 또는 ViT. "이미지는 16x16 단어만큼 가치가 있습니다: 규모에 따른 이미지 인식을 위한 변환기"라는 논문에 자세히 설명되어 있습니다. ViT 및 변환기 기반 모델은 컨벌루션을 대체하도록 설계되었습니다. 신경망(CNN). Vision Transformers는 컴퓨터 문제 해결에 대한 새로운 시도입니다. 비전. 전통적인 컨볼루션 신경망에 의존하는 대신 수십년 동안 이미지 관련 업무의 중추 역할을 해온 CNN(CNN)은 ViT는 변환기 아키텍처를 사용하여 이미지를 처리합니다. 그들은 치료한다 문장의 단어와 같은 이미지 패치를 통해 모델이 학습할 수 있습니다. 이러한 패치 간의 관계는 마치
CNN과 달리 ViT는 입력 이미지를 패치로 나누고 직렬화합니다. 벡터로 변환하고 행렬을 사용하여 차원을 줄입니다. 곱셈. 그런 다음 변환기 인코더는 이러한 벡터를 다음과 같이 처리합니다. 토큰 임베딩. 이 기사에서는 비전 변환기와 컨볼루션 신경망과의 주요 차이점. 무엇이 만드는가 특히 흥미로운 점은 글로벌 이해 능력입니다. 이는 CNN이 어려움을 겪을 수 있는 이미지 패턴입니다.
비전 변환기는 주의 및 변환기 개념을 사용하여 다음을 수행합니다. 프로세스 이미지 - 이는 자연어의 변환기와 유사합니다. 처리(NLP) 컨텍스트. 그러나 토큰을 사용하는 대신 이미지는 패치로 분할되어 일련의 선형 임베디드로 제공됩니다. 이것들 패치는 NLP에서 토큰이나 단어를 처리하는 것과 동일한 방식으로 처리됩니다.
전체 그림을 동시에 보는 대신 ViT는 이미지를 직소 퍼즐처럼 작은 조각으로 나눕니다. 각 조각은 회전되어 있습니다. 기능을 설명하는 숫자 목록(벡터)으로 변환한 다음 모델은 모든 조각을 보고 그것이 어떤 관계에 있는지 알아냅니다. 변환기 메커니즘을 사용하여 서로 변환합니다.
CNN과 달리 ViT는 특정 필터나 커널을 적용하여 작동합니다.
가장자리 패턴과 같은 특정 특징을 감지하는 이미지입니다. 이것은
프린터가 스캔하는 것과 매우 유사한 컨볼루션 프로세스
영상. 이 필터는 전체 이미지를 슬라이드하여 강조 표시합니다.
중요한 특징. 그런 다음 네트워크는 여러 레이어를 쌓습니다.
이러한 필터는 점점 더 복잡한 패턴을 식별합니다.
CNN을 사용하면 풀링 레이어가 기능 맵의 크기를 줄입니다. 이것들
레이어는 추출된 특징을 분석하여 유용한 예측을 만듭니다.
이미지 인식, 객체 감지 등. 그러나 CNN에는 고정된 기능이 있습니다.
수용 필드로 인해 장거리 모델링 능력이 제한됩니다.
CNN이 이미지를 보는 방식은 무엇입니까?
ViT는 더 많은 매개변수가 있음에도 불구하고 self-attention 메커니즘을 사용합니다. 더 나은 기능 표현을 위해 더 깊은 레이어의 필요성을 줄입니다. CNN은 유사한 것을 달성하기 위해 훨씬 더 깊은 아키텍처가 필요합니다. 표현 능력으로 인해 계산 비용이 증가합니다.
게다가 CNN은 전역 수준의 이미지 패턴을 캡처할 수 없습니다. 필터는 이미지의 로컬 영역에 초점을 맞춥니다. 이해하려면 전체 이미지 또는 먼 관계, CNN은 여러 레이어를 쌓아 올리는 데 의존합니다. 풀링하여 시야를 확장합니다. 그러나 이 프로세스는 세부 사항을 단계별로 집계하므로 전체 정보가 손실됩니다.
반면 ViTs는 이미지를 다음과 같은 패치로 나눕니다. 개별 입력 토큰으로 처리됩니다. Self Attention을 사용하여 ViT는 비교합니다. 모든 패치를 동시에 확인하고 서로 어떻게 관련되는지 알아보세요. 이를 통해 없이 전체 이미지의 패턴과 종속성을 캡처합니다. 층별로 쌓아가세요.
더 진행하기 전에 귀납적 편향의 개념을 이해하는 것이 중요합니다. 귀납적 편향은 모델이 데이터에 대해 만드는 가정을 나타냅니다. 구조; 훈련 중에 이는 모델이 더욱 일반화되고 편견을 줄이세요. CNN에서 귀납적 편향에는 다음이 포함됩니다.
이러한 편향은 CNN을 이미지 작업에 매우 효율적으로 만듭니다. 본질적으로 이미지의 공간적, 구조적 활용을 위해 설계되었습니다.
ViT(Vision Transformer)는 CNN보다 이미지별 유도 편향이 훨씬 적습니다. In ViTs:
Vision Transformers는 표준 Transformer 아키텍처를 사용합니다. 1D 텍스트 시퀀스용으로 개발되었습니다. 2D 이미지를 처리하려면 P P 픽셀과 같이 고정된 크기의 더 작은 패치로 분할됩니다. 벡터로 평면화됩니다. 이미지의 크기가 H W이고 C인 경우 채널의 경우 총 패치 수는 N = H W / P P 유효합니다. Transformer의 입력 시퀀스 길이입니다. 이러한 평평한 패치는 다음과 같습니다. 그런 다음 패치 임베딩이라고 하는 고정 차원 공간 D에 선형으로 투영됩니다.
BERT의 [CLS] 토큰과 유사한 특수 학습 가능 토큰은 다음과 같습니다. 패치 임베딩 시퀀스 앞에 추가됩니다. 이 토큰은 다음을 학습합니다. 나중에 분류에 사용되는 전역 이미지 표현입니다. 또한 위치 임베딩이 패치 임베딩에 추가되어 위치 정보를 인코딩하여 모델이 공간을 이해하도록 돕습니다.
임베딩 시퀀스는 MSA(Multi-Headed Self-Attention)와 MLP 블록이라고도 하는 피드포워드 신경망이라는 두 가지 주요 작업을 번갈아 수행하는 Transformer 인코더를 통해 전달됩니다. 각 레이어에는 LN(레이어 정규화)이 포함되어 있습니다. 이러한 작업 및 잔여 연결이 추가되기 전에 적용됨 이후 훈련을 안정화한다. Transformer 인코더의 출력, 특히 [CLS] 토큰의 상태는 이미지의 상태로 사용됩니다.
분류를 위해 최종 [CLS] 토큰에 간단한 헤드를 추가합니다. 작업. 사전 훈련 중에 이 머리는 작은 다층 퍼셉트론입니다. (MLP), 미세 조정 중에는 일반적으로 단일 선형 레이어입니다. 이것 아키텍처를 통해 ViT는 글로벌 관계를 효과적으로 모델링할 수 있습니다. 패치 사이에서 이미지에 대한 self-attention의 모든 힘을 활용합니다.
하이브리드 Vision Transformer 모델에서는 직접 분할하는 대신 원시 이미지를 패치로 변환하고 입력 시퀀스는 기능 맵에서 파생됩니다. CNN에서 생성되었습니다. CNN은 이미지를 먼저 처리하여 다음을 추출합니다. 의미 있는 공간적 특징은 패치를 만드는 데 사용됩니다. 이러한 패치는 평면화되어 고정 차원 공간에 투영됩니다. 표준 Vision과 동일한 훈련 가능한 선형 투영을 사용합니다. 트랜스포머. 이 접근 방식의 특별한 경우는 크기가 큰 패치를 사용하는 것입니다. 1×1, 여기서 각 패치는 CNN의 피처맵입니다.
이 경우 피처맵의 공간적 차원은 다음과 같습니다. 평면화되고 결과 시퀀스가 Transformer의 입력 차원. 표준 ViT와 마찬가지로, 유지하기 위해 분류 토큰 및 위치 임베딩이 추가되었습니다. 위치정보를 제공하고 전체적인 이미지 이해를 가능하게 합니다. 이것 하이브리드 접근 방식은 CNN의 로컬 특징 추출 강점을 활용합니다. 이를 의 글로벌 모델링 역량과 결합하면서 Transformers.
다음은 Vision Transformers를 사용하는 방법에 대한 코드 블록입니다. 이미지.
# Install the necessary libraries pip install -q transformers
from transformers import ViTForImageClassification from PIL import Image from transformers import ViTImageProcessor
import requests import torch
# Load the model and move it to ‘GPU’ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224') model.to(device)
# Load the 비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전 to perform predictions url = 'link to your 비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전' 비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전 = Image.open(requests.get(url, stream=True).raw)processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224') inputs = processor(비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전s=비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전, return_tensors="pt").to(device) pixel_values = inputs.pixel_values # print(pixel_values.shape)
ViT 모델이 이미지를 처리합니다. BERT와 유사한 인코더와 최종 은닉 상태 위에 위치한 선형 분류 헤드 [CLS] 토큰입니다.
with torch.no_grad(): outputs = model(pixel_values) logits = outputs.logits# logits.shapeprediction = logits.argmax(-1) print("Predicted class:", model.config.id2label[prediction.item()])
여기 PyTorch를 사용한 기본 ViT(Vision Transformer) 구현. 이것 코드에는 패치 임베딩, 위치 인코딩, 및 Transformer 인코더. 이는 간단한 분류에 사용될 수 있습니다.
import torchimport torch.nn as nnimport torch.nn.functional as Fclass VisionTransformer(nn.Module): def __init__(self, img_size=224, patch_size=16, num_classes=1000, dim=768, depth=12, heads=12, mlp_dim=3072, dropout=0.1): super(VisionTransformer, self).__init__() # Image and patch dimensions assert img_size % patch_size == 0, "Image size must be divisible by patch size" self.num_patches = (img_size // patch_size) ** 2 self.patch_dim = (3 * patch_size ** 2) # Assuming 3 channels (RGB) # Layers self.patch_embeddings = nn.Linear(self.patch_dim, dim) self.position_embeddings = nn.Parameter(torch.randn(1, self.num_patches 1, dim)) self.cls_token = nn.Parameter(torch.randn(1, 1, dim)) self.dropout = nn.Dropout(dropout) # Transformer Encoder self.transformer = nn.TransformerEncoder( nn.TransformerEncoderLayer(d_model=dim, nhead=heads, dim_feedforward=mlp_dim, dropout=dropout), num_layers=depth ) # MLP Head for classification self.mlp_head = nn.Sequential( nn.LayerNorm(dim), nn.Linear(dim, num_classes) ) def forward(self, x): # Flatten patches and embed batch_size, channels, height, width = x.shape patch_size = height // int(self.num_patches ** 0.5) x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size) x = x.contiguous().view(batch_size, 3, patch_size, patch_size, -1) x = x.permute(0, 4, 1, 2, 3).flatten(2).permute(0, 2, 1) x = self.patch_embeddings(x) # Add positional embeddings cls_tokens = self.cls_token.expand(batch_size, -1, -1) x = torch.cat((cls_tokens, x), dim=1) x = x self.position_embeddings x = self.dropout(x) # Transformer Encoder x = self.transformer(x) # Classification Head x = x[:, 0] # CLS token return self.mlp_head(x)# Example usageif __name__ == "__main__": model = VisionTransformer(img_size=224, patch_size=16, num_classes=10, dim=768, depth=12, heads=12, mlp_dim=3072) print(model) dummy_img = torch.randn(8, 3, 224, 224) # Batch of 8 비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전s, 3 channels, 224x224 size preds = model(dummy_img) print(preds.shape) # Output: [8, 10] (Batch size, Number of classes)
위 내용은 비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!