久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

快速訓練殘差網(wǎng)絡 ResNet-101,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

 taotao_2016 2020-07-07
快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

筆者在實現(xiàn)ResNet的過程中,,由于電腦性能原因,,不得不選擇層數(shù)較少的ResNet-18進行訓練。但是很快發(fā)現(xiàn),,雖然只有18層,傳統(tǒng)的訓練方法仍然很耗時,,甚至難以完成對101層的ResNet-101的訓練,。

出于這個原因,這一次,,我將采用一種巧妙的方法——遷移學習來實現(xiàn),。即在預訓練模型的基礎上,采用101層的深度殘差網(wǎng)絡ResNet-101,,對如下圖所示的花數(shù)據(jù)集進行訓練,,快速實現(xiàn)了對原始圖像的分類和預測,最終預測精確度達到了驚人的98%,。

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)
快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

遷移學習

(1) 遷移學習簡介

什么是遷移學習呢?百度詞條給出了一個簡明的定義:遷移學習是一種機器學習方法,,就是把為任務 A 開發(fā)的模型作為初始點,,重新使用在為任務 B 開發(fā)模型的過程中。以我們的圖像分類任務為例:

假如任務A的任務是貓狗分類,,任務B是要對老虎,、獅子進行分類??梢园l(fā)現(xiàn),,任務 A 和任務 B 存在大量的共享知識,比如這些動物都可以從毛發(fā),,體型,,形態(tài)等方面進行辨別,。因此在已經(jīng)存在一個針對任務A訓練好的模型前提下,在訓練任務B的模型時,,我們可以不從零開始訓練,,而是基于在任務 A 上獲得的知識再進行訓練。在這里,,針對A任務已經(jīng)訓練好的模型參數(shù)稱之為:預訓練模型,。

這和“站在巨人的肩膀上”的思想非常類似。通過遷移任務 A 的知識,,在任務 B 上訓練分類器可以使用更少的樣本,,更少的訓練代價來獲得不錯的泛化能力。

(2) 遷移學習原理

為了更清楚地解釋遷移學習的原理,,下面借一張有意思的圖進行表達:

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

這是一個很常見的分類網(wǎng)絡結構圖,,LeNet-5,、AlexNet、VGG系列,、GoogLeNet等都是基于這種多個卷積層+全連接層的結構來實現(xiàn)的,。

圖中,Conv1,、Conv2…ConvN指的就是N個卷積層,,用來提取圖像不同層次的特征。其中,,淺層的Conv1,、Conv2等來提取圖像的淺層特征,比如:角點,、紋理,、明亮等;深層的ConvN-1,、ConvN等來提取的是圖像更為抽象的特征,,比如:眼睛、鼻子,、嘴巴,、肢體等。而Dense層指的是全連接層,,用來對已學得的特征進行組合,,從而學會了如何分辨人、汽車、貓,、狗等,。

對于這種經(jīng)典的分類網(wǎng)絡結構,有一個特點:淺層網(wǎng)絡識別的特征具有通用性,。正是得益于這種通用性,,我們才不用再重新花費大量時間和資源去訓練這些淺層特征,而是借助前人已經(jīng)訓練好的模型,,在其基礎上微調,,來訓練出應對特定任務的模型參數(shù)。這就是所謂“站在巨人肩膀上”的思想,。

(3) 遷移學習的優(yōu)勢

遷移學習的優(yōu)勢也很明顯,,主要有以下兩點:

  1. 由于是在預訓練模型的基礎上再進行訓練,因此訓練時間大大縮短,,而且結果一般也比較理想,。

  2. 當數(shù)據(jù)集較少時,也能訓練出理想的效果,。

(4) 常見的形式

常見的遷移學習方式有以下三種:

  1. 載入預訓練模型后,,訓練所有的參數(shù)。

  2. 載入預訓練模型后,,只訓練最后幾個全連接層的參數(shù)。

  3. 載入預訓練模型后,,在原網(wǎng)絡結構的基礎之上再添加一層全連接層,,僅訓練最后一個全連接層。

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

預訓練模型

在上文中,所說的針對任務A已經(jīng)訓練好的模型就是預訓練模型,。那么在此預訓練模型的基礎之上,,就可以繼續(xù)訓練任務B的模型參數(shù)了。

(1) 預訓練模型的獲取

由于我們本次要對101層的ResNet-100進行訓練,,因此我們可以在ResNet-101的預訓練模型的基礎上,,再來訓練針對自己任務的模型參數(shù)。對于很多經(jīng)典的深度神經(jīng)網(wǎng)路,,網(wǎng)上都會有很多官方的預訓練模型,。

