【新智元導讀】近日,何愷明團隊所在的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%。然而,我們的主要目標是提供關於此前未開發的制度的新實驗數據。為此,我們進行了大量實驗,揭示了一些有趣的趨勢。
除了標準的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個主題標籤。
# 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))
參考鏈接:
論文:
新智元 · AI_era
每日推送 AI 領域前沿學術解讀、AI 產業最新資訊
戳右上角【+ 關注】↗↗
喜歡請分享、點贊吧
歡迎加編輯微信,爆料、交流、投稿都歡迎~ 微信號:akubineo_