chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在一個集成中使用多種模型的使用向?qū)?/h1>

在統(tǒng)計學和機器學習領(lǐng)域,集成方法(ensemble method)使用多種學習算法以獲得更好的預測性能(相比單獨使用其中任何一種算法)。和統(tǒng)計力學中的統(tǒng)計集成(通常是無窮集合)不同,一個機器學習集成僅由一個離散的可選模型的離散集合組成,但通常擁有更加靈活的結(jié)構(gòu) [1]。

使用集成的主要動機是在發(fā)現(xiàn)新的假設(shè),該假設(shè)不一定存在于構(gòu)成模型的假設(shè)空間中。從經(jīng)驗的角度看,當模型具有顯著的多樣性時,集成方法傾向于得到更好的結(jié)果 [2]。

動機

在一個大型機器學習競賽的比賽結(jié)果中,最好的結(jié)果通常是由模型的集成而不是由單個模型得到的。例如,ILSVRC2015 的得分最高的單個模型架構(gòu)得到了第 13 名的成績。而第 1 到 12 名都使用了不同類型的模型集成。

我目前并沒有發(fā)現(xiàn)有任何的教程或文檔教人們?nèi)绾卧谝粋€集成中使用多種模型,因此我決定自己做一個這方面的使用向?qū)А?/p>

我將使用 Keras,具體來說是它的功能性 API,以從相對知名的論文中重建三種小型 CNN(相較于 ResNet50、Inception 等而言)。我將在 CIFAR-10 數(shù)據(jù)集上獨立地訓練每個模型 [3]。然后使用測試集評估每個模型。之后,我會將所有三個模型組成一個集合,并進行評估。通常按照預期,這個集成相比單獨使用其中任何一個模型,在測試集上能獲得更好的性能。

有很多種不同類型的集成:其中一種是堆疊(stacking)。這種類型更加通用并且在理論上可以表征任何其它的集成技術(shù)。堆疊涉及訓練一個學習算法結(jié)合多種其它學習算法的預測 [1]。對于這個示例,我將使用堆疊的最簡單的一種形式,其中涉及對集成的模型輸出取平均值。由于取平均過程不包含任何參數(shù),這種集成不需要訓練(只需要訓練模型)。

如何在一個集成中使用多種模型的使用向?qū)? src=

本文介紹的集成的簡要結(jié)構(gòu)

準備數(shù)據(jù)

首先,導入類和函數(shù):

  1. fromkeras.modelsimportModel,Input

  2. fromkeras.layersimportConv2D,MaxPooling2D,GlobalAveragePooling2D,Activation,Average,Dropout

  3. fromkeras.utilsimportto_categorical

  4. fromkeras.lossesimportcategorical_crossentropy

  5. fromkeras.callbacksimportModelCheckpoint,TensorBoard

  6. fromkeras.optimizersimportAdam

  7. fromkeras.datasetsimportcifar10

  8. importnumpyasnp

我使用的數(shù)據(jù)集是 CIFAR-10,因為很容易找到在這個數(shù)據(jù)集上工作得很好的架構(gòu)的相關(guān)論文。使用一個流行的數(shù)據(jù)集還可以令這個案例容易復現(xiàn)。

以下是數(shù)據(jù)集的導入代碼。訓練數(shù)據(jù)和測試數(shù)據(jù)都已經(jīng)歸一化。訓練標簽向量被轉(zhuǎn)換成一個 one-hot 矩陣。不需要轉(zhuǎn)換測試標簽向量,因為它不會在訓練中使用。

  1. (x_train, y_train), (x_test, y_test) = cifar10.load_data()

  2. x_train = x_train /255.

  3. x_test = x_test /255.

  4. y_train = to_categorical(y_train, num_classes=10)

