欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深度學習小工程練習之tensorflow垃圾分類詳解

 更新時間:2021年04月14日 17:35:56   作者:tzc_fly  
這篇文章主要介紹了練習深度學習的一個小工程,代碼簡單明確,用來作為學習深度學習的練習很適合,對于有需要的朋友可以參考下,希望大家可以體驗到深度學習帶來的收獲

介紹

這是一個基于深度學習的垃圾分類小工程,用深度殘差網(wǎng)絡(luò)構(gòu)建

軟件架構(gòu)

  1. 使用深度殘差網(wǎng)絡(luò)resnet50作為基石,在后續(xù)添加需要的層以適應(yīng)不同的分類任務(wù)
  2. 模型的訓練需要用生成器將數(shù)據(jù)集循環(huán)寫入內(nèi)存,同時圖像增強以泛化模型
  3. 使用不包含網(wǎng)絡(luò)輸出部分的resnet50權(quán)重文件進行遷移學習,只訓練我們在5個stage后增加的層

安裝教程

  1. 需要的第三方庫主要有tensorflow1.x,keras,opencv,Pillow,scikit-learn,numpy
  2. 安裝方式很簡單,打開terminal,例如:pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
  3. 數(shù)據(jù)集與權(quán)重文件比較大,所以沒有上傳
  4. 如果環(huán)境配置方面有問題或者需要數(shù)據(jù)集與模型權(quán)重文件,可以在評論區(qū)說明您的問題,我將遠程幫助您

使用說明

  1. 文件夾theory記錄了我在本次深度學習中收獲的筆記,與模型訓練的控制臺打印信息
  2. 遷移學習需要的初始權(quán)重與模型定義文件resnet50.py放在model
  3. 下訓練運行trainNet.py,訓練結(jié)束會創(chuàng)建models文件夾,并將結(jié)果權(quán)重garclass.h5寫入該文件夾
  4. datagen文件夾下的genit.py用于進行圖像預處理以及數(shù)據(jù)生成器接口
  5. 使用訓練好的模型進行垃圾分類,運行Demo.py

結(jié)果演示

在這里插入圖片描述

cans易拉罐

在這里插入圖片描述

代碼解釋

在實際的模型中,我們只使用了resnet50的5個stage,后面的輸出部分需要我們自己定制,網(wǎng)絡(luò)的結(jié)構(gòu)圖如下:

在這里插入圖片描述

stage5后我們的定制網(wǎng)絡(luò)如下:

"""定制resnet后面的層"""
def custom(input_size,num_classes,pretrain):
    # 引入初始化resnet50模型
    base_model = ResNet50(weights=pretrain,
                          include_top=False,
                          pooling=None,
                          input_shape=(input_size,input_size, 3),
                          classes=num_classes)
    #由于有預權(quán)重,前部分凍結(jié),后面進行遷移學習
    for layer in base_model.layers:
        layer.trainable = False
    #添加后面的層
    x = base_model.output
    x = layers.GlobalAveragePooling2D(name='avg_pool')(x)
    x = layers.Dropout(0.5,name='dropout1')(x)
    #regularizers正則化層,正則化器允許在優(yōu)化過程中對層的參數(shù)或?qū)拥募せ钋闆r進行懲罰
    #對損失函數(shù)進行最小化的同時,也需要讓對參數(shù)添加限制,這個限制也就是正則化懲罰項,使用l2范數(shù)
    x = layers.Dense(512,activation='relu',kernel_regularizer= regularizers.l2(0.0001),name='fc2')(x)
    x = layers.BatchNormalization(name='bn_fc_01')(x)
    x = layers.Dropout(0.5,name='dropout2')(x)
    #40個分類
    x = layers.Dense(num_classes,activation='softmax')(x)
    model = Model(inputs=base_model.input,outputs=x)
    #模型編譯
    model.compile(optimizer="adam",loss = 'categorical_crossentropy',metrics=['accuracy'])
    return model

網(wǎng)絡(luò)的訓練是遷移學習過程,使用已有的初始resnet50權(quán)重(5個stage已經(jīng)訓練過,卷積層已經(jīng)能夠提取特征),我們只訓練后面的全連接層部分,4個epoch后再對較后面的層進行訓練微調(diào)一下,獲得更高準確率,訓練過程如下:

class Net():
    def __init__(self,img_size,gar_num,data_dir,batch_size,pretrain):
        self.img_size=img_size
        self.gar_num=gar_num
        self.data_dir=data_dir
        self.batch_size=batch_size
        self.pretrain=pretrain
    def build_train(self):
        """遷移學習"""
        model = resnet.custom(self.img_size, self.gar_num, self.pretrain)
        model.summary()
        train_sequence, validation_sequence = genit.gendata(self.data_dir, self.batch_size, self.gar_num, self.img_size)
        epochs=4
        model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs,verbose=1,validation_data=validation_sequence,
                                     max_queue_size=10,shuffle=True)
        #微調(diào),在實際工程中,激活函數(shù)也被算進層里,所以總共181層,微調(diào)是為了重新訓練部分卷積層,同時訓練最后的全連接層
        layers=149
        learning_rate=1e-4
        for layer in model.layers[:layers]:
            layer.trainable = False
        for layer in model.layers[layers:]:
            layer.trainable = True
        Adam =adam(lr=learning_rate, decay=0.0005)
        model.compile(optimizer=Adam, loss='categorical_crossentropy', metrics=['accuracy'])
        model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs * 2,verbose=1,
            callbacks=[
                callbacks.ModelCheckpoint('./models/garclass.h5',monitor='val_loss', save_best_only=True, mode='min'),
                callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1,patience=10, mode='min'),
                callbacks.EarlyStopping(monitor='val_loss', patience=10),],
            validation_data=validation_sequence,max_queue_size=10,shuffle=True)
        print('finish train,look for garclass.h5')

訓練結(jié)果如下:

 """

    loss: 0.7949 - acc: 0.9494 - val_loss: 0.9900 - val_acc: 0.8797

    訓練用了9小時左右

 """

如果使用更好的顯卡,可以更快完成訓練

最后

希望大家可以體驗到深度學習帶來的收獲,能和大家學習很開心,更多關(guān)于深度學習的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬取百度翻譯實現(xiàn)中英互譯功能

    Python爬取百度翻譯實現(xiàn)中英互譯功能

    這篇文章主要介紹了利用Python爬蟲爬取百度翻譯,從而實現(xiàn)中英文互譯的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-01-01
  • Python學習之日志模塊詳解

    Python學習之日志模塊詳解

    說到日志,我們完全可以想象為現(xiàn)實生活中的日記。日記是我們平時記錄我們生活中點點滴滴的一種方法,而日志我們可以認為是 程序的日記 ,程序的日記是用來記錄程序的行為。本文將詳細介紹Python中的日志模塊(logging),需要的可以參考一下
    2022-03-03
  • Python格式化輸出%s和%d

    Python格式化輸出%s和%d

    本篇文章主要介紹了Python格式化輸出%s和%d的實例案例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 屏蔽Django admin界面添加按鈕的操作

    屏蔽Django admin界面添加按鈕的操作

    這篇文章主要介紹了屏蔽Django admin界面添加按鈕的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 教你如何使Python爬取酷我在線音樂

    教你如何使Python爬取酷我在線音樂

    這篇文章主要介紹了如何利用?Python?實現(xiàn)酷我在線音樂的爬取,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-04-04
  • Python基于stuck實現(xiàn)scoket文件傳輸

    Python基于stuck實現(xiàn)scoket文件傳輸

    這篇文章主要介紹了Python基于stuck實現(xiàn)scoket文件傳輸,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 簡單學習Python time模塊

    簡單學習Python time模塊

    這篇文章主要和大家一起簡單學習一下Python time模塊,Python time模塊提供了一些用于管理時間和日期的C庫函數(shù),對time模塊感興趣的小伙伴們可以參考一下
    2016-04-04
  • Python的動態(tài)重新封裝的教程

    Python的動態(tài)重新封裝的教程

    這篇文章主要介紹了Python的動態(tài)重新封裝的教程,本文來自于IBM的官方開發(fā)者文檔,需要的朋友可以參考下
    2015-04-04
  • 詳解Python的基礎(chǔ)語法和變量操作

    詳解Python的基礎(chǔ)語法和變量操作

    這篇文章主要詳細介紹了Python的基礎(chǔ)語法和變量操作,對剛剛學習python的小伙伴非常友好,對我們的學習有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • Python:format格式化字符串詳解

    Python:format格式化字符串詳解

    這篇文章主要介紹了Python中用format函數(shù)格式化字符串的用法,格式化字符串是Python學習當中的基礎(chǔ)知識,本文主要針對Python2.7.x版本,需要的朋友可以參考下
    2021-09-09

最新評論