比如,我們本次實戰(zhàn)所要用的ResNe-101的預訓練模型就可從github上的tensorflow官方開源項目上獲?。?/p>

https://github.com/tensorflow/models/tree/master/research/slim

下面綠色框代表的就是我們需要下載的版本:ResNet_v1_101

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

作為暖男的我,當然也考慮到有些同學可能出現(xiàn)github下載慢的問題,,那么你可以選擇從我的百度網(wǎng)盤下載:ResNet-101預訓練模型

(2) 預訓練模型的微調

下載好預訓練模型,,解壓后得到一個名為resnet_v1_101.ckpt的文件,放入如下圖所示的工程文件目錄下,。

由于原模型是1000分類網(wǎng)絡,。而本次我們是要對花數(shù)據(jù)集進行五分類,所以我們需要對模型進行微調:去掉預訓練模型的全連接層,,改用節(jié)點數(shù)為5的全連接層,,從而能對自定義數(shù)據(jù)集進行5分類。

實現(xiàn)上面這個過程,,只需要先運行如下圖所示的read_ckpt.py文件,,就可將官網(wǎng)提供的預訓練模型,轉換為我們所需要的預訓練模型,。文件已上傳到我的github:【AI 菌】的Github:https://github.com/Keyird/DeepLearning-TensorFlow2.0,。

快速訓練殘差網(wǎng)絡 ResNet-101,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

運行結束后,,在原工程文件下,就會產(chǎn)生我們所需要的預訓練權重文件,,如下圖紅色框中所示:

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

3. 數(shù)據(jù)集介紹

這次我采用的是花分類數(shù)據(jù)集,,該數(shù)據(jù)集一共有5個類別,,分別是:daisy、dandelion,、roses,、sunflowers、tulips,,一共有3670張圖片,。按9:1劃分數(shù)據(jù)集,其中訓練集train中有3306張,、驗證集val中有364張圖片,。

大家下載完,將文件解壓后直接放在工程根目錄下,,就像我這樣:

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

預訓練權重和數(shù)據(jù)集準備好了,,我們就可以開始實戰(zhàn)啦,!

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

ResNet-101實戰(zhàn)

溫馨提示:完整工程代碼已上傳我的github地址:【AI 菌】的Github ,。下面僅展示各個部分的核心代碼,,并做出必要的解釋。

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

注意在數(shù)據(jù)集準備過程中,,一定要對原圖進行預處理,。因為官方提供的預訓練模型,在訓練前也對數(shù)據(jù)集進行預處理了的,,這里要采用對應的預處理方法,,通過函數(shù)pre_function()來實現(xiàn)。

data_root = os.path.abspath(os.path.join(os.getcwd, '../..')) # 獲得根路徑image_path = data_root + '/DeepLearning/ResNet-101/flower_data/' # 花數(shù)據(jù)集的路徑train_dir = image_path + 'train'validation_dir = image_path + 'val'def pre_function(img): # 圖像預處理 img = img - [_R_MEAN, _G_MEAN, _B_MEAN] return img# 訓練集準備:將圖片載入,、數(shù)據(jù)增強,、預處理,然后轉換成張量形式train_image_generator = ImageDataGenerator(horizontal_flip=True, preprocessing_function=pre_function)train_data_gen = train_image_generator.flow_from_directory(directory=train_dir, batch_size=batch_size, shuffle=True, target_size=(im_height, im_width), class_mode='categorical')total_train = train_data_gen.n # 訓練集樣本總數(shù)

(2) 網(wǎng)絡搭建

下面是ResNet整體網(wǎng)絡結構的實現(xiàn),,對于ResNet的詳細網(wǎng)絡結構,,我已經(jīng)在TF2.0深度學習實戰(zhàn)(七):手撕深度殘差網(wǎng)絡ResNet中詳細講到,這里不再贅述,。

def _resnet(block, blocks_num, im_width=224, im_height=224, num_classes=1000, include_top=True): # 定義輸入(batch, 224, 224, 3) input_image = layers.Input(shape=(im_height, im_width, 3), dtype='float32') # 第一層conv1 x = layers.Conv2D(filters=64, kernel_size=7, strides=2, padding='SAME', use_bias=False, name='conv1')(input_image) x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5, name='conv1/BatchNorm')(x) x = layers.ReLU(x) x = layers.MaxPool2D(pool_size=3, strides=2, padding='SAME')(x) # conv2_x x = _make_layer(block, x.shape[-1], 64, blocks_num[0], name='block1')(x) # conv3_x x = _make_layer(block, x.shape[-1], 128, blocks_num[1], strides=2, name='block2')(x) # conv4_x x = _make_layer(block, x.shape[-1], 256, blocks_num[2], strides=2, name='block3')(x) # conv5_x x = _make_layer(block, x.shape[-1], 512, blocks_num[3], strides=2, name='block4')(x)