數(shù)據(jù)集由 6 萬張 10 個類別的 32x32 的 RGB 圖像組成。其中 5 萬張用于訓練/驗證,其它 1 萬張用于測試。

  1. print('x_train shape: {} |

  2. y_train shape: {}\nx_test shape : {} |

  3. y_test shape : {}'.format(x_train.shape, y_train.shape, x_test.shape, y_test.shape))

>>> x_train shape: (50000, 32, 32, 3) | y_train shape: (50000, 10)

>>> x_test shape : (10000, 32, 32, 3) | y_test shape : (10000, 1)

由于三個模型使用的是相同類型的數(shù)據(jù),定義單個用于所有模型的輸入層是合理的。

  1. input_shape = x_train[0,:,:,:].shape

  2. model_input =Input(shape=input_shape)

第一個模型:ConvPool-CNN-C

第一個將要訓練的模型是 ConvPool-CNN-C[4]。它使用了常見的模式,即每個卷積層連接一個池化層。唯一一個對一些人來說可能不熟悉的細節(jié)是其最后的層。它使用的并不是多個全連接層,而是一個全局平均池化層(global average pooling layer)。

以下是關(guān)于全局池化層的工作方式的簡介。最后的卷積層 Conv2D(10,(1,1)) 輸出和 10 個輸出類別相關(guān)的 10 個特征圖。然后 GlobalAveragePooling2D() 層計算這 10 個特征圖的空間平均(spatial average),意味著其輸出是一個維度為 10 的向量。之后,對這個向量應用一個 softmax 激活函數(shù)。如你所見,這個方法在某種程度上類似于在模型的頂部使用全連接層??梢栽谶@篇論文 [5] 中查看更多關(guān)于全局池化層的內(nèi)容。

重要事項:不要對最后的 Conv2D(10,(1,1)) 層的輸出直接應用激活函數(shù),因為這個層的輸出需要先輸入 GlobalAveragePooling2D()。

  1. defconv_pool_cnn(model_input):

  2. x =Conv2D(96, kernel_size=(3,3), activation='relu', padding = 'same')(model_input)

  3. x =Conv2D(96, (3,3), activation='relu', padding ='same')(x)

  4. x =Conv2D(96, (3,3), activation='relu', padding ='same')(x)

  5. x =MaxPooling2D(pool_size=(3,3), strides =2)(x)

  6. x =Conv2D(192, (3,3), activation='relu', padding ='same')(x)

  7. x =Conv2D(192, (3,3), activation='relu', padding ='same')(x)

  8. x =Conv2D(192, (3,3), activation='relu', padding ='same')(x)

  9. x =MaxPooling2D(pool_size=(3,3), strides =2)(x)

  10. x =Conv2D(192, (3,3), activation='relu', padding ='same')(x)

  11. x =Conv2D(192, (1,1), activation='relu')(x)

  12. x =Conv2D(10, (1,1))(x)

  13. x =GlobalAveragePooling2D()(x)

  14. x =Activation(activation='softmax')(x)

  15. model =Model(model_input, x, name='conv_pool_cnn')

  16. returnmodel

用具體例子解釋該模型

  1. conv_pool_cnn_model = conv_pool_cnn(model_input)

為了簡單起見,每個模型都使用相同的參數(shù)進行編譯和訓練。其中,epoch 數(shù)等于 20、批尺寸等于 32(每個 epoch 進行 1250 次迭代)的參數(shù)設(shè)置能使三個模型都找到局部極小值。隨機選擇訓練集的 20% 作為驗證集。

  1. defcompile_and_train(model, num_epochs):

  2. model.compile(loss=categorical_crossentropy, optimizer=Adam(), metrics=['acc'])

  3. filepath ='weights/'+ model.name +'.{epoch:02d}-{loss:.2f}.hdf5'

  4. checkpoint =ModelCheckpoint(filepath, monitor='loss', verbose=0, save_weights_only=True, save_best_only=True, mode='auto', period=1)

  5. tensor_board =TensorBoard(log_dir='logs/', histogram_freq=0, batch_size=32)

  6. history = model.fit(x=x_train, y=y_train, batch_size=32, epochs=num_epochs, verbose=1, callbacks=[checkpoint, tensor_board], validation_split=0.2)

  7. returnhistory

大約需要每 epoch1 分鐘的時間訓練這個(以及下一個)模型,我們使用了單個 Tesla K80 GPU。如果你使用的是 CPU,可能需要花較多的時間。

  1. _ = compile_and_train(conv_pool_cnn_model, num_epochs=20)

該模型達到了大約 79% 的驗證準確率。

如何在一個集成中使用多種模型的使用向?qū)? src=

