php js jquery功能片段#
唯一需求:表格id。
注意:因提交數據不能包含\n,所以要替換。呈現時可以替換回換行符。
<script type="text/javascript">
/**
* 遍歷表格內容后返回數組
* @param string id 表格id
* @return Array 或者JSON
*/
function getTableContent(id) {
var mytable = document.getElementById(id);
var data = [];
var tmpTxt;
for(var i = 0, rows = mytable.rows.length; i < rows; i++) {
for(var j = 0, cells = mytable.rows[i].cells.length; j < cells; j++) {
if(!data[i]) {
data[i] = new Array();
}
tmpTxt = mytable.rows[i].cells[j].innerHTML;
//tmpTxt = tmpTxt.replace(/<[^>]+>/gi,'');//過濾全部的html標簽,不包括內容
//tmpTxt =tmpTxt.replace(/\s/gi,'');
tmpTxt =tmpTxt.replace(/\n/gi,'<br>');
//data[i][j] = tmpTxt;
data[i][j] = tmpTxt.replace(/ /g, ""); //替換全角空格
}
}
//var JSONdata=data;
var JSONdata = JSON.stringify(data); //序列化數組JSON.stringify(data) 反序列化數組JSON.parse(data)
return JSONdata;
//return data;//返回數組
}
</script>
ello,這里是同捉
你喜歡腦洞大開的大神級圖片或視頻嗎?
你是不是在苦苦追尋卻未能如愿以償?
作為資源大戶的小編琢磨了一下,獨樂樂不如眾樂樂,好東西自然是拿來分享的,今天便慷慨解囊把我平日里愛逛的創意類網站獨家大放送!
網站地址:www.thisiscolossal.com/
Colorssal是很多設計人士的寵兒,它匯集了許多有趣、高品質的視頻和圖片,有些你在網上看多的爆款圖片或視頻很有可能就是出自這里哦。
這個網站歡迎各位攝影者上傳并分享自己的作品和創作心得,這里的圖片都值得一看,保證你會心滿意足地回來的。
大片的背后是攝影師無數次努力的結晶,如果大家要商用的,最好是咨詢一下。
網站地址:https://www.japandesign.ne.jp/
可能是出于語言的障礙,當我們發掘、瀏覽國外網站之時,更多看的是歐美那些以英語為主的網站。其實,日本 也有很多優秀的設計網站。
下面,我們來認識一下這個值得你收藏借鑒的網站叭~
JDN是一個以日本設計作品為主的資訊類網站,網站內容豐富,不但藝術、產品設計、建筑、媒體設計等種類的優秀作品,還可以查看到設計師人物采訪、作品展覽、交流會等活動資訊。
平時沒什么靈感的時候,可以逛一逛,說不定就有了那么一丟丟想法。
(全球創意分享平臺)
網站地址:https://www.topys.cn/
TOPYS?志打造?個多元、完備的泛創意知識產品系統和學習平臺,希望借由創意的學習與激發,賦予?以最?價值及最?境界的成長。
該?站包含了各種?案創造庫,包含了好?告、?設計、輕藝術、?法論、泛閱讀等眾多主題創意,你在創作?案時,不防在該?站看看,可能會有意想不到驚喜。
網站地址:www.skypixel.com/
天空之城這個網站,主要分享世界各地的航拍照片、視頻,還是非常震撼的,值得體驗收藏。
你千萬別以為是宮崎駿引人入勝的動畫,它是以天空為角度,用俯瞰航拍的視角捕捉地球上各種見所未見的神奇景象。
有人說,天空之城的網站主旨就是“以上帝的視覺看世界”,對于這種形容,小編舉雙手贊成,下面就讓大家看看幾組往年獲獎的作品吧。
日常生活中,我們都習慣用平視或仰視的角度去看待生活,看待地球,但也有些腦洞大開或有奇思妙想的人想要從幾萬英尺高的天空發現另一種美,天空之城就是為這群人去踐行他們的夢想。
這里匯集了全球航拍愛好者和專業攝影人員的拍攝作品,也有簽約攝影師上傳的大作,感興趣或者想要尋找靈感的設計師可以多來這里逛逛,總有有所收獲。
它會不定時舉辦攝影比賽,對于比賽作品的要求非常嚴格,所以成品的質量才會具有超高的口碑和人氣。
天空之城的作品都會做出分類,如自然、城市、運動、人物、熱門標簽等等,用戶可以根據需要選擇分類,快速找到自己想要的素材。
航拍社區的入口也做了地域劃分,攝影師根據自身所在的地區選擇端口然后上傳作品。
同時也可以看到別人拍攝的作品,這里有靜態圖也有短視頻,內容都很有震撼力和沖擊性,能給人大腦和心靈帶來巨大反響。
如果你需要用到這里的圖片,為了保險起見,還是要和網站負責人聯系一下比較好,免得出現侵權的糾紛,畢竟大家都知道創作來之不易,尊重版權無可厚非。
當你大腦突然死機的時候,打開天空之城,說不定就會找到解決辦法了,記得收藏。
(免費制作星球素材,用心裝飾你的PPT)
網站地址:www.alteredqualia.com/xg/examples/nebula_artefact.html
互聯網時代的今天,存在著太多的趣味以及可能性。網上其實存在著眾多有趣的網頁。
有些雖然對自己并沒有什么太大的作用,但是閑暇時間總想打開看看,以此來打發一下無聊的生活。今天向大家推薦這個有趣的網頁, 是一個趣味十足的星球生成器。
可能你在其他地方看到過這個神器,但基本都沒有特別詳細的介紹和使用方 界面神秘而又超級簡潔,整體兩部分:球和背景。
點擊鼠標可以隨機切換全局顏色 , 左右方向鍵可以順序切換全局顏色 , S鍵鎖定球體與解鎖球體的切換 , H鍵取消文本與恢復文本的切換。
它最大的特點就是有一種強烈的質感,鼠標放在上面就會產生一種水的波紋。
調整到滿意的效果了,直接鼠標右鍵,選擇【圖片另存為】可以保存圖片,選擇【復制圖片】可以直接粘貼到 PPT 中??纯闯善穲D效果吧,是不是很震撼?
這么別出心裁的PPT封面,誰看了都會佩服制作者的能力和眼界。諸位可深入探索,當然這些也可以用來裝B,豈不美哉!
寫到這里想重點提醒各位一下,這些靈感素材平時一定要做好存儲,形成自己的資源庫。只有掌握在自己手中的,才是切實可靠的。
【 鏈 接 集 合 】在這里啦:
Colorssal
網站地址:www.thisiscolossal.com/
JDN
網站地址:https://www.japandesign.ne.jp/
topys
網站地址:https://www.topys.cn/
天空之城
網站地址:www.skypixel.com/
液態星球
網站地址:www.alteredqualia.com/xg/examples/nebula_artefact.html
更多優質文章/推薦,請持續關注哦~
1、右上角關注同捉~
2、評論文章,讓小仙知道你喜歡這類文章,往后會更努力寫優質文分享,愛你(づ ̄3 ̄)づ
圖像相比文字能夠提供更加生動、容易理解及更具藝術感的信息,圖像分類是根據圖像的語義信息將不同類別圖像區分開來,是圖像檢測、圖像分割、物體跟蹤、行為分析等其他高層視覺任務的基礎。圖像分類在安防、交通、互聯網、醫學等領域有著廣泛的應用。
一般來說,圖像分類通過手工提取特征或特征學習方法對整個圖像進行全部描述,然后使用分類器判別物體類別,因此如何提取圖像的特征至關重要?;谏疃葘W習的圖像分類方法,可以通過有監督或無監督的方式學習層次化的特征描述,從而取代了手工設計或選擇圖像特征的工作。
深度學習模型中的卷積神經網絡(Convolution Neural Network, CNN) 直接利用圖像像素信息作為輸入,最大程度上保留了輸入圖像的所有信息,通過卷積操作進行特征的提取和高層抽象,模型輸出直接是圖像識別的結果。這種基于"輸入-輸出"直接端到端的學習方法取得了非常好的效果。
本教程主要介紹圖像分類的深度學習模型,以及如何使用PaddlePaddle在CIFAR10數據集上快速實現CNN模型。
項目地址:
http://paddlepaddle.org/documentation/docs/zh/1.3/beginners_guide/basics/image_classification/index.html
基于ImageNet數據集訓練的更多圖像分類模型,及對應的預訓練模型、finetune操作詳情請參照Github:
https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README_cn.md
圖像分類包括通用圖像分類、細粒度圖像分類等。圖1展示了通用圖像分類效果,即模型可以正確識別圖像上的主要物體。
圖1. 通用圖像分類展示
圖2展示了細粒度圖像分類-花卉識別的效果,要求模型可以正確識別花的類別。
圖2. 細粒度圖像分類展示
一個好的模型既要對不同類別識別正確,同時也應該能夠對不同視角、光照、背景、變形或部分遮擋的圖像正確識別(這里我們統一稱作圖像擾動)。圖3展示了一些圖像的擾動,較好的模型會像聰明的人類一樣能夠正確識別。
圖3. 擾動圖片展示[7]
傳統CNN包含卷積層、全連接層等組件,并采用softmax多類別分類器和多類交叉熵損失函數,一個典型的卷積神經網絡如圖4所示,我們先介紹用來構造CNN的常見組件。
圖4. CNN網絡示例[5]
? 卷積層(convolution layer): 執行卷積操作提取底層到高層的特征,發掘出圖片局部關聯性質和空間不變性質。
? 池化層(pooling layer): 執行降采樣操作。通過取卷積輸出特征圖中局部區塊的最大值(max-pooling)或者均值(avg-pooling)。降采樣也是圖像處理中常見的一種操作,可以過濾掉一些不重要的高頻信息。
? 全連接層(fully-connected layer,或者fc layer): 輸入層到隱藏層的神經元是全部連接的。
? 非線性變化: 卷積層、全連接層后面一般都會接非線性變化函數,例如Sigmoid、Tanh、ReLu等來增強網絡的表達能力,在CNN里最常使用的為ReLu激活函數。
? Dropout [1] : 在模型訓練階段隨機讓一些隱層節點權重不工作,提高網絡的泛化能力,一定程度上防止過擬合。
接下來我們主要介紹VGG,ResNet網絡結構。
1、VGG
牛津大學VGG(Visual Geometry Group)組在2014年ILSVRC提出的模型被稱作VGG模型[2] 。該模型相比以往模型進一步加寬和加深了網絡結構,它的核心是五組卷積操作,每兩組之間做Max-Pooling空間降維。同一組內采用多次連續的3X3卷積,卷積核的數目由較淺組的64增多到最深組的512,同一組內的卷積核數目是一樣的。卷積之后接兩層全連接層,之后是分類層。由于每組內卷積層的不同,有11、13、16、19層這幾種模型,下圖展示一個16層的網絡結構。
VGG模型結構相對簡潔,提出之后也有很多文章基于此模型進行研究,如在ImageNet上首次公開超過人眼識別的模型[4]就是借鑒VGG模型的結構。
圖5. 基于ImageNet的VGG16模型
2、ResNet
ResNet(Residual Network) [3] 是2015年ImageNet圖像分類、圖像物體定位和圖像物體檢測比賽的冠軍。針對隨著網絡訓練加深導致準確度下降的問題,ResNet提出了殘差學習方法來減輕訓練深層網絡的困難。在已有設計思路(BN, 小卷積核,全卷積網絡)的基礎上,引入了殘差模塊。每個殘差模塊包含兩條路徑,其中一條路徑是輸入特征的直連通路,另一條路徑對該特征做兩到三次卷積操作得到該特征的殘差,最后再將兩條路徑上的特征相加。
殘差模塊如圖7所示,左邊是基本模塊連接方式,由兩個輸出通道數相同的3x3卷積組成。右邊是瓶頸模塊(Bottleneck)連接方式,之所以稱為瓶頸,是因為上面的1x1卷積用來降維(圖示例即256->64),下面的1x1卷積用來升維(圖示例即64->256),這樣中間3x3卷積的輸入和輸出通道數都較小(圖示例即64->64)。
圖7. 殘差模塊
3、數據準備
由于ImageNet數據集較大,下載和訓練較慢,為了方便大家學習,我們使用CIFAR10數據集。CIFAR10數據集包含60,000張32x32的彩色圖片,10個類別,每個類包含6,000張。其中50,000張圖片作為訓練集,10000張作為測試集。圖11從每個類別中隨機抽取了10張圖片,展示了所有的類別。
圖11. CIFAR10數據集[6]
Paddle API提供了自動加載cifar數據集模塊paddle.dataset.cifar。
通過輸入python train.py,就可以開始訓練模型了,以下小節將詳細介紹train.py的相關內容。
1、Paddle 初始化
讓我們從導入Paddle Fluid API 和輔助模塊開始。
from __future__ import print_function import os import paddle import paddle.fluidas fluid import numpy import sys from vgg import vgg_bn_drop from resnet import resnet_cifar10
本教程中我們提供了VGG和ResNet兩個模型的配置。
2、VGG
首先介紹VGG模型結構,由于CIFAR10圖片大小和數量相比ImageNet數據小很多,因此這里的模型針對CIFAR10數據做了一定的適配。卷積部分引入了BN和Dropout操作。VGG核心模塊的輸入是數據層,vgg_bn_drop定義了16層VGG結構,每層卷積后面引入BN層和Dropout層,詳細的定義如下:
def vgg_bn_drop(input): def conv_block(ipt, num_filter, groups, dropouts): return fluid.nets.img_conv_group( input=ipt, pool_size=2, pool_stride=2, conv_num_filter=[num_filter] * groups, conv_filter_size=3, conv_act='relu', conv_with_batchnorm=True, conv_batchnorm_drop_rate=dropouts, pool_type='max') conv1= conv_block(input, 64, 2, [0.3, 0]) conv2= conv_block(conv1, 128, 2, [0.4, 0]) conv3= conv_block(conv2, 256, 3, [0.4, 0.4, 0]) conv4= conv_block(conv3, 512, 3, [0.4, 0.4, 0]) conv5= conv_block(conv4, 512, 3, [0.4, 0.4, 0]) drop= fluid.layers.dropout(x=conv5, dropout_prob=0.5) fc1= fluid.layers.fc(input=drop, size=512, act=None) bn= fluid.layers.batch_norm(input=fc1, act='relu') drop2= fluid.layers.dropout(x=bn, dropout_prob=0.5) fc2= fluid.layers.fc(input=drop2, size=512, act=None) predict= fluid.layers.fc(input=fc2, size=10, act='softmax') return predict
首先定義了一組卷積網絡,即conv_block。卷積核大小為3x3,池化窗口大小為2x2,窗口滑動大小為2,groups決定每組VGG模塊是幾次連續的卷積操作,dropouts指定Dropout操作的概率。所使用的img_conv_group是在paddle.fluit.net中預定義的模塊,由若干組Conv->BN->ReLu->Dropout 和一組Pooling 組成。
五組卷積操作,即5個conv_block。第一、二組采用兩次連續的卷積操作。第三、四、五組采用三次連續的卷積操作。每組最后一個卷積后面Dropout概率為0,即不使用Dropout操作。
最后接兩層512維的全連接。
在這里,VGG網絡首先提取高層特征,隨后在全連接層中將其映射到和類別維度大小一致的向量上,最后通過Softmax方法計算圖片劃為每個類別的概率。
3、ResNet
ResNet模型的第1、3、4步和VGG模型相同,這里不再介紹。主要介紹第2步即CIFAR10數據集上ResNet核心模塊。
先介紹resnet_cifar10中的一些基本函數,再介紹網絡連接過程。
? conv_bn_layer: 帶BN的卷積層。
? shortcut: 殘差模塊的"直連"路徑,"直連"實際分兩種形式:殘差模塊輸入和輸出特征通道數不等時,采用1x1卷積的升維操作;殘差模塊輸入和輸出通道相等時,采用直連操作。
? basicblock: 一個基礎殘差模塊,即圖9左邊所示,由兩組3x3卷積組成的路徑和一條"直連"路徑組成。
? layer_warp: 一組殘差模塊,由若干個殘差模塊堆積而成。每組中第一個殘差模塊滑動窗口大小與其他可以不同,以用來減少特征圖在垂直和水平方向的大小。
def conv_bn_layer(input, ch_out, filter_size, stride, padding, act='relu', bias_attr=False): tmp= fluid.layers.conv2d( input=input, filter_size=filter_size, num_filters=ch_out, stride=stride, padding=padding, act=None, bias_attr=bias_attr) return fluid.layers.batch_norm(input=tmp, act=act) def shortcut(input, ch_in, ch_out, stride): if ch_in!= ch_out: return conv_bn_layer(input, ch_out, 1, stride, 0, None) else: return input def basicblock(input, ch_in, ch_out, stride): tmp= conv_bn_layer(input, ch_out, 3, stride, 1) tmp= conv_bn_layer(tmp, ch_out, 3, 1, 1, act=None, bias_attr=True) short= shortcut(input, ch_in, ch_out, stride) return fluid.layers.elementwise_add(x=tmp, y=short, act='relu') def layer_warp(block_func, input, ch_in, ch_out, count, stride): tmp= block_func(input, ch_in, ch_out, stride) for iin range(1, count): tmp= block_func(tmp, ch_out, ch_out, 1) return tmp
resnet_cifar10的連接結構主要有以下幾個過程。
底層輸入連接一層conv_bn_layer,即帶BN的卷積層。
然后連接3組殘差模塊即下面配置3組layer_warp,每組采用圖10 左邊殘差模塊組成。
最后對網絡做均值池化并返回該層。
注意:除第一層卷積層和最后一層全連接層之外,要求三組layer_warp總的含參層數能夠被6整除,即resnet_cifar10的depth 要滿足(depth - 2) % 6 = 0
def resnet_cifar10(ipt, depth=32): # depth should be one of 20, 32, 44, 56, 110, 1202 assert (depth- 2) % 6== 0 n= (depth- 2) // 6 nStages= {16, 64, 128} conv1= conv_bn_layer(ipt, ch_out=16, filter_size=3, stride=1, padding=1) res1= layer_warp(basicblock, conv1, 16, 16, n, 1) res2= layer_warp(basicblock, res1, 16, 32, n, 2) res3= layer_warp(basicblock, res2, 32, 64, n, 2) pool= fluid.layers.pool2d( input=res3, pool_size=8, pool_type='avg', pool_stride=1) predict= fluid.layers.fc(input=pool, size=10, act='softmax') return predict
4、Infererence配置
網絡輸入定義為data_layer(數據層),在圖像分類中即為圖像像素信息。CIFRAR10是RGB 3通道32x32大小的彩色圖,因此輸入數據大小為3072(3x32x32)。
def inference_network(): # The image is 32 * 32 with RGB representation. data_shape = [3, 32, 32] images = fluid.layers.data(name='pixel', shape=data_shape, dtype='float32') predict = resnet_cifar10(images, 32) # predict = vgg_bn_drop(images) # un-comment to use vgg net return predict
5、Train 配置
然后我們需要設置訓練程序train_network。它首先從推理程序中進行預測。在訓練期間,它將從預測中計算avg_cost。在有監督訓練中需要輸入圖像對應的類別信息,同樣通過fluid.layers.data來定義。訓練中采用多類交叉熵作為損失函數,并作為網絡的輸出,預測階段定義網絡的輸出為分類器得到的概率信息。
注意:訓練程序應該返回一個數組,第一個返回參數必須是avg_cost。訓練器使用它來計算梯度。
def train_network(predict): label = fluid.layers.data(name='label', shape=[1], dtype='int64') cost = fluid.layers.cross_entropy(input=predict, label=label) avg_cost = fluid.layers.mean(cost) accuracy = fluid.layers.accuracy(input=predict, label=label) return [avg_cost, accuracy]
6、Optimizer 配置
在下面的Adam optimizer,learning_rate是學習率,與網絡的訓練收斂速度有關系。
def optimizer_program(): return fluid.optimizer.Adam(learning_rate=0.001)
7、訓練模型
-1)Data Feeders 配置
cifar.train10()每次產生一條樣本,在完成shuffle和batch之后,作為訓練的輸入。
# Each batch will yield 128 images BATCH_SIZE= 128 # Reader for training train_reader = paddle.batch( paddle.reader.shuffle( paddle.dataset.cifar.train10(), buf_size=128 * 100), batch_size=BATCH_SIZE) # Reader for testing. A separated data set for testing. test_reader = paddle.batch( paddle.dataset.cifar.test10(), batch_size=BATCH_SIZE)
-2)Trainer 程序的實現
我們需要為訓練過程制定一個main_program, 同樣的,還需要為測試程序配置一個test_program。定義訓練的place,并使用先前定義的優化器。
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() feed_order = ['pixel', 'label'] main_program = fluid.default_main_program() star_program = fluid.default_startup_program() predict = inference_network() avg_cost, acc = train_network(predict) # Test program test_program = main_program.clone(for_test=True) optimizer = optimizer_program() optimizer.minimize(avg_cost) exe = fluid.Executor(place) EPOCH_NUM = 1 # For training test cost def train_test(program, reader): count = 0 feed_var_list = [ program.global_block().var(var_name) for var_name in feed_order ] feeder_test = fluid.DataFeeder(feed_list=feed_var_list, place=place) test_exe = fluid.Executor(place) accumulated = len([avg_cost, acc]) * [0] for tid, test_data in enumerate(reader()): avg_cost_np = test_exe.run( program=program, feed=feeder_test.feed(test_data), fetch_list=[avg_cost, acc]) accumulated = [ x[0] + x[1][0] for x in zip(accumulated, avg_cost_np) ] count += 1 return [x / count for x in accumulated]
-3)訓練主循環以及過程輸出
在接下來的主訓練循環中,我們將通過輸出來來觀察訓練過程,或進行測試等。
# main train loop. def train_loop(): feed_var_list_loop = [ main_program.global_block().var(var_name) for var_name in feed_order ] feeder = fluid.DataFeeder(feed_list=feed_var_list_loop, place=place) exe.run(star_program) step = 0 for pass_id in range(EPOCH_NUM): for step_id, data_train in enumerate(train_reader()): avg_loss_value = exe.run( main_program, feed=feeder.feed(data_train), fetch_list=[avg_cost, acc]) if step_id % 100 == 0: print("\nPass %d, Batch %d, Cost %f, Acc %f" % ( step_id, pass_id, avg_loss_value[0], avg_loss_value[1])) else: sys.stdout.write('.') sys.stdout.flush() step += 1 avg_cost_test, accuracy_test = train_test( test_program, reader=test_reader) print('\nTest with Pass {0}, Loss {1:2.2}, Acc {2:2.2}'.format( pass_id, avg_cost_test, accuracy_test)) if params_dirname is not None: fluid.io.save_inference_model(params_dirname, ["pixel"], [predict], exe) train_loop()
-4)訓練
通過trainer_loop函數訓練, 這里我們只進行了2個Epoch, 一般我們在實際應用上會執行上百個以上Epoch
注意:CPU,每個Epoch 將花費大約15~20分鐘。這部分可能需要一段時間。請隨意修改代碼,在GPU上運行測試,以提高訓練速度。
train_loop()
一輪訓練log示例如下所示,經過1個pass,訓練集上平均Accuracy 為0.59 ,測試集上平均Accuracy 為0.6 。
Pass 0, Batch 0, Cost 3.869598, Acc 0.164062
...................................................................................................
Pass 100, Batch 0, Cost 1.481038, Acc 0.460938
...................................................................................................
Pass 200, Batch 0, Cost 1.340323, Acc 0.523438
...................................................................................................
Pass 300, Batch 0, Cost 1.223424, Acc 0.593750
..........................................................................................
Test with Pass 0, Loss 1.1, Acc 0.6
圖13是訓練的分類錯誤率曲線圖,運行到第200個pass后基本收斂,最終得到測試集上分類錯誤率為8.54%。
圖13. CIFAR10數據集上VGG模型的分類錯誤率
可以使用訓練好的模型對圖片進行分類,下面程序展示了如何加載已經訓練好的網絡和參數進行推斷。
1、生成預測輸入數據
dog.png是一張小狗的圖片. 我們將它轉換成numpy數組以滿足feeder的格式.
from PIL import Image def load_image(infer_file): im = Image.open(infer_file) im = im.resize((32, 32), Image.ANTIALIAS) im = numpy.array(im).astype(numpy.float32) # The storage order of the loaded image is W(width), # H(height), C(channel). PaddlePaddle requires # the CHW order, so transpose them. im = im.transpose((2, 0, 1)) # CHW im = im / 255.0 # Add one dimension to mimic the list format. im = numpy.expand_dims(im, axis=0) return im cur_dir = os.path.dirname(os.path.realpath(__file__)) img = load_image(cur_dir + '/image/dog.png')
2、Inferencer 配置和預測
與訓練過程類似,inferencer需要構建相應的過程。我們從params_dirname加載網絡和經過訓練的參數。我們可以簡單地插入前面定義的推理程序?,F在我們準備做預測。
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = fluid.Executor(place) inference_scope = fluid.core.Scope() with fluid.scope_guard(inference_scope): # Use fluid.io.load_inference_model to obtain the inference program desc, # the feed_target_names (the names of variables that will be feeded # data using feed operators), and the fetch_targets (variables that # we want to obtain data from using fetch operators). [inference_program, feed_target_names, fetch_targets] = fluid.io.load_inference_model(params_dirname, exe) # The input's dimension of conv should be 4-D or 5-D. # Use inference_transpiler to speedup inference_transpiler_program = inference_program.clone() t = fluid.transpiler.InferenceTranspiler() t.transpile(inference_transpiler_program, place) # Construct feed as a dictionary of {feed_target_name: feed_target_data} # and results will contain a list of data corresponding to fetch_targets. results = exe.run( inference_program, feed={feed_target_names[0]: img}, fetch_list=fetch_targets) transpiler_results = exe.run( inference_transpiler_program, feed={feed_target_names[0]: img}, fetch_list=fetch_targets) assert len(results[0]) == len(transpiler_results[0]) for i in range(len(results[0])): numpy.testing.assert_almost_equal( results[0][i], transpiler_results[0][i], decimal=5) # infer label label_list = [ "airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck" ] print("infer results: %s" % label_list[numpy.argmax(results[0])])
總結
傳統圖像分類方法由多個階段構成,框架較為復雜,而端到端的CNN模型結構可一步到位,而且大幅度提升了分類準確率。本文我們首先介紹VGG、ResNet兩個經典的模型;然后基于CIFAR10數據集,介紹如何使用PaddlePaddle配置和訓練CNN模型;最后介紹如何使用PaddlePaddle的API接口對圖片進行預測和特征提取。對于其他數據集比如ImageNet,配置和訓練流程是同樣的。請參照Github
https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README_cn.md。
參考文獻
[1] G.E. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever, and R.R. Salakhutdinov. Improving neural networks by preventing co-adaptation of feature detectors. arXiv preprint arXiv:1207.0580, 2012.
[2] K. Chatfield, K. Simonyan, A. Vedaldi, A. Zisserman. Return of the Devil in the Details: Delving Deep into Convolutional Nets. BMVC, 2014。
[3] K. He, X. Zhang, S. Ren, J. Sun. Deep Residual Learning for Image Recognition. CVPR 2016.
[4] He, K., Zhang, X., Ren, S., and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ArXiv e-prints, February 2015.
[5] http://deeplearning.net/tutorial/lenet.html
[6] https://www.cs.toronto.edu/~kriz/cifar.html
[7] http://cs231n.github.io/classification/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。