色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

遷移學習的原理,基于Keras實現(xiàn)遷移學習

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-05-09 03:44 ? 次閱讀

數(shù)據(jù)科學家Prakash Jay介紹了遷移學習的原理,基于Keras實現(xiàn)遷移學習,以及遷移學習的常見情形。

Inception-V3

什么是遷移學習?

機器學習中的遷移學習問題,關注如何保存解決一個問題時獲得的知識,并將其應用于另一個相關的不同問題。

為什么遷移學習?

在實踐中,很少有人從頭訓練一個卷積網(wǎng)絡,因為很難獲取足夠的數(shù)據(jù)集。使用預訓練的網(wǎng)絡有助于解決大多數(shù)手頭的問題。

訓練深度網(wǎng)絡代價高昂。即使使用數(shù)百臺配備了昂貴的GPU的機器,訓練最復雜的模型也需要好多周。

決定深度學習的拓撲/特色/訓練方法/超參數(shù)是沒有多少理論指導的黑魔法。

我的經(jīng)驗

不要試圖成為英雄。

—— Andrej Karapathy

我面對的大多數(shù)計算機視覺問題沒有非常大的數(shù)據(jù)集(5000-40000圖像)。即使使用極端的數(shù)據(jù)增強策略,也很難達到像樣的精確度。而在少量數(shù)據(jù)集上訓練數(shù)百萬參數(shù)的網(wǎng)絡通常會導致過擬合。所以遷移學習是我的救星。

遷移學習為何有效?

讓我們看下深度學習網(wǎng)絡學習了什么,靠前的層嘗試檢測邊緣,中間層嘗試檢測形狀,而靠后的層嘗試檢測高層數(shù)據(jù)特征。這些訓練好的網(wǎng)絡通常有助于解決其他計算機視覺問題。

下面,讓我們看下如何使用Keras實現(xiàn)遷移學習,以及遷移學習的常見情形。

基于Keras的簡單實現(xiàn)

from keras import applications

from keras.preprocessing.image importImageDataGenerator

from keras import optimizers

from keras.models importSequential, Model

from keras.layers importDropout, Flatten, Dense, GlobalAveragePooling2D

from keras import backend as k

from keras.callbacks importModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping

img_width, img_height = 256, 256

train_data_dir = "data/train"

validation_data_dir = "data/val"

nb_train_samples = 4125

nb_validation_samples = 466

batch_size = 16

epochs = 50

model = applications.VGG19(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))

"""

層 (類型) 輸出形狀 參數(shù)數(shù)量

=================================================================

input_1 (InputLayer) (None, 256, 256, 3) 0

_________________________________________________________________

block1_conv1 (Conv2D) (None, 256, 256, 64) 1792

_________________________________________________________________

block1_conv2 (Conv2D) (None, 256, 256, 64) 36928

_________________________________________________________________

block1_pool (MaxPooling2D) (None, 128, 128, 64) 0

_________________________________________________________________

block2_conv1 (Conv2D) (None, 128, 128, 128) 73856

_________________________________________________________________

block2_conv2 (Conv2D) (None, 128, 128, 128) 147584

_________________________________________________________________

block2_pool (MaxPooling2D) (None, 64, 64, 128) 0

_________________________________________________________________

block3_conv1 (Conv2D) (None, 64, 64, 256) 295168

_________________________________________________________________

block3_conv2 (Conv2D) (None, 64, 64, 256) 590080

_________________________________________________________________

block3_conv3 (Conv2D) (None, 64, 64, 256) 590080

_________________________________________________________________

block3_conv4 (Conv2D) (None, 64, 64, 256) 590080

_________________________________________________________________

block3_pool (MaxPooling2D) (None, 32, 32, 256) 0

_________________________________________________________________

block4_conv1 (Conv2D) (None, 32, 32, 512) 1180160

_________________________________________________________________

block4_conv2 (Conv2D) (None, 32, 32, 512) 2359808

_________________________________________________________________

block4_conv3 (Conv2D) (None, 32, 32, 512) 2359808

_________________________________________________________________

block4_conv4 (Conv2D) (None, 32, 32, 512) 2359808

_________________________________________________________________

block4_pool (MaxPooling2D) (None, 16, 16, 512) 0

_________________________________________________________________

block5_conv1 (Conv2D) (None, 16, 16, 512) 2359808

_________________________________________________________________

block5_conv2 (Conv2D) (None, 16, 16, 512) 2359808

_________________________________________________________________

block5_conv3 (Conv2D) (None, 16, 16, 512) 2359808

_________________________________________________________________

block5_conv4 (Conv2D) (None, 16, 16, 512) 2359808

_________________________________________________________________

block5_pool (MaxPooling2D) (None, 8, 8, 512) 0

=================================================================

總參數(shù): 20,024,384.0

可訓練參數(shù): 20,024,384.0

不可訓練參數(shù): 0.0

"""