ConvPool-CNN-C 驗證準確率和損失

通過計算測試集的誤差率對模型進行評估。

  1. defevaluate_error(model):

  2. pred=model.predict(x_test,batch_size=32)

  3. pred=np.argmax(pred,axis=1)

  4. pred=np.expand_dims(pred,axis=1)# make same shape as y_test

  5. error=np.sum(np.not_equal(pred,y_test))/y_test.shape[0]

  6. returnerror

  7. evaluate_error(conv_pool_cnn_model)

>>> 0.2414

第二個模型:ALL-CNN-C

下一個模型,ALL-CNN-C,來自同一篇論文 [4]。這個模型和上一個很類似。唯一的區(qū)別是用步幅為 2 的卷積層取代了最大池化層。再次,需要注意,在 Conv2D(10,(1,1)) 層之后不要立刻應用激活函數(shù),如果在該層之后應用了 ReLU 激活函數(shù),會導致訓練失敗。

  1. defall_cnn(model_input):

  2. x=Conv2D(96,kernel_size=(3,3),activation='relu',padding='same')(model_input)

  3. x=Conv2D(96,(3,3),activation='relu',padding='same')(x)

  4. x=Conv2D(96,(3,3),activation='relu',padding='same',strides=2)(x)

  5. x=Conv2D(192,(3,3),activation='relu',padding='same')(x)

  6. x=Conv2D(192,(3,3),activation='relu',padding='same')(x)

  7. x=Conv2D(192,(3,3),activation='relu',padding='same',strides=2)(x)

  8. x=Conv2D(192,(3,3),activation='relu',padding='same')(x)

  9. x=Conv2D(192,(1,1),activation='relu')(x)

  10. x=Conv2D(10,(1,1))(x)

  11. x=GlobalAveragePooling2D()(x)

  12. x=Activation(activation='softmax')(x)

  13. model=Model(model_input,x,name='all_cnn')

  14. returnmodel

  15. all_cnn_model=all_cnn(model_input)

  16. _=compile_and_train(all_cnn_model,num_epochs=20)

該模型收斂到了大約 75% 的驗證準確率。

如何在一個集成中使用多種模型的使用向?qū)? src=

ConvPool-CNN-C 驗證準確率和損失

由于這兩個模型很相似,誤差率差別不大。

  1. evaluate_error(all_cnn_model)

>>> 0.26090000000000002

第三個模型:Network In Network CNN

