日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer

發布時間:2025/3/21 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近打算重新跟著官方教程學習一下caffe,順便也自己翻譯了一下官方的文檔。自己也做了一些標注,都用斜體標記出來了。中間可能額外還加了自己遇到的問題或是運行結果之類的。歡迎交流指正,拒絕噴子!
官方教程的原文鏈接:
http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/pascal-multilabel-with-datalayer.ipynb

事先提醒一下,這個例子最好還是用GPU來跑,像我用筆記本CPU跑花了6個多小時,說多了都是淚。整個例子都是圍繞著多標簽問題進行的,概念不多,不難理解。
另外,實驗中還會使用到PASCAL VOC2012數據集,請事先到他們的官網下載好數據集,不是很大,差不多2G。
官網鏈接:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html

Multilabel classification on PASCAL using python data-layers

在這個教程中我們會在PASCAL VOC2012數據集上做多標簽分類任務。
多標簽分類是多分類的一個推廣,其中每一個實例(圖像)可以屬于很多類。例如,一幅圖片可能同時屬于“海灘”類別和“度假圖片“類別。另一方面,在多分類中,每幅圖像只能屬于一個單獨的類別。
Caffe通過SigmoidCrossEntropyLoss層支持進行多標簽分類,我們將使用Python的data數據層加載數據。當然,數據也可以通過HDF5或者LMDB數據層提供,但是Python的data數據層具有更大的靈活性,這也正是我們選擇它的原因。

1.準備

  • 第一,確保你在編譯caffe時使用了WITH_PYTHON_LAYER := 1
  • 第二,下載好PASCAL VOC 2012。官網鏈接:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html
  • 第三,導入模塊
import sys import osimport numpy as np import os.path as osp import matplotlib.pyplot as plt from copy import copy% matplotlib inline plt.rcParams['figure.figsize'] = (6, 6)# 改成自己的caffe路徑 caffe_root = '/home/xhb/caffe/caffe/' # this file is expected to be in {caffe_root}/examples sys.path.append(caffe_root + 'python') import caffe # If you get "No module named _caffe", either you have not built pycaffe or you have the wrong path.from caffe import layers as L, params as P # Shortcuts to define the net prototxt.# 修改一下當前路徑,修改到caffe/examples路徑下,才能找到pycaffe文件夾 os.chdir(os.path.join(caffe_root, 'examples'))sys.path.append("pycaffe/layers") # the datalayers we will use are in this directory. sys.path.append("pycaffe") # the tools file is in this folderimport tools #this contains some tools that we need
  • 第四,設置數據集的路徑并初始化caffe
# 設置數據集的路徑 pascal_root = osp.join(caffe_root, 'data/pascal/VOC2012')# 定義好PASCAL VOC2012數據集中所以的類,后面會用到 classes = np.asarray(['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'])# 確保我們已經下載好權重文件 if not os.path.isfile(caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'):print("Downloading pre-trained CaffeNet model...")!../scripts/download_model_binary.py ../models/bvlc_reference_caffenet# 我們使用CPU模式 caffe.set_mode_cpu() # # initialize caffe for gpu mode # caffe.set_mode_gpu() # caffe.set_device(0)

2.在prototxt文件中定義網絡

  • 剛開始,我們用caffe.NetSpec來定義網絡。注意一下我們怎么使用SigmoidCrossEntropyLoss層的。還要注意一下數據層是如何定義的。
# 卷積層 + relu單元 def conv_relu(bottom, ks, nout, stride=1, pad=0, group=1):conv = L.Convolution(bottom, kernel_size=ks, stride=stride,num_output=nout, pad=pad, group=group)return conv, L.ReLU(conv, in_place=True)# 全連接層 + relu單元 def fc_relu(bottom, nout):fc = L.InnerProduct(bottom, num_output=nout)return fc, L.ReLU(fc, in_place=True)# 最大池化 def max_pool(bottom, ks, stride=1):return L.Pooling(bottom, pool=P.Pooling.MAX, kernel_size=ks, stride=stride)# 主要網絡 def caffenet_multilabel(data_layer_params, datalayer):# 設置python數據層n = caffe.NetSpec()n.data, n.label = L.Python(module='pascal_multilabel_datalayers', layer=datalayer,ntop=2, param_str=str(data_layer_params))# 網絡結構n.conv1, n.relu1 = conv_relu(n.data, 11, 96, stride=4)n.pool1 = max_pool(n.relu1, 3, stride=2)n.norm1 = L.LRN(n.pool1, local_size=5, alpha=1e-4, beta=0.75)n.conv2, n.relu2 = conv_relu(n.norm1, 5, 256, pad=2, group=2)n.pool2 = max_pool(n.relu2, 3, stride=2)n.norm2 = L.LRN(n.pool2, local_size=5, alpha=1e-4, beta=0.75)n.conv3, n.relu3 = conv_relu(n.norm2, 3, 384, pad=1)n.conv4, n.relu4 = conv_relu(n.relu3, 3, 384, pad=1, group=2)n.conv5, n.relu5 = conv_relu(n.relu4, 3, 256, pad=1, group=2)n.pool5 = max_pool(n.relu5, 3, stride=2)n.fc6, n.relu6 = fc_relu(n.pool5, 4096)n.drop6 = L.Dropout(n.relu6, in_place=True)n.fc7, n.relu7 = fc_relu(n.drop6, 4096)n.drop7 = L.Dropout(n.relu7, in_place=True)n.score = L.InnerProduct(n.drop7, num_output=20)n.loss = L.SigmoidCrossEntropyLoss(n.score, n.label)return str(n.to_proto())