# 凍結不打算訓練的層。這里我凍結了前5層。

for layer in model.layers[:5]:

layer.trainable = False

# 增加定制層

x = model.output

x = Flatten()(x)

x = Dense(1024, activation="relu")(x)

x = Dropout(0.5)(x)

x = Dense(1024, activation="relu")(x)

predictions = Dense(16, activation="softmax")(x)

# 創(chuàng)建最終模型

model_final = Model(input = model.input, output = predictions)

# 編譯最終模型

model_final.compile(loss = "categorical_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"])

# 數(shù)據(jù)增強

train_datagen = ImageDataGenerator(

rescale = 1./255,

horizontal_flip = True,

fill_mode = "nearest",

zoom_range = 0.3,

width_shift_range = 0.3,

height_shift_range=0.3,

rotation_range=30)

test_datagen = ImageDataGenerator(

rescale = 1./255,

horizontal_flip = True,

fill_mode = "nearest",

zoom_range = 0.3,

width_shift_range = 0.3,

height_shift_range=0.3,

rotation_range=30)

train_generator = train_datagen.flow_from_directory(

train_data_dir,

target_size = (img_height, img_width),

batch_size = batch_size,

class_mode = "categorical")

validation_generator = test_datagen.flow_from_directory(

validation_data_dir,

target_size = (img_height, img_width),

class_mode = "categorical")

# 保存模型

checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)

early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto')

# 訓練模型

model_final.fit_generator(

train_generator,

samples_per_epoch = nb_train_samples,

epochs = epochs,

validation_data = validation_generator,

nb_val_samples = nb_validation_samples,

callbacks = [checkpoint, early])

遷移學習的常見情形

別忘了,靠前的層中的卷積特征更通用,靠后的層中的卷積特征更針對原本的數(shù)據(jù)集。遷移學習有4種主要場景:

1. 新數(shù)據(jù)集較小,和原數(shù)據(jù)集相似

如果我們嘗試訓練整個網(wǎng)絡,容易導致過擬合。由于新數(shù)據(jù)和原數(shù)據(jù)相似,因此我們期望卷積網(wǎng)絡中的高層特征和新數(shù)據(jù)集相關。因此,建議凍結所有卷積層,只訓練分類器(比如,線性分類器):

for layer in model.layers:

layer.trainable = False

2. 新數(shù)據(jù)集較大,和原數(shù)據(jù)集相似

由于我們有更多數(shù)據(jù),我們更有自信,如果嘗試對整個網(wǎng)絡進行精細調(diào)整,不會導致過擬合。

for layer in model.layers:

layer.trainable = True

其實默認值就是True,上面的代碼明確指定所有層可訓練,是為了更清楚地強調(diào)這一點。

由于開始的幾層檢測邊緣,你也可以選擇凍結這些層。比如,以下代碼凍結VGG19的前5層:

for layer in model.layers[:5]:

layer.trainable = False

3. 新數(shù)據(jù)集很小,但和原數(shù)據(jù)很不一樣

由于數(shù)據(jù)集很小,我們大概想要從靠前的層提取特征,然后在此之上訓練一個分類器:(假定你對h5py有所了解)

from keras import applications

from keras.preprocessing.image importImageDataGenerator

from keras import optimizers

from keras.models importSequential, Model

from keras.layers importDropout, Flatten, Dense, GlobalAveragePooling2D