第三個 CNN 是 Network In Network CNN[5]。這個模型來自引入了全局池化層的論文。它比之前的兩個模型更小,因此其訓練速度更快。(再提醒一次,不要在最后的卷積層之后使用 ReLU 函數(shù)?。?/p>

相較于在 MLP 卷積層中使用多層感知機,我使用的是 1x1 卷積核的卷積層。從而需要優(yōu)化的參數(shù)變得更少,訓練速度進一步加快,并且還獲得了更好的結(jié)果(當使用全連接層的時候無法獲得高于 50% 的驗證準確率)。該論文中稱,MLP 卷積層中應用的函數(shù)等價于在普通卷積層上的級聯(lián)跨通道參數(shù)化池化(cascaded cross channel parametric pooling),其中依次等價于一個 1x1 卷積核的卷積層。如果這個結(jié)論有錯誤,歡迎指正。

  1. defnin_cnn(model_input):

  2. #mlpconv block 1

  3. x=Conv2D(32,(5,5),activation='relu',padding='valid')(model_input)

  4. x=Conv2D(32,(1,1),activation='relu')(x)

  5. x=Conv2D(32,(1,1),activation='relu')(x)

  6. x=MaxPooling2D((2,2))(x)

  7. x=Dropout(0.5)(x)

  8. #mlpconv block2

  9. x=Conv2D(64,(3,3),activation='relu',padding='valid')(x)

  10. x=Conv2D(64,(1,1),activation='relu')(x)

  11. x=Conv2D(64,(1,1),activation='relu')(x)

  12. x=MaxPooling2D((2,2))(x)

  13. x=Dropout(0.5)(x)

  14. #mlpconv block3

  15. x=Conv2D(128,(3,3),activation='relu',padding='valid')(x)

  16. x=Conv2D(32,(1,1),activation='relu')(x)

  17. x=Conv2D(10,(1,1))(x)

  18. x=GlobalAveragePooling2D()(x)

  19. x=Activation(activation='softmax')(x)

  20. model=Model(model_input,x,name='nin_cnn')

  21. returnmodel

  22. nin_cnn_model=nin_cnn(model_input)

這個模型的訓練速度快得多,在我的機器上每個 epoch 只要 15 秒就能完成。

  1. _=compile_and_train(nin_cnn_model,num_epochs=20)

該模型達到了大約 65% 的驗證準確率。

如何在一個集成中使用多種模型的使用向?qū)? src=

NIN-CNN 驗證準確率和損失

這個模型比之前的兩個模型簡單得多,因此其誤差率要高一點。

  1. evaluate_error(nin_cnn_model)

>>> 0. 0.31640000000000001

三個模型的集成

現(xiàn)在將這三個模型組合成一個集成。

所有三個模型都被重新實例化并加載了最佳的已保存權(quán)重。

  1. conv_pool_cnn_model=conv_pool_cnn(model_input)

  2. all_cnn_model=all_cnn(model_input)

  3. nin_cnn_model=nin_cnn(model_input)

  4. conv_pool_cnn_model.load_weights('weights/conv_pool_cnn.29-0.10.hdf5')

  5. all_cnn_model.load_weights('weights/all_cnn.30-0.08.hdf5')

  6. nin_cnn_model.load_weights('weights/nin_cnn.30-0.93.hdf5')

  7. models=[conv_pool_cnn_model,all_cnn_model,nin_cnn_model]

集成模型的定義是很直接的。它使用了所有模型共享的輸入層。在頂部的層中,該集成通過使用 Average() 合并層計算三個模型輸出的平均值。

  1. defensemble(models,model_input):

  2. outputs=[model.outputs[0]formodelinmodels]

  3. y=Average()(outputs)

  4. model=Model(model_input,y,name='ensemble')

  5. returnmodel

  6. ensemble_model=ensemble(models,model_input)

不出所料,相比于任何單一模型,集成有著更低的誤差率。

  1. evaluate_error(ensemble_model)

>>> 0.2049

其他可能的集成

為了完整性,我們可以查看由兩個模型組合組成的集成的性能。相比于單一模型,前者有更低的誤差率。

  1. pair_A=[conv_pool_cnn_model,all_cnn_model]

  2. pair_B=[conv_pool_cnn_model,nin_cnn_model]

  3. pair_C=[all_cnn_model,nin_cnn_model]

  4. pair_A_ensemble_model=ensemble(pair_A,model_input)

  5. evaluate_error(pair_A_ensemble_model)

>>> 0.21199999999999999

  1. pair_B_ensemble_model=ensemble(pair_B,model_input)

  2. evaluate_error(pair_B_ensemble_model)

>>> 0.22819999999999999

  1. pair_C_ensemble_model=ensemble(pair_C,model_input)

  2. evaluate_error(pair_C_ensemble_model)

>>>0.2447

結(jié)論

重申一下介紹中的內(nèi)容:每個模型有其自身的缺陷。使用集成背后的原因是通過堆疊表征了關(guān)于數(shù)據(jù)的不同假設(shè)的不同模型,我們可以找到一個更好的假設(shè),它不在一個從其構(gòu)建集成的模型的假設(shè)空間之中。