3.編寫網絡和solver文件

  • 現在我們可以創建網絡和solver的prototxt文件了。我們使用前面導入的tools模塊中的CaffeSolver類來定義solver。
workdir = './pascal_multilabel_with_datalayer' if not os.path.isdir(workdir):os.makedirs(workdir) solverprototxt = tools.CaffeSolver(trainnet_prototxt_path=os.path.join(workdir, "trainnet.prototxt"), testnet_prototxt_path=os.path.join(workdir, "valnet.prototxt")) solverprototxt.sp['display'] = "1" solverprototxt.sp['base_lr'] = "0.0001" solverprototxt.write(os.path.join(workdir, 'solver.prototxt'))# 訓練網絡 with open(os.path.join(workdir, 'trainnet.prototxt'), 'w') as f:# provide parameters to the data layer as a python dictionary. Easy as pie!data_layer_params = dict(batch_size=128, im_shape=[227,227], split='train', pascal_root=pascal_root)f.write(caffenet_multilabel(data_layer_params, 'PascalMultilabelDataLayerSync'))# 測試網絡 with open(os.path.join(workdir, 'valnet.prototxt'), 'w') as f:data_layer_params = dict(batch_size=128, im_shape=[227,227], split='val', pascal_root=pascal_root)f.write(caffenet_multilabel(data_layer_params, 'PascalMultilabelDataLayerSync'))
  • 這個網絡使用了Python的數據層PascalMultilabelDataLayerSync,定義在./pycaffe/layers/pascal_multilabel_datalayers.py、
  • 再看看代碼,它很直白,你也可以很容易地控制標簽和數據。
  • 現在我們可以像往常一樣導入caffe的solver了。

注:如果在運行時遇到錯誤請注意:在這一步之前請確保編譯caffe時,使用了WITH_PYTHON_LAYER := 1,否則運行后,會報錯,提示說找不到layer類型:python;如果是在notebook中運行,并不會提示這些信息,程序會直接停止然后重啟python內核。

# print os.path.join(workdir, 'solver.prototxt') # solver_path = os.path.join(caffe_root, 'examples', 'pascal_multilabel_with_datalayer', 'solver.prototxt') solver = caffe.SGDSolver(os.path.join(workdir, 'solver.prototxt')) # solver = caffe.SGDSolver(solver_path) solver.net.copy_from(caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel') solver.test_nets[0].share_with(solver.net) solver.step(1) BatchLoader initialized with 5717 images PascalMultilabelDataLayerSync initialized for split: train, with bs: 128, im_shape: [227, 227]. BatchLoader initialized with 5823 images PascalMultilabelDataLayerSync initialized for split: val, with bs: 128, im_shape: [227, 227].
  • 我們再來看看導入的數據。
transformer = tools.SimpleTransformer()# This is simply to add back the bias, re-shuffle the color channels to RGB, and so on... image_index = 0 plt.figure() plt.imshow(transformer.deprocess(copy(solver.net.blobs['data'].data[image_index, ...]))) gtlist = solver.net.blobs['label'].data[image_index, ...].astype(np.int) plt.title('GT: {}'.format(classes[np.where(gtlist)])) plt.axis('off') (-0.5, 226.5, 226.5, -0.5)

注:我們是直接從網絡的data層讀取出來的圖像,由于經過了預處理操作,所以這里圖片的分辨率是比原始的PASCAL VOC數據集的圖片更低的

4.訓練網絡

  • 接下來開始訓練網絡。首先,我們需要一些方法來測量準確率。漢明距離經常用于多標簽問題。我們還需要一個循環來測試網絡性能。開始敲代碼吧。
def hamming_distance(gt, est):return sum([1 for (g, e) in zip(gt, est) if g == e]) / float(len(gt))def check_accuracy(net, num_batches, batch_size=128):acc = 0.0for t in range(num_batches):net.forward()gts = net.blobs['label'].dataests = net.blobs['score'].data > 0for gt, est in zip(gts, ests):#for each ground truth and estimated label vectoracc += hamming_distance(gt, est)return acc / (num_batches * batch_size)
  • 好的,接下來訓練一段時間。