from keras import backend as k

from keras.callbacks importModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping

img_width, img_height = 256, 256

### 創(chuàng)建網(wǎng)絡

img_input = Input(shape=(256, 256, 3))

x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)

x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

# 塊2

x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)

x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

model = Model(input = img_input, output = x)

model.summary()

"""

_________________________________________________________________

層 (類型) 輸出形狀 參數(shù)數(shù)量

=================================================================

input_1 (InputLayer) (None, 256, 256, 3) 0

_________________________________________________________________

block1_conv1 (Conv2D) (None, 256, 256, 64) 1792

_________________________________________________________________

block1_conv2 (Conv2D) (None, 256, 256, 64) 36928

_________________________________________________________________

block1_pool (MaxPooling2D) (None, 128, 128, 64) 0

_________________________________________________________________

block2_conv1 (Conv2D) (None, 128, 128, 128) 73856

_________________________________________________________________

block2_conv2 (Conv2D) (None, 128, 128, 128) 147584

_________________________________________________________________

block2_pool (MaxPooling2D) (None, 64, 64, 128) 0

=================================================================

總參數(shù):260,160.0

可訓練參數(shù):260,160.0

不可訓練參數(shù):0.0

"""

layer_dict = dict([(layer.name, layer) for layer in model.layers])

[layer.name for layer in model.layers]

"""

['input_1',

'block1_conv1',

'block1_conv2',

'block1_pool',

'block2_conv1',

'block2_conv2',

'block2_pool']

"""

import h5py

weights_path = 'vgg19_weights.h5'# ('https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg19_weights_tf_dim_ordering_tf_kernels.h5)

f = h5py.File(weights_path)

list(f["model_weights"].keys())

"""

['block1_conv1',

'block1_conv2',

'block1_pool',

'block2_conv1',

'block2_conv2',

'block2_pool',

'block3_conv1',

'block3_conv2',

'block3_conv3',

'block3_conv4',

'block3_pool',

'block4_conv1',

'block4_conv2',

'block4_conv3',

'block4_conv4',

'block4_pool',

'block5_conv1',

'block5_conv2',

'block5_conv3',

'block5_conv4',

'block5_pool',

'dense_1',

'dense_2',

'dense_3',

'dropout_1',

'global_average_pooling2d_1',

'input_1']

"""

# 列出模型中的所有層的名稱

layer_names = [layer.name for layer in model.layers]

"""

# 提取`.h5`文件中每層的模型權重

>>> f["model_weights"]["block1_conv1"].attrs["weight_names"]

array([b'block1_conv1/kernel:0', b'block1_conv1/bias:0'],

dtype='|S21')

# 將這一數(shù)組分配給weight_names

>>> f["model_weights"]["block1_conv1"]["block1_conv1/kernel:0]

# 列表推導(weights)儲存層的權重和偏置

>>>layer_names.index("block1_conv1")

1

>>> model.layers[1].set_weights(weights)

# 為特定層設置權重。

使用for循環(huán)我們可以為整個網(wǎng)絡設置權重。

"""

for i in layer_dict.keys():

weight_names = f["model_weights"][i].attrs["weight_names"]

weights = [f["model_weights"][i][j] for j in weight_names]

index = layer_names.index(i)

model.layers[index].set_weights(weights)

import cv2

import numpy as np

import pandas as pd

from tqdm import tqdm

import itertools

import glob

features = []

for i in tqdm(files_location):

im = cv2.imread(i)

im = cv2.resize(cv2.cvtColor(im, cv2.COLOR_BGR2RGB), (256, 256)).astype(np.float32) / 255.0

im = np.expand_dims(im, axis =0)

outcome = model_final.predict(im)

features.append(outcome)

## 收集這些特征,創(chuàng)建一個dataframe,在其上訓練一個分類器

以上代碼提取block2_pool特征。通常而言,由于這層有64 x 64 x 128特征,在其上訓練一個分類器可能于事無補。我們可以加上一些全連接層,然后在其基礎上訓練神經(jīng)網(wǎng)絡

增加少量全連接層和一個輸出層。

為靠前的層設置權重,然后凍結。