與在大多數(shù)情況下使用單個模型相比,使用一個非?;A(chǔ)的集成實現(xiàn)了更低的誤差率。這證明了集成的有效性。

當然,在使用集成處理你的機器學習任務時,需要牢記一些實際的考慮。由于集成意味著同時堆棧多個模型,這也意味著輸入數(shù)據(jù)需要前向傳播到每個模型。這增加了需要被執(zhí)行的計算量,以及最終的評估(預測)時間。如果你在研究或 Kaggle 競賽中使用集成,增加的評估時間并不重要,但是在設(shè)計一個商業(yè)化產(chǎn)品時卻非常關(guān)鍵。另一個考慮是最后的模型增加的大小,它會再次成為商業(yè)化產(chǎn)品中集成使用的限制性因素。

參考文獻

1. Ensemble Learning. (n.d.). In Wikipedia. Retrieved December 12, 2017, from https://en.wikipedia.org/wiki/Ensemble_learning

2. D. Opitz and R. Maclin (1999)「Popular Ensemble Methods: An Empirical Study」, Volume 11, pages 169–198 (http://jair.org/papers/paper614.html)

3. Learning Multiple Layers of Features from Tiny Images, Alex Krizhevsky, 2009.

4. Striving for Simplicity: The All Convolutional Net:arXiv:1412.6806v3 [cs.LG]

5. Network In Network:arXiv:1312.4400v3 [cs.NE]


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 集成
    +關(guān)注

    關(guān)注

    1

    文章

    178

    瀏覽量

    30810
  • keras
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    6283

原文標題:如何使用Keras集成多個卷積網(wǎng)絡并實現(xiàn)共同預測

文章出處:【微信號:gh_ecbcc3b6eabf,微信公眾號:人工智能和機器人研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    何在AMD Vitis Unified IDE中使用系統(tǒng)設(shè)備樹

    您將在這篇博客中了解系統(tǒng)設(shè)備樹 (SDT) 以及如何在 AMD Vitis Unified IDE 中使用 SDT 維護來自 XSA 的硬件元數(shù)據(jù)。本文還講述了如何對 SDT 進行操作,以便在 Vitis Unified IDE 中實現(xiàn)更靈活的使用場景。
    的頭像 發(fā)表于 11-18 11:13 ?2783次閱讀
    如<b class='flag-5'>何在</b>AMD Vitis Unified IDE<b class='flag-5'>中使</b>用系統(tǒng)設(shè)備樹

    何在VS code中配置Zephyr集成開發(fā)環(huán)境

    篇文章介紹了如何在VS code中使用瑞薩官方插件為RA芯片創(chuàng)建項目與項目調(diào)試,相信大家對RA在VS code中的開發(fā)有了基礎(chǔ)的了解。
    的頭像 發(fā)表于 11-05 14:46 ?1021次閱讀
    如<b class='flag-5'>何在</b>VS code中配置Zephyr<b class='flag-5'>集成</b>開發(fā)環(huán)境

    何在vivadoHLS中使用.TLite模型

    本帖欲分享如何在vivadoHLS中使用.TLite模型。在Vivado HLS中導入模型后,需要設(shè)置其輸入和輸出接口以與您的設(shè)計進行適配。 1. 在Vivado HLS項目中導入
    發(fā)表于 10-22 06:29

    高效反向?qū)?/b>通IGBT的原理詳解

    在先進的反向?qū)?/b>通絕緣柵雙極晶體管(RCIGBT)中,低導通電壓降(Vce(sat))和集成二極管正向電壓(VF)對于有效減少導通損耗至關(guān)重要。
    的頭像 發(fā)表于 10-10 09:25 ?2006次閱讀
    高效反<b class='flag-5'>向?qū)?/b>通IGBT的原理詳解

    請問如何在 Keil μVision 或 IAR EWARM 中使用觀察點進行調(diào)試?

    何在 Keil μVision 或 IAR EWARM 中使用觀察點進行調(diào)試?
    發(fā)表于 08-20 06:29

    請問如何在RK3588上使用npu,用onnx模型來推理

    請問如何在瑞芯微 RK3588上使用npu,用onnx模型來推理。官網(wǎng)上介紹說要把ONNX模型轉(zhuǎn)換成RKNN模型。但是我并不想這么干,請問有什么辦法嗎?
    發(fā)表于 08-09 00:51

    請問如何在C++中使用NPU上的模型緩存?

    無法確定如何在 C++ 中的 NPU 上使用模型緩存
    發(fā)表于 06-24 07:25

    如何將FA模型開發(fā)的聲明式范式應用切換到Stage模型

    模型切換概述 本文介紹如何將FA模型開發(fā)的聲明式范式應用切換到Stage模型,您需要完成如下動作: 工程切換:新建
    發(fā)表于 06-04 06:22

    射頻前端模塊中使用的集成無源元件技術(shù)

    本文介紹了在射頻前端模塊(RF-FEM)中使用的集成無源元件(IPD)技術(shù)。
    的頭像 發(fā)表于 06-03 18:26 ?1066次閱讀
    射頻前端模塊<b class='flag-5'>中使</b>用的<b class='flag-5'>集成</b>無源元件技術(shù)

    何在Ollama中使用OpenVINO后端

    Ollama 和 OpenVINO 的結(jié)合為大型語言模型(LLM)的管理和推理提供了強大的雙引擎驅(qū)動。Ollama 提供了極簡的模型管理工具鏈,而 OpenVINO 則通過 Intel 硬件(CPU
    的頭像 發(fā)表于 04-14 10:22 ?1096次閱讀

    如何實現(xiàn)MC33774IC在Simulink環(huán)境中使用基于模型的設(shè)計?

    我想熟悉如何實現(xiàn)MC33774IC 在 Simulink 環(huán)境中使用基于模型的設(shè)計。 盡管 MATLAB 提供了些示例文件,但它們似乎是最終版本。要更深入地了解如何配置MC33774,我正在尋找
    發(fā)表于 04-10 08:05

    何在MATLAB中使用DeepSeek模型

    在 DeepSeek-R1(https://github.com/deepseek-ai/DeepSeek-R1) AI 模型橫空出世后,人們幾乎就立馬開始詢問如何在 MATLAB 中使用這些
    的頭像 發(fā)表于 02-13 09:20 ?4036次閱讀
    如<b class='flag-5'>何在</b>MATLAB<b class='flag-5'>中使</b>用DeepSeek<b class='flag-5'>模型</b>

    C#中使用OpenVINO?:輕松集成AI模型

    與分析三大領(lǐng)域中,如何快速將AI模型集成到應用程序中,實現(xiàn)AI賦能和應用增值?最容易的方式是:在C#中,使用OpenVINO?工具套件集成AI模型。
    的頭像 發(fā)表于 02-07 14:05 ?1616次閱讀
    C#<b class='flag-5'>中使</b>用OpenVINO?:輕松<b class='flag-5'>集成</b>AI<b class='flag-5'>模型</b>!

    何在Windows中使用MTP協(xié)議

    在Windows操作系統(tǒng)中使用MTP(Media Transfer Protocol)協(xié)議主要涉及到與移動設(shè)備(如智能手機、平板電腦等)的連接和數(shù)據(jù)傳輸。MTP是種用于交換媒體文件(如音樂、視頻
    的頭像 發(fā)表于 01-03 10:26 ?4365次閱讀

    【「大模型啟示錄」閱讀體驗】如何在客服領(lǐng)域應用大模型

    模型可以提高客戶滿意度和服務質(zhì)量。新引入的模型需要能夠無縫集成到現(xiàn)有系統(tǒng)中,以確保服務的連續(xù)性和穩(wěn)定性。因此,在選擇模型時需要考慮其與現(xiàn)有系統(tǒng)的兼容性。同時,隨著企業(yè)業(yè)務的發(fā)展,可能
    發(fā)表于 12-17 16:53