深さは小さい工事の練習のtenssorflowごみを学んで分類して詳しく解説します。


紹介する
これは深さ学習に基づくごみ分類小工程であり、深さ残差ネットワークで構築される。
ソフトウェアアーキテクチャ
  • は、深さ残差ネットワークreset 50を基礎として、異なる分類タスクに適応するために必要な層を追加する
  • を使用する。
  • モデルのトレーニングは、生成器でデータセットをメモリに循環的に書き込む必要があり、画像が拡張されて汎化モデル
  • になる。
  • ネットワーク出力部を含まないreset 50重みファイルを使って移動学習を行い、5つのstageの後に増加する層
  • だけを訓練する。
    チュートリアルをインストール
  • に必要な第三方倉庫は主にテナントflow 1.x,ケセラA,opencv,Pillow,scikit-learn,numpy
  • があります。
  • インストール方式は簡単で、terminalを開きます。例えば、pip install numpy-ihttps://pypi.tuna.tsinghua.edu.cn/simple
  • データセットは、重み付けファイルと比較して大きいので、
  • をアップロードしていません。
  • 環境構成に問題がある場合、またはデータセットとモデル重みファイルが必要であれば、コメントエリアであなたの問題を説明できます。
    使用説明
  • フォルダtheoryは、今回の深さ学習で得られたノートを記録し、モデルトレーニングのコンソールと情報を印刷します。
  • 移動学習に必要な初期重みとモデル定義ファイルreset 50.pyをmodel
  • に置く。
  • でtrinNet.pyを実行する訓練を行い、訓練が終了するとmodelsフォルダを作成し、結果の重みgarcelass.h 5をこのフォルダ
  • に書き込む。
  • datagenフォルダ下のgenit.pyは、画像前処理およびデータ生成器インターフェース
  • のために使用される。
  • 訓練されたモデルを使ってゴミの分別を行い、Demo.py
  • を実行します。
    結果のプレゼンテーション
    在这里插入图片描述
    cans缶
    在这里插入图片描述
    コード解釈
    実際のモデルでは、我々は5つのステージだけを使用して、後の出力部分は自分たちでカスタマイズする必要があります。ネットワークの構造図は以下の通りです。
    在这里插入图片描述
    stage 5以降のカスタムネットワークは以下の通りです。
    
    """  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)
        #      ,     ,        
        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    ,                            
        #             ,           ,             ,  l2  
        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
    ネットワークの訓練は移転学習プロセスであり、既存の初期のreset 50重み(5つのstageが訓練され、畳み込み層は特徴を抽出することができます)を使って、私たちは後の全連結層部分だけを訓練し、4つのepoch後に更に後の層をトレーニングして微調整して、より高い精度を得ます。トレーニングプロセスは以下の通りです。
    
    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)
            #  ,      ,          ,    181 ,              ,           
            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')
    訓練の結果は以下の通りです。
     """
        loss:0.7949-acc:0.9494-val_loss:0.9900-val_acc:0.8797
        訓練は9時間ぐらいかかりました。
     """
    もっといいグラフィックスカードを使えば、トレーニングが早くできます。
    最後に
    深さの学習がもたらした収穫を体験して、皆さんと勉強することができますように。もっと深い学習に関する資料を教えてください。他の関連記事に注目してください。