for it in range(6):solver.step(100)print 'iter:{:3d}'.format((it+1) * 100), 'accuracy:{0:.4f}'.format(check_accuracy(solver.test_nets[0], 50)) iter:100 accuracy:0.9523 iter:200 accuracy:0.9569 iter:300 accuracy:0.9580 iter:400 accuracy:0.9586 iter:500 accuracy:0.9591 iter:600 accuracy:0.9593
  • 很棒,看起來準確率在增長,而且看起來也很快地收斂了。看起來很奇怪,準確率一開始就如此之高,這是因為,它的ground truth分布很稀疏。PASCAL數據集有20個類,通常每幅圖片就只會屬于一個或者兩個類而已,因此預測所有輸出為0的區域會有很高的準確率。下面來確認一下。
def check_baseline_accuracy(net, num_batches, batch_size=128):acc = 0.0for t in range(num_batches):net.forward()gts = net.blobs['label'].dataests = np.zeros((batch_size, len(gts)))for gt, est in zip(gts, ests):acc += hamming_distance(gt, est)return acc / (num_batches * batch_size)print 'Baseline accuracy:{0:.4f}'.format(check_baseline_accuracy(solver.test_nets[0], 5823/128)) Baseline accuracy:0.9240

6.一些預測結果

test_net = solver.test_nets[0] for image_index in range(5):plt.figure()plt.imshow(transformer.deprocess(copy(test_net.blobs['data'].data[image_index, ...])))gtlist = test_net.blobs['label'].data[image_index, ...].astype(np.int)estlist = test_net.blobs['score'].data[image_index, ...] > 0plt.title('GT: {} \n EST: {}'.format(classes[np.where(gtlist)], classes[np.where(estlist)]))plt.axis('off')

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男女黄色又爽大片 | 亚洲欧美在线视频 | av最新版天堂资源在线 | 国产97视频 | 色香欲综合网 | 在线天堂6 | 香港一级淫片免费放 | 青青草免费观看视频 | 国产成人免费观看视频 | 国产精品日日摸天天碰 | 欧美大片免费看 | 久久曰视频 | 黄色小视频网 | h片在线播放| 久久成人综合网 | 美女视频在线免费观看 | 艳妇臀荡乳欲伦交换电影 | 蜜臀人妻四季av一区二区不卡 | 成年人在线视频网站 | 爆乳熟妇一区二区三区 | 最新色站 | 欧美日韩在线二区 | 伊人涩涩 | 国产精品日日做人人爱 | 天堂在线资源8 | 丁香六月激情 | 国产理论av | 成人三级黄色片 | 欧美一二| 午夜伦理在线观看 | 亚洲精品网站在线观看 | 黄色a在线 | 日日夜夜综合网 | 日本少妇激三级做爰在线 | 国产农村妇女精品一二区 | 欧美精品做受xxx性少妇 | 国产伦精品一区二区三区高清版禁 | 欧美伦理一区二区三区 | 婷婷色中文 | 日韩黄色免费看 | 真人毛片97级无遮挡精品 | 久久综合婷婷 | 一级视频在线免费观看 | 亚洲人人在线 | 毛片av在线 | 精品人妻互换一区二区三区 | 日韩欧美www| 亚洲色图35p | 日韩熟妇一区二区三区 | 麻豆av网站 | 24小时日本在线www免费的 | 国产一区二区三区中文字幕 | 一区二区高清在线 | 国产黄色视 | 国产麻豆成人传媒免费观看 | 美女被娇喘视频 | 天天做天天射 | 久久爱一区二区 | av黄色免费网站 | jizz日本免费 | 欧美图片一区二区 | 色综合色综合 | 中文字幕一区二区三区免费 | 日韩污污 | 日韩久久中文字幕 | 懂色视频在线观看 | www.亚洲激情| 中文字幕亚洲综合 | 91爱国产 | 不用播放器av | 中文字幕 日本 | 久草热在线视频 | 精品国产一二三四区 | 亚洲精品视频网 | 欧美一级一区二区 | 亚洲色图丝袜 | 永久av| 日韩精品91 | 丁香激情综合 | 国产探花精品在线 | 亚洲人午夜射精精品日韩 | 欧美亚洲中文精品字幕 | 女人囗交吞精囗述 | 国产精品丝袜 | 亚洲国产免费视频 | 中文字幕日韩欧美一区二区 | 肉丝超薄少妇一区二区三区 | 五月天中文字幕在线 | 亚洲一区二区三区四区五区六区 | 日韩av电影在线播放 | 亚洲色图 校园春色 | 妺妺窝人体色777777 | 国产黄色在线网站 | 中文国语毛片高清视频 | 成人在线免费网址 | 久久久国产精华液 | av在线影片 | 91新网站 | 久久丝袜美腿 |