if include_top: # 全局平均池化 x = layers.GlobalAvgPool2D(x) x = layers.Dense(num_classes, name='logits')(x) predict = layers.Softmax(x) else: predict = x model = Model(inputs=input_image, outputs=predict) return model
def resnet101(im_width=224, im_height=224, num_classes=1000, include_top=True): return _resnet(Bottleneck, [3, 4, 23, 3], im_width, im_height, num_classes, include_top)

(3) 網(wǎng)絡微調

由于論文中ResNet-101是對ImageNet數(shù)據(jù)集進行1000分類,,這里我們只對花數(shù)據(jù)集進行5分類。所以要對原網(wǎng)絡進行微調:首先,,去掉原ResNet101后面的全局平均池化和全連接層,;然后,在模型后加入兩個全連接層,,節(jié)點數(shù)分別為1024和5,,對自定義數(shù)據(jù)集進行5分類。

# 使用False,,表示去掉原ResNet101后面的全局平均池化和全連接層feature = resnet101(num_classes=5, include_top=False)feature.load_weights('pretrain_weights.ckpt') # 加載預訓練模型feature.trainable = False # 訓練時凍結與訓練模型參數(shù)feature.summary # 打印預訓練模型參數(shù)

# 對網(wǎng)絡微調:在模型后加入兩個全連接層,進行自定義5分類model = tf.keras.Sequential([feature, tf.keras.layers.GlobalAvgPool2D(), tf.keras.layers.Dropout(rate=0.5), tf.keras.layers.Dense(1024), tf.keras.layers.Dropout(rate=0.5), tf.keras.layers.Dense(5), tf.keras.layers.Softmax()])model.summary # 打印增加層的參數(shù)

(4) 模型裝配與訓練

在模型裝配過程中,,采用的是Adam優(yōu)化器,,CategoricalCrossentropy交叉熵損失函數(shù),以及accuracy測試精確度,。

# 模型裝配# 1.目標損失函數(shù):交叉熵loss_object = tf.keras.losses.CategoricalCrossentropy(from_logits=False)# 2.優(yōu)化器:Adamoptimizer = tf.keras.optimizers.Adam(learning_rate=0.0002)# 3.評價標準:loss和accuracytrain_loss = tf.keras.metrics.Mean(name='train_loss')train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')

test_loss = tf.keras.metrics.Mean(name='test_loss')test_accuracy = tf.keras.metrics.CategoricalAccuracy(name='test_accuracy')

在模型訓練過程中,,我設置的batch_size = 16,epochs = 20,。每訓練完一個eopchs后,,打印出平均分類精確度;并且利用當前epochs訓練出的參數(shù),,對驗證集進行測試,,打印出當前epochs的驗證機測試精確度。最后保存模型參數(shù)。

for epoch in range(1, epochs + 1):# 訓練集訓練過程 for step in range(total_train // batch_size): # 一個epoch需要迭代的step數(shù) images, labels = next(train_data_gen) # 一次輸入batch_size組數(shù)據(jù) train_step(images, labels) # 訓練過程 # 打印訓練過程 rate = (step + 1) / (total_train // batch_size) # 一個epoch中steps的訓練完成度 a = '*' * int(rate * 50) # 已完成進度條用*表示 b = '.' * int((1 - rate) * 50) # 未完成進度條用.表示 acc = train_accuracy.result.numpy print('\r[{}]train acc: {:^3.0f}%[{}->{}]{:.4f}'.format(epoch, int(rate * 100), a, b, acc), end='') # 驗證集測試過程 for step in range(total_val // batch_size): test_images, test_labels = next(val_data_gen) test_step(test_images, test_labels) # 在驗證集上測試,,只進行前向計算 # 每訓練完一個epoch后,,打印顯示信息 template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}' print(template.format(epoch, train_loss.result, train_accuracy.result * 100, test_loss.result, test_accuracy.result * 100))# 保存模型參數(shù)model.save_weights('./save_weights/resNet_101.ckpt', save_format='tf')
快速訓練殘差網(wǎng)絡 ResNet-101,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

