1. 深度學習,包括哪些
作為人工智慧最稀缺的人才之一,深度學習工程師面臨近百萬的缺口,成為了各大企業競相爭奪的香餑餑,月薪大都在30K-80K之間。越來越多的程序員、院校學生開始學習深度學習演算法。
可以說,如果你想要提升技能,在專業領域更上一步,《AI深度學習》可以成為你當下的選擇!
2. caffe中怎麼固定前面的網路參數,訓練後面層的參數
1、會更新,finetune的過程相當於繼續訓練,跟直接訓練的區別是初始化的時候:
a. 直接訓練是按照網路定義指定的方式初始化(如高斯隨機初始化)
b. finetune是用你已經有的參數文件來初始化(就是之前訓練好的caffemodel)
2、嗯,這個問題有兩種情況:比如有4個全連接層A->B->C->D
a. 你希望C層的參數不會改變,C前面的AB層的參數也不會改變,這種情況也就是D層的梯度不往前反向傳播到D層的輸入blob(也就是C層的輸出blob 沒有得到梯度),你可以通過設置D層的propagate_down為false來做到。
propagate_down的數量與輸入blob的數量相同,假如你某個層有2個輸入blob,那麼你應該在該layer的Param裡面寫上兩行:
propagate_down : 0 # 第1個輸入blob不會得到反向傳播的梯度
propagate_down : 0 # 第2個輸入blob不會得到反向傳播的梯度
這樣的話,你這個layer的梯度就不會反向傳播啦,前面的所有layer的參數也就不會改變了
b. 你希望C層的參數不會改變,但是C前面的AB層的參數會改變,這種情況,只是固定了C層的參數,C層得到的梯度依然會反向傳播給前面的B層。只需要將對應的參數blob的學習率調整為0:
你在layer裡面加上param { lr_mult: 0 }就可以了,比如全連接層裡面:
layer {
type: "InnerProct"
param { # 對應第1個參數blob的配置,也就是全連接層的參數矩陣的配置
lr_mult: 0 # 學習率為0,其他參數可以看caffe.proto裡面的ParamSpec這個類型
}
param { # 對應第2個參數blob的配置,也就是全連接層的偏置項的配置
lr_mult: 0 # 學習率為0
}
}
不知道這樣說你能不能理解
3. 數據增強的方法有哪些
1 什麼是數據增強?
數據增強也叫數據擴增,意思是在不實質性的增加數據的情況下,讓有限的數據產生等價於更多數據的價值。
比如上圖,第1列是原圖,後面3列是對第1列作一些隨機的裁剪、旋轉操作得來。
每張圖對於網路來說都是不同的輸入,加上原圖就將數據擴充到原來的10倍。假如我們輸入網路的圖片的解析度大小是256×256,若採用隨機裁剪成224×224的方式,那麼一張圖最多可以產生32×32張不同的圖,數據量擴充將近1000倍。雖然許多的圖相似度太高,實際的效果並不等價,但僅僅是這樣簡單的一個操作,效果已經非凡了。
如果再輔助其他的數據增強方法,將獲得更好的多樣性,這就是數據增強的本質。
數據增強可以分為,有監督的數據增強和無監督的數據增強方法。其中有監督的數據增強又可以分為單樣本數據增強和多樣本數據增強方法,無監督的數據增強分為生成新的數據和學習增強策略兩個方向。
2 有監督的數據增強
有監督數據增強,即採用預設的數據變換規則,在已有數據的基礎上進行數據的擴增,包含單樣本數據增強和多樣本數據增強,其中單樣本又包括幾何操作類,顏色變換類。
2.1. 單樣本數據增強
所謂單樣本數據增強,即增強一個樣本的時候,全部圍繞著該樣本本身進行操作,包括幾何變換類,顏色變換類等。
(1) 幾何變換類
幾何變換類即對圖像進行幾何變換,包括翻轉,旋轉,裁剪,變形,縮放等各類操作,下面展示其中的若干個操作。
水平翻轉和垂直翻轉
隨機旋轉
隨機裁剪
變形縮放
翻轉操作和旋轉操作,對於那些對方向不敏感的任務,比如圖像分類,都是很常見的操作,在caffe等框架中翻轉對應的就是mirror操作。
翻轉和旋轉不改變圖像的大小,而裁剪會改變圖像的大小。通常在訓練的時候會採用隨機裁剪的方法,在測試的時候選擇裁剪中間部分或者不裁剪。值得注意的是,在一些競賽中進行模型測試時,一般都是裁剪輸入的多個版本然後將結果進行融合,對預測的改進效果非常明顯。
以上操作都不會產生失真,而縮放變形則是失真的。
很多的時候,網路的訓練輸入大小是固定的,但是數據集中的圖像卻大小不一,此時就可以選擇上面的裁剪成固定大小輸入或者縮放到網路的輸入大小的方案,後者就會產生失真,通常效果比前者差。
(2) 顏色變換類
上面的幾何變換類操作,沒有改變圖像本身的內容,它可能是選擇了圖像的一部分或者對像素進行了重分布。如果要改變圖像本身的內容,就屬於顏色變換類的數據增強了,常見的包括雜訊、模糊、顏色變換、擦除、填充等等。
基於雜訊的數據增強就是在原來的圖片的基礎上,隨機疊加一些雜訊,最常見的做法就是高斯雜訊。更復雜一點的就是在面積大小可選定、位置隨機的矩形區域上丟棄像素產生黑色矩形塊,從而產生一些彩色雜訊,以Coarse Dropout方法為代表,甚至還可以對圖片上隨機選取一塊區域並擦除圖像信息。
添加Coarse Dropout雜訊
顏色變換的另一個重要變換是顏色擾動,就是在某一個顏色空間通過增加或減少某些顏色分量,或者更改顏色通道的順序。
顏色擾動
還有一些顏色變換,本文就不再詳述。
幾何變換類,顏色變換類的數據增強方法細致數還有非常多,推薦給大家一個git項目:
https://github.com/aleju/imgaug
預覽一下它能完成的數據增強操作吧。
2.2. 多樣本數據增強
不同於單樣本數據增強,多樣本數據增強方法利用多個樣本來產生新的樣本,下面介紹幾種方法。
(1) SMOTE[1]
SMOTE即Synthetic Minority Over-sampling Technique方法,它是通過人工合成新樣本來處理樣本不平衡問題,從而提升分類器性能。
類不平衡現象是很常見的,它指的是數據集中各類別數量不近似相等。如果樣本類別之間相差很大,會影響分類器的分類效果。假設小樣本數據數量極少,如僅占總體的1%,則即使小樣本被錯誤地全部識別為大樣本,在經驗風險最小化策略下的分類器識別准確率仍能達到99%,但由於沒有學習到小樣本的特徵,實際分類效果就會很差。
SMOTE方法是基於插值的方法,它可以為小樣本類合成新的樣本,主要流程為:
第一步,定義好特徵空間,將每個樣本對應到特徵空間中的某一點,根據樣本不平衡比例確定好一個采樣倍率N;
第二步,對每一個小樣本類樣本(x,y),按歐氏距離找出K個最近鄰樣本,從中隨機選取一個樣本點,假設選擇的近鄰點為(xn,yn)。在特徵空間中樣本點與最近鄰樣本點的連線段上隨機選取一點作為新樣本點,滿足以下公式:
第三步,重復以上的步驟,直到大、小樣本數量平衡。
該方法的示意圖如下。
在python中,SMOTE演算法已經封裝到了imbalanced-learn庫中,如下圖為演算法實現的數據增強的實例,左圖為原始數據特徵空間圖,右圖為SMOTE演算法處理後的特徵空間圖。
(2) SamplePairing[2]
SamplePairing方法的原理非常簡單,從訓練集中隨機抽取兩張圖片分別經過基礎數據增強操作(如隨機翻轉等)處理後經像素以取平均值的形式疊加合成一個新的樣本,標簽為原樣本標簽中的一種。這兩張圖片甚至不限制為同一類別,這種方法對於醫學圖像比較有效。
經SamplePairing處理後可使訓練集的規模從N擴增到N×N。實驗結果表明,因SamplePairing數據增強操作可能引入不同標簽的訓練樣本,導致在各數據集上使用SamplePairing訓練的誤差明顯增加,而在驗證集上誤差則有較大幅度降低。
盡管SamplePairing思路簡單,性能上提升效果可觀,符合奧卡姆剃刀原理,但遺憾的是可解釋性不強。
(3) mixup[3]
mixup是Facebook人工智慧研究院和MIT在「Beyond Empirical Risk Minimization」中提出的基於鄰域風險最小化原則的數據增強方法,它使用線性插值得到新樣本數據。
令(xn,yn)是插值生成的新數據,(xi,yi)和(xj,yj)是訓練集隨機選取的兩個數據,則數據生成方式如下
λ的取值范圍介於0到1。提出mixup方法的作者們做了豐富的實驗,實驗結果表明可以改進深度學習模型在ImageNet數據集、CIFAR數據集、語音數據集和表格數據集中的泛化誤差,降低模型對已損壞標簽的記憶,增強模型對對抗樣本的魯棒性和訓練生成對抗網路的穩定性。
SMOTE,SamplePairing,mixup三者思路上有相同之處,都是試圖將離散樣本點連續化來擬合真實樣本分布,不過所增加的樣本點在特徵空間中仍位於已知小樣本點所圍成的區域內。如果能夠在給定范圍之外適當插值,也許能實現更好的數據增強效果。
3 無監督的數據增強
無監督的數據增強方法包括兩類:
(1) 通過模型學習數據的分布,隨機生成與訓練數據集分布一致的圖片,代表方法GAN[4]。
(2) 通過模型,學習出適合當前任務的數據增強方法,代表方法AutoAugment[5]。
3.1 GAN
關於GAN(generative adversarial networks),我們已經說的太多了。它包含兩個網路,一個是生成網路,一個是對抗網路,基本原理如下:
(1) G是一個生成圖片的網路,它接收隨機的雜訊z,通過雜訊生成圖片,記做G(z) 。
(2) D是一個判別網路,判別一張圖片是不是「真實的」,即是真實的圖片,還是由G生成的圖片。
GAN的以假亂真能力就不多說了。
2 Autoaugmentation[5]
AutoAugment是Google提出的自動選擇最優數據增強方案的研究,這是無監督數據增強的重要研究方向。它的基本思路是使用增強學習從數據本身尋找最佳圖像變換策略,對於不同的任務學習不同的增強方法,流程如下:
(1) 准備16個常用的數據增強操作。
(2) 從16個中選擇5個操作,隨機產生使用該操作的概率和相應的幅度,將其稱為一個sub-policy,一共產生5個sub-polices。
(3) 對訓練過程中每一個batch的圖片,隨機採用5個sub-polices操作中的一種。
(4) 通過模型在驗證集上的泛化能力來反饋,使用的優化方法是增強學習方法。
(5) 經過80~100個epoch後網路開始學習到有效的sub-policies。
(6) 之後串接這5個sub-policies,然後再進行最後的訓練。
總的來說,就是學習已有數據增強的組合策略,對於門牌數字識別等任務,研究表明剪切和平移等幾何變換能夠獲得最佳效果。
4. TensorFlow的優勢和缺點有哪些
TensorFlow框架的前身是Google的DistBelief V2,是谷歌大腦項目的深度網路工具庫,一些人認為TensorFlow是借鑒Theano重構的。
Tensorflow一經開源,馬上引起了大量開發者的跟進。Tensorflow廣泛支持包括圖像、手寫字、語音識別、預測和自然語言處理等大量功能。TensorFlow遵循Apache 2.0開源協議。
TensorFlow在2017年2月15號發布了其1.0版本,這個版本是對先前八個不完善版本的整合。以下是TensorFlow取得成功的一些列原因:
TensorFLow提供這些工具:
TensorBroad是一個設計優良的可視化網路構建和展示工具;
TensorFlow Serving通過保持相同的伺服器架構和API,可以方便地配置新演算法和環境。TensorFlow Serving 還提供開箱即用的模型,並且可以輕松擴展以支持其他的模型和數據。
TensorFlow編程介麵包括Python和C++,java,Go,R和Haskell語言的介面也在alpha版中支持。另外,TensorFlow還支持谷歌和亞馬遜的雲環境。
TensorFlow的0.12版本支持Windows 7, 8, Server 2016系統。由於採用C++ Eigen庫,TensorFlow類庫可以在ARM架構平台上編譯和優化。這意味著你可以不需要額外實現模型解碼器或者Python解釋器就可以在多種伺服器和移動設備上部署訓練好的模型。
TensorFlow提供細致的網路層使用戶可以構建新的復雜的層結構而不需要自己從底層實現它們。子圖允許用戶查看和恢復圖的任意邊的數據。這對復雜計算的Debug非常有用。
分布式TensorFlow在0.8版本推出,提供了並行計算支持,可以讓模型的不同 部分在不同設備上並行訓練。
TensorFlow在斯坦福大學,伯克利學院,多倫多大學和Udacity(2016年3月成立的在線學校)均有教學。
TensorFlow的缺點有:
每個計算流必須構建成圖,沒有符號循環,這樣使得一些計算變得困難;
沒有三維卷積,因此無法做視頻識別;
即便已經比原有版本(0.5)快了58倍,但執行性能仍然不及它的競爭者。
5. 15 個開源的頂級人工智慧工具
斯坦福的專家在人工智慧報告中得出的結論:"越來越強大的人工智慧應用,可能會對我們的 社會 和經濟產生深遠的積極影響,這將出現在從現在到2030年的時間段里。"
以下這些開源人工智慧應用都處於人工智慧研究的最前沿。
1.Caffe
它是由賈揚清在加州大學伯克利分校的讀博時創造的,Caffe是一個基於表達體系結構和可擴展代碼的深度學習框架。使它聲名鵲起的是它的速度,這讓它受到研究人員和企業用戶的歡迎。根據其網站所言,它可以在一天之內只用一個NVIDIA K40 GPU處理6000萬多個圖像。它是由伯克利視野和學習中心(BVLC)管理的,並且由NVIDIA和亞馬遜等公司資助來支持它的發展。
2. CNTK
它是計算機網路工具包(Computational Network Tookit)的縮寫,CNTK是一個微軟的開源人工智慧工具。不論是在單個CPU、單個GPU、多個GPU或是擁有多個GPU的多台機器上它都有優異的表現。微軟主要用它做語音識別的研究,但是它在機器翻譯、圖像識別、圖像字幕、文本處理、語言理解和語言建模方面都有著良好的應用。
3.Deeplearning4j
Deeplearning4j是一個java虛擬機(JVM)的開源深度學習庫。它運行在分布式環境並且集成在Hadoop和Apache Spark中。這使它可以配置深度神經網路,並且它與Java、Scala和其他JVM語言兼容。
4.DMTK
DMTK分布式集齊學習工具(Distributed Machine Learning Toolkit)的縮寫,和CNTK一樣,是微軟的開源人工智慧工具。作為設計用於大數據的應用程序,它的目標是更快的訓練人工智慧系統。它包括三個主要組件:DMTK框架、LightLDA主題模型演算法和分布式(多義)字嵌入演算法。為了證明它的速度,微軟聲稱在一個八集群的機器上,它能夠"用100萬個主題和1000萬個單詞的詞彙表(總共10萬億參數)訓練一個主題模型,在一個文檔中收集1000億個符號,"。這一成績是別的工具無法比擬的。
5.H20
相比起科研,H2O更注重將AI服務於企業用戶,因此H2O有著大量的公司客戶,比如第一資本金融公司、思科、Nielsen Catalina、PayPal和泛美都是它的用戶。它聲稱任何人都可以利用機器學習和預測分析的力量來解決業務難題。它可以用於預測建模、風險和欺詐分析、保險分析、廣告技術、醫療保健和客戶情報。
它有兩種開源版本:標准版H2O和Sparking Water版,它被集成在Apache Spark中。也有付費的企業用戶支持。
6.Mahout
它是Apache基金會項目,Mahout是一個開源機器學習框架。根據它的網站所言,它有著三個主要的特性:一個構建可擴展演算法的編程環境、像Spark和H2O一樣的預制演算法工具和一個叫Samsara的矢量數學實驗環境。使用Mahout的公司有Adobe、埃森哲咨詢公司、Foursquare、英特爾、領英、Twitter、雅虎和其他許多公司。其網站列了出第三方的專業支持。
7.MLlib
由於其速度,Apache Spark成為一個最流行的大數據處理工具。MLlib是Spark的可擴展機器學習庫。它集成了Hadoop並可以與NumPy和R進行交互操作。它包括了許多機器學習演算法如分類、回歸、決策樹、推薦、集群、主題建模、功能轉換、模型評價、ML管道架構、ML持久、生存分析、頻繁項集和序列模式挖掘、分布式線性代數和統計。
8.NuPIC
由Numenta公司管理的NuPIC是一個基於分層暫時記憶理論的開源人工智慧項目。從本質上講,HTM試圖創建一個計算機系統來模仿人類大腦皮層。他們的目標是創造一個"在許多認知任務上接近或者超越人類認知能力"的機器。
除了開源許可,Numenta還提供NuPic的商業許可協議,並且它還提供技術專利的許可證。
9.OpenNN
作為一個為開發者和科研人員設計的具有高級理解力的人工智慧,OpenNN是一個實現神經網路演算法的c++編程庫。它的關鍵特性包括深度的架構和快速的性能。其網站上可以查到豐富的文檔,包括一個解釋了神經網路的基本知識的入門教程
10.OpenCyc
由Cycorp公司開發的OpenCyc提供了對Cyc知識庫的訪問和常識推理引擎。它擁有超過239,000個條目,大約2,093,000個三元組和大約69,000 owl:這是一種類似於鏈接到外部語義庫的命名空間。它在富領域模型、語義數據集成、文本理解、特殊領域的專家系統和 游戲 AI中有著良好的應用。該公司還提供另外兩個版本的Cyc:一個可免費的用於科研但是不開源,和一個提供給企業的但是需要付費。
11.Oryx 2
構建在Apache Spark和Kafka之上的Oryx 2是一個專門針對大規模機器學習的應用程序開發框架。它採用一個獨特的三層λ架構。開發者可以使用Orys 2創建新的應用程序,另外它還擁有一些預先構建的應用程序可以用於常見的大數據任務比如協同過濾、分類、回歸和聚類。大數據工具供應商Cloudera創造了最初的Oryx 1項目並且一直積極參與持續發展。
12.PredictionIO
今年的二月,Salesforce收購了PredictionIO,接著在七月,它將該平台和商標貢獻給Apache基金會,Apache基金會將其列為孵育計劃。所以當Salesforce利用PredictionIO技術來提升它的機器學習能力時,成效將會同步出現在開源版本中。它可以幫助用戶創建帶有機器學習功能的預測引擎,這可用於部署能夠實時動態查詢的Web服務。
13.SystemML
最初由IBM開發,SystemML現在是一個Apache大數據項目。它提供了一個高度可伸縮的平台,可以實現高等數學運算,並且它的演算法用R或一種類似python的語法寫成。企業已經在使用它來跟蹤 汽車 維修客戶服務、規劃機場交通和連接 社會 媒體數據與銀行客戶。它可以在Spark或Hadoop上運行。
14.TensorFlow
TensorFlow是一個谷歌的開源人工智慧工具。它提供了一個使用數據流圖進行數值計算的庫。它可以運行在多種不同的有著單或多CPU和GPU的系統,甚至可以在移動設備上運行。它擁有深厚的靈活性、真正的可移植性、自動微分功能,並且支持Python和c++。它的網站擁有十分詳細的教程列表來幫助開發者和研究人員沉浸於使用或擴展他的功能。
15.Torch
Torch將自己描述為:"一個優先使用GPU的擁有機器學習演算法廣泛支持的科學計算框架",它的特點是靈活性和速度。此外,它可以很容易的通過軟體包用於機器學習、計算機視覺、信號處理、並行處理、圖像、視頻、音頻和網路等方面。它依賴一個叫做LuaJIT的腳本語言,而LuaJIT是基於Lua的。
歡迎關注~
微信公眾號: IT百戰程序員 ,免費提供人工智慧、大數據、雲計算等資料~~不管你在地球哪個方位,歡迎你的關注!
6. caffe windows10 vs2013怎麼配置
1.配置環境
我在自己的筆記本配置的caffe,配置的環境為:Windows 7 64位 + cuda6.5 + Opencv2.49 +VS2013。假設在配置caffe之前,你已經准備好這些。
本文中將給出一些編譯好的依賴庫,如果你也是用的Windows 7 64位+VS2013,可以直接使用。
2.准備依賴庫
在Windows下配置caffe,一個很主要的問題就是依賴庫的編譯。不像在Ubuntu下那麼方便,在Windows下,依賴庫都需要使用vs2013進行編譯才能使用。下面我將介紹caffe需要的依賴庫(如果你也是win7 64位+VS2013,可以直接使用我提供的依賴庫)。
2.1 boost
boost可以下載源碼進行編譯,也可以直接下載安裝文件。我使用的是後者,方便、快捷。
我使用的是:boost_1.56_0-msvc-12.0-64.exe
注意下載適合你的配置環境的boost版本即可。
下載完畢,雙擊運行安裝文件即可。
2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas
這一部分的很多都是谷歌的開源庫,不容易下載(你懂的)。所以我使用的是Neil Z. SHAO『s Blog
提供的編譯好的。
下載完,解壓得到3rdparty文件夾。在下一段將會用到。
3.建立caffe工程
准備好了caffe需要的依賴庫和環境之後,下面就可以建立caffe的vs項目,進行編譯了。
3.1 下載caffe源碼
可以從caffe的github主頁下載源碼。
下載地址:Caffe』s GitHub
解壓文件,假設caffe源碼所在目錄為CAFFE_ROOT。
3.2 准備項目需要的依賴庫和系統環境變數
經過上一階段的准備,caffe項目所需的依賴庫都已經准備好。
1.首先設置系統環境變數(以我的為例):
CUDA_PATH_V6_5 安裝好cuda6.5之後,會自動添加環境變數CUDA_PATH_V6_5
OPENCV_2_49 D:/Tools/opencv2.49/build/
BOOST_1_56 D:/Tools/boost_1_56_0
2.將3rdparty文件夾放到CAFFE_ROOT
3.3 用vs建立caffe項目
1.用VS2013在CAFFE_ROOT下建立 win32 console application,選擇空項目。
將項目的平台由32位改為64位
2.修改項目屬性
項目——屬性——C/C++——常規——附加包含目錄
添加:
../include;
../src;
../3rdparty/include;
../3rdparty;
../3rdparty/include;
../3rdparty/include/openblas;
../3rdparty/include/hdf5;
../3rdparty/include/lmdb;
../3rdparty/include/leveldb;
../3rdparty/include/gflag;
../3rdparty/include/glog;
../3rdparty/include/google/protobuf;
項目——屬相——VC++目錄——包含目錄
添加:
$(CUDA_PATH_V6_5)\include;
$(OPENCV_2_49)\include;
$(OPENCV_2_49)\include\opencv;
$(OPENCV_2_49)\include\opencv2;
$(BOOST_1_56)
項目——屬性——鏈接器——常規——附加庫目錄
添加:
$(CUDA_PATH_V6_5)\lib\$(PlatformName);
$(OPENCV_2_49)\x64\vc12\lib;
$(BOOST_1_56)\lib64-msvc-12.0;
..\3rdparty\lib;
項目——屬性——鏈接器——輸入——附加依賴項
debug添加:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5_D.lib
libhdf5_hl_D.lib
Shlwapi.lib
gflags.lib
libprotobuf.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
release添加:
opencv_ml249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflags.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
libprotoc.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib
3.4 編譯caffe
配置好caffe項目的屬性之後,下面就可以一步一步的編譯caffe了。
3.4.1 編譯./src中的文件
首先,將../src文件夾中的*.cpp文件添加到工程中。
依次編譯每一個*.cpp文件。
1.編譯blob.cpp
直接編譯時會報錯,缺少文件」caffe\proto\caffe.pb.h」
這個時候需要將proto.exe放到../3rdparty/bin文件夾
將GernaratePB.bat放在../scripts文件夾
運行bat腳本文件即可生成caffe.pb.h
然後就可以成功編譯。
2.編譯common.cpp
直接編譯這個文件,會出現關於getid和fopen_s的錯誤。可通過如下步驟修改:
在代碼前面添加:#include <process.h>
修改項目屬性:項目——屬性——C/C++——預處理器——預處理器定義
添加:_CRT_SECURE_NO_WARNINGS
在代碼中getid的位置進行如下修改:
#ifdef _MSC_VER
pid = getid();
#else
pid = _getid();
#endf
修改完畢之後,可以成功編譯。
3.編譯net.cpp
直接編譯這個文件,會出現關於mkstep、close、mkdtemp的錯誤。需要進行如下修改:
在io.hpp頭文件中添加:#include 「mkstep.h」
在io.hpp頭文件中,在close()的位置進行如下修改:
#ifdef _MSC_VER
close(fd);
#else
_close(fd);
#endif
在mkdtemp的位置進行如下修改:
#ifndef _MSC_VER
char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
#else
errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
#endif
修改完畢,可以成功編譯。
4.編譯solver.cpp
直接編譯會出現關於snprintf的錯誤,需要進行如下修改:
#ifdef _MSC_VER
#define snprinf sprintf_s
#endif
修改完畢,可以成功編譯。
5.其他剩餘的cpp文件也依次編譯
3.4.2 編譯./src/layers中的文件
將./src/layers中的所有的cpp和cu文件都添加到項目中。
右鍵點擊cu文件,修改屬性。
在bnll_layer.cu文件,進行如下修改:
float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0
依次編譯所有的文件。
3.4.3 編譯./src/util中的文件
將./src/util中所有的文件添加到項目
1.在io.cpp中
修改ReadProtoFromBinaryFile函數
O_RDONLY ——> O_RDONLY | O_BINARY
在代碼中進行如下修改:
#ifdef _MSC_VER
#define open _open
#endif
將close()改為_close()
2.在math_functions.cpp中
做如下修改:
#define __builtin_popcount __popcnt
#define __builtin_popcountl __popcnt
3.在db.cpp中
作如下修改:
#ifdef _MSC_VER
#include <direct.h>
#endif
修改CHECK_EQ
#ifdef _MSC_VER
CHECK_EQ(_mkdir(source.c_str()),0)<<」mkdir」<<source<<」failed」;
#else
CHECK_EQ(mkdir(source.c_str(),0744),0)<<」mkidr」<<source<<」failed」;
#endif
4.依次編譯其他文件
3.4.4 編譯./src/proto中的文件
參照上一步,將proto中的文件都添加到項目。
修改屬性:
項目——屬性——C/C++——預處理器——預處理器定義
添加:_SCL_SECURE_NO_WARNINGS
編譯所有文件。
3.4.5 編譯./tools中的文件
本文件夾下有多個cpp文件,通過它們的名字就可以知道相應的功能。添加不同的cpp文件到項目中,然後生成項目,就可以得到不同功能的exe文件。
將caffe.cpp添加到工程,生成項目,得到caffe.exe文件,可用於訓練模型
將computer_image_mean.cpp添加到工程,生成項目,得到的exe文件可用於將訓練樣本轉換為caffe使用的leveldb/lmdb數據集。
依次類推。
自此,caffe在Windows下的編譯已經完畢,接下來就可以使用它來訓練自己的模型了。