訓練網(wǎng)絡。

4. 新數(shù)據(jù)集很大,和原數(shù)據(jù)很不一樣

由于你有一個很大的數(shù)據(jù)集,你可以設計你自己的網(wǎng)絡,或者使用現(xiàn)有的網(wǎng)絡。

你可以基于隨機初始化權重或預訓練網(wǎng)絡權重初始化訓練網(wǎng)絡。一般選擇后者。

你可以使用不同的網(wǎng)絡,或者基于現(xiàn)有網(wǎng)絡做些改動。

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

    關注

    66

    文章

    8406

    瀏覽量

    132565
  • 深度學習
    +關注

    關注

    73

    文章

    5500

    瀏覽量

    121113

原文標題:基于Keras進行遷移學習

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是遷移學習遷移學習實現(xiàn)方法與工具分析

    向于不要求海量數(shù)據(jù)也能達到應用的精準要求,因此“小數(shù)據(jù)學習”正在成為新的熱點,以遷移學習,強化學習為代表的小數(shù)據(jù)學習技術,更能體現(xiàn)人工智能的
    發(fā)表于 05-11 09:12 ?1.2w次閱讀

    遷移學習訓練網(wǎng)絡

    keras遷移學習,改變VGG16輸出層,用imagenet權重retrain
    發(fā)表于 09-09 11:02

    【木棉花】學習筆記--分布式遷移

    遷移回原設備。創(chuàng)建工程同樣的,我們還是創(chuàng)建一個java的工程,然后將工程命名為 MyMigrate。具體是怎么實現(xiàn)的就可以參考我的前兩篇學習筆記:分布式數(shù)據(jù)庫、輕量級偏好數(shù)據(jù)庫學習
    發(fā)表于 09-05 10:49

    【木棉花】學習筆記--分布式遷移+回遷

    前言我又來啦,相信那些不了解分布式的童鞋,學習過我前幾篇學習筆記了之后是不是會更加理解了一些呢。當然了,我這星期要整理到學習筆記中的也是和分布式能力相關的一個學習案例,那就是在上一期分
    發(fā)表于 09-07 20:09

    遷移學習

    神經(jīng)網(wǎng)絡訓練方法卷積神經(jīng)網(wǎng)絡介紹經(jīng)典網(wǎng)絡結構介紹章節(jié)目標:深入了解神經(jīng)網(wǎng)絡的組成、訓練和實現(xiàn),掌握深度空間特征分布等關鍵概念,為深度遷移學習奠定知識基礎 三、遷移
    發(fā)表于 04-21 15:15

    基于局部分類精度的多源在線遷移學習算法

    近年來,遷移學習得到越來越多的關注,現(xiàn)有的在線遷移學習算法一般從單個源領域遷移知識。然而,當源領域與目標領域相似度較低時,很難進行有效的
    發(fā)表于 12-25 11:04 ?0次下載

    機器學習方法遷移學習的發(fā)展和研究資料說明

    近年來,遷移學習已經(jīng)引起了廣泛的關注和研究。遷移學習是運用已存有的知識對不同但相關領域問題進行求解的一種新的機器學習方法。它放寬了傳統(tǒng)機器
    發(fā)表于 07-17 08:00 ?0次下載
    機器<b class='flag-5'>學習</b>方法<b class='flag-5'>遷移</b><b class='flag-5'>學習</b>的發(fā)展和研究資料說明

    基于脈沖神經(jīng)網(wǎng)絡的遷移學習算法

    使用脈沖序列進行數(shù)據(jù)處理的脈沖神經(jīng)網(wǎng)絡具有優(yōu)異的低功耗特性,但由于學習算法不成熟,多層網(wǎng)絡練存在收斂困難的問題。利用反向傳播網(wǎng)絡具有學習算法成熟和訓練速度快的特點,設計一種遷移學習算法
    發(fā)表于 05-24 16:03 ?15次下載

    基于遷移學習與圖像增強的夜間航拍車輛識別

    為了對夜間航拍圖片中的車輛進行有效識別,提出基于二次遷移學習和 Retinex算法的圖像處理方法,僅利用小規(guī)模的數(shù)據(jù)集訓練網(wǎng)絡,采用基于 Faster r-CNN的深度學習算法即可實現(xiàn)
    發(fā)表于 06-21 14:59 ?16次下載

    基于WordNet模型的遷移學習文本特征對齊算法

    基于WordNet模型的遷移學習文本特征對齊算法
    發(fā)表于 06-27 16:14 ?8次下載

    基于遷移深度學習的雷達信號分選識別

    基于遷移深度學習的雷達信號分選識別 ? 來源:《軟件學報》?,作者王功明等 ? 摘要:? 針對當前雷達信號分選識別算法普遍存在的低信噪比下識別能力差、特征參數(shù)提取困難、分類器模型參數(shù)復雜等問題,提出
    發(fā)表于 03-02 17:35 ?1482次閱讀

    一文詳解遷移學習

    遷移學習需要將預訓練好的模型適應新的下游任務。然而,作者觀察到,當前的遷移學習方法通常無法關注與任務相關的特征。在這項工作中,作者探索了重新聚焦模型注意力以進行
    的頭像 發(fā)表于 08-11 16:56 ?6320次閱讀
    一文詳解<b class='flag-5'>遷移</b><b class='flag-5'>學習</b>

    視覺深度學習遷移學習訓練框架Torchvision介紹

    Torchvision是基于Pytorch的視覺深度學習遷移學習訓練框架,當前支持的圖像分類、對象檢測、實例分割、語義分割、姿態(tài)評估模型的遷移學習
    的頭像 發(fā)表于 09-22 09:49 ?899次閱讀
    視覺深度<b class='flag-5'>學習</b><b class='flag-5'>遷移</b><b class='flag-5'>學習</b>訓練框架Torchvision介紹

    遷移學習的基本概念和實現(xiàn)方法

    遷移學習(Transfer Learning)是機器學習領域中的一個重要概念,其核心思想是利用在一個任務或領域中學到的知識來加速或改進另一個相關任務或領域的學習過程。這種方法在數(shù)據(jù)稀缺
    的頭像 發(fā)表于 07-04 17:30 ?1619次閱讀

    預訓練和遷移學習的區(qū)別和聯(lián)系

    預訓練和遷移學習是深度學習和機器學習領域中的兩個重要概念,它們在提高模型性能、減少訓練時間和降低對數(shù)據(jù)量的需求方面發(fā)揮著關鍵作用。本文將從定義、原理、應用、區(qū)別和聯(lián)系等方面詳細探討預訓
    的頭像 發(fā)表于 07-11 10:12 ?1016次閱讀
    主站蜘蛛池模板: 精品无码乱码AV| 亚洲国语在线视频手机在线 | 9LPORM原创自拍达人| 国产精品无码人妻在线| 琉璃美人煞在线观看| 亚洲AV色香蕉一区二区9255| 99久久精品久久久久久清纯| 久久99国产精品蜜臀AV| 日日噜噜夜夜狠狠扒开双腿| 中文字幕精品AV内射夜夜夜| 国产精品JIZZ在线观看A片| 女人被弄到高潮叫床免| 亚洲熟妇色自偷自拍另类| 吃奶啃奶玩乳漫画| 久久无码人妻中文国产| 亚洲国产精品线在线观看| 含羞草在线| 偷拍国产精品在线播放| JEALOUSVUE成熟老师APP| 快播在线电影网站| 一一本之道高清手机在线观看 | caoporen超碰在线视频| 青青青草免费| 2019午夜75福利不卡片在线| 含羞草影院AE在线观看| 伊人久久青青| 国产在线综合色视频| 无码AV免费精品一区二区三区 | 四虎免费影院| 国产中文字幕乱码一区| 在线超碰免费视频观看| 精品欧美小视频在线观看| 中文国产成人精品久久免费| 牛牛在线国产精品| 70岁妇女牲交色牲片| 久久综合给合久久狠狠狠…| aaaaaa级特色特黄的毛片| 天天躁夜夜踩很很踩2022 | 国精产品一区二区三区有限公司 | 亚洲第一页在线播放| 国产亚洲精品久久久久久白晶晶|