測試結果

(1) 圖像分類結果

下面就是在訓練過程中,,打印出來的分類精確度信息。圖中紅色框顯示的就是測試精確度,??梢钥吹诫S著訓練的進行,精確度在不斷地升高,,最終達到91.3%,。由于時間關系,這里我只訓練了10個epochs,,如果繼續(xù)訓練下去,,應該可以得到更好的模型。

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

(2) 對單張圖像的預測結果

在工程根目錄下,放入一張類別為roses的圖片,,將其命名為rose_test.jpg,。我們讀入這張圖片,加載剛才已經(jīng)訓練好的模型,,對圖片進行預測,。

在預測過程中,需要注意的是:

  • 需要對輸入的圖片進行預處理,,預處理方式和之前保持一致,。

  • 同樣要對原網(wǎng)絡模型進行微調,微調的方法和上述網(wǎng)絡微調的方法一致,。

預測代碼在工程文件下的predict.py里,,執(zhí)行它即可得到預測結果。預測代碼如下:

# 加載要進行預測的圖片img = Image.open('E:/DeepLearning/ResNet-101/rose_test.jpg')# resize成224x224img = img.resize((im_width, im_height))plt.imshow(img)# 將圖片做預處理_R_MEAN = 123.68_G_MEAN = 116.78_B_MEAN = 103.94img = np.array(img).astype(np.float32)img = img - [_R_MEAN, _G_MEAN, _B_MEAN]img = (np.expand_dims(img, 0))# class_indices.json中存放的是標簽字典try: json_file = open('./class_indices.json', 'r') class_indict = json.load(json_file)except Exception as e: print(e) exit(-1)# 網(wǎng)絡模型的微調feature = resnet50(num_classes=5, include_top=False)feature.trainable = Falsemodel = tf.keras.Sequential([feature, tf.keras.layers.GlobalAvgPool2D(), tf.keras.layers.Dropout(rate=0.5), tf.keras.layers.Dense(1024), tf.keras.layers.Dropout(rate=0.5), tf.keras.layers.Dense(5), tf.keras.layers.Softmax()])# 加載訓練好的模型參數(shù)model.load_weights('./save_weights/resNet_101.ckpt')result = model.predict(img)prediction = np.squeeze(result)predict_class = np.argmax(result)print('預測該圖片類別是:', class_indict[str(predict_class)], ' 預測概率是:', prediction[predict_class])plt.show

輸入的圖片rose_test.jpg屬于rose類,,圖片如下:

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

預測結果如下:

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

可見,預測結果與原圖rose_test.jpg的標簽一致,,預測成功,!且預測的概率高達98%,,預測效果比較好!

(3) 實際訓練參數(shù)量的對比

采用了遷移學習的方法訓練ResNet-101后,,我們在訓練速度上得到很大的提升,。而且得到的測試精度很高。那么下面,,我們從定量的角度來分析,,訓練速度大大提升的原因。

下圖是ResNet-101所有的卷積層參數(shù)列表,,也是我們所用的預訓練模型的部分,,其參數(shù)量有2300萬多。這部分參數(shù)是預訓練模型提供的,,不用訓練,。因此,下圖紅色框表示卷積層需要訓練的參數(shù)量為0,。

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

下圖是網(wǎng)絡微調后的網(wǎng)絡每層參數(shù)列表,。其中,,綠色框表示的是卷積層的總參數(shù)量,參數(shù)量是2300萬多,。實際訓練的是全連接層中參數(shù),,如下圖紅色框所示,一共是200萬多個參數(shù),。

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,精度高達 98% | 遷移學習實戰(zhàn)

由此可知,,使用了遷移學習的方法后,,卷積層2300萬多個參數(shù)可由預訓練模型提供,不需要再進行訓,;只需要對全連接層200萬多個參數(shù)進行訓練,。因此,訓練的速度大大提升,!

快速訓練殘差網(wǎng)絡 ResNet-101,,完成圖像分類與預測,,精度高達 98% | 遷移學習實戰(zhàn)

總結

采用遷移學習的方法,,我們就可以在預訓練模型的基礎上,再進行訓練,。這種思想,,就如同“站在巨人的肩膀上”,,不僅能減少時間和資源的開銷,還能提供一個本來就不錯的精確度,。而我們只需要在原網(wǎng)絡模型基礎上進行微調,,訓練出滿足自己任務的網(wǎng)絡模型參數(shù)。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多