【新智元導讀】近日,何愷明團隊所在的Facebook AI推出ResNeXt-101模型,利用Instagram上的用戶標記圖片作為預訓練數據集,省去了人工標記數據的巨額成本,而且使用中只需微調,性能即超越了ImageNet任務的SOTA水平。

目前,幾乎所有最先進的視覺感知演算法都依賴於相同的範式:(1)在手動注釋的大型圖像分類數據集上預訓練卷積

網路,(2)在較小的特定任務的數據集上微調網路。這個模式已經廣泛使用了好多年,並取得了明顯的進展。比如:物體檢測,語義分割,人體姿勢估計,視頻識別,單眼深度估計等。

事實上,如果沒有有監督式預訓練,很多方法現在還被認為是一種蠻幹 ImageNet數據集實際上是預訓練數據集。我們現在實際上對數據集的預訓練了解相對較少。其原因很多:比如現存的預訓練數據集數量很少,構建新數據集是勞動密集型的工作,需要大量的計算資源來進行實驗。然而,鑒於預訓練過程在機器學習相關領域的核心作用,擴大我們在這一領域的科學知識是非常重要的。

本文試圖通過研究一個未開發的數據體系來解決這個複雜的問題:使用外部社交媒體上數十億的帶有標籤的圖像作為數據源。該數據源具有大而且不斷增長的優點,而且是「免費」注釋的,因為數據不需要手動標記。顯而易見,對這些數據的訓練將產生良好的遷移學習結果。

本文的主要成果是,在不使用手動數據集管理或複雜的數據清理的情況下,利用數千個不同主題標籤作為標記的數十億幅Instagram圖像進行訓練的模型,表現出了優異的傳輸學習性能。在目標檢測和圖像分類任務上實現了對當前SOTA性能的提升。在ImageNet-1k圖像分類數據集上獲得single-crop 最高準確率達到了85.4%,AP達到了45.2%。當在ImageNet-1k上訓練(或預訓練)相同模型時,分數分別為79.8%和43.7%。然而,我們的主要目標是提供關於此前未開發的制度的新實驗數據。為此,我們進行了大量實驗,揭示了一些有趣的趨勢。

表1:圖像分類數據集的摘要。每個數據集標明數據來源和功能(訓練集,驗證集,測試集),圖像數量I和標籤數量L。

ImageNet數據集和模型

除了標準的IN-1k數據集之外,我們還嘗試了包含1420萬幅圖像和22000標籤的完整ImageNet2011完整版本的更大子集。我們構建了包含5k和9k標籤的訓練集和驗證集。

對於5k標籤集組,我們使用現在標準的IN-5k(6.6M訓練圖像)。對於9k標籤集,我們遵循用於構建IN-5k數據集的相同協議,採用下一個最頻繁的4k標籤和所有相關圖像(10.5M訓練圖像)。在兩種情況下,均使用50個圖像進行驗證。

我們使用具有分組卷積層的殘差網路ResNeXt 。實驗中使用ResNeXt-101 32×Cd,它有101層,32組,組寬分別為:4(8B乘加FLOPs,43M參數),8(16B,88M),16(36B,193M), 32(87B,466M)和48(153B,829M)。我們認為實驗結果可以推廣到其他架構。

與ImageNet相比,我們使用的Instagram數據集可能包含每個圖像的多個標籤(因為用戶指定了多個主題標籤)。每個圖像的平均標籤數量因數據集而異;例如,train-IG-1B-17k每個圖像最多包含2個主題標籤。

實驗結果與性能

表2:使用不同規模、不同參數配置的ResNeXt-101模型獲得的不同性能結果比較

圖1:使用不同規模和參數配置的ResNeXt-101模型在ImageNet和Instagram標記數據集的分類性能的比較

運行實例及相關代碼

# Download an example image from the pytorch website
import urllib
url, filename = ("https://github.com/pytorch/hub/raw/master/dog.jpg", "dog.jpg")
try: urllib.URLopener().retrieve(url, filename)
except: urllib.request.urlretrieve(url, filename)
# sample execution (requires torchvision)
from PIL import Image
from torchvision import transforms
input_image = Image.open(filename)
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model

# move the input and model to GPU for speed if available
if torch.cuda.is_available():
input_batch = input_batch.to(cuda)
model.to(cuda)

with torch.no_grad():
output = model(input_batch)
# Tensor of shape 1000, with confidence scores over Imagenets 1000 classes
print(output[0])
# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
print(torch.nn.functional.softmax(output[0], dim=0))

參考鏈接:

PyTorch?

pytorch.org
圖標

論文:

https://arxiv.org/pdf/1805.00932.pdf?

arxiv.org


新智元 · AI_era

每日推送 AI 領域前沿學術解讀、AI 產業最新資訊

戳右上角【+ 關注】↗↗

喜歡請分享、點贊吧

歡迎加編輯微信,爆料、交流、投稿都歡迎~ 微信號:akubineo_


推薦閱讀:
相关文章