深度學習-python貓狗識別tensorflow2.0

好久沒更新了,一巴掌拍了拍自己閑得發(fā)慌的臉。雖說生活的壓力不大,但是也不能太咸魚啊。平時浪歸浪,但是學習和工作還是不能落下。

最近的工作太繁雜了,不知道要從何寫起,想起之前寫過用tensorflow1.x實現(xiàn)的「貓狗識別」的案例,這次就寫一個用tensorflow2.0實現(xiàn)的案例吧。

上一個案例傳送門:
深度學習-使用tensorflow實現(xiàn)貓狗識別

1. 數(shù)據集的準備

貓狗識別的數(shù)據集依舊可以從Kaggle上下載,數(shù)據集下載鏈接:
https://www.kaggle.com/c/dogs-vs-cats

下載后解壓,得到如下的文件夾

文件夾train里面放著25000張圖像,貓和狗的圖像分別都是12500張,圖像名稱上都有標明類別。文件夾test1里面放的是測試集,里面有12500張圖像,都沒有標簽,要自己來預測分類。

把數(shù)據集目錄整理成如下的形式

文件夾test1不變,新建一個文件夾validation,在文件夾train中分別拿出貓和狗的圖像各2500張,存到文件夾validation中。文件夾train和validation內都要新建文件夾cat和dog,分別把貓和狗的圖像都存到對應文件夾中。

這時候數(shù)據集目錄結構如下

2. 數(shù)據集的導入

在訓練前,先導入訓練集和驗證集。使用keras.preprocessing.image.ImageDataGenerator()做圖像增強的數(shù)據預處理設置,再使用flow_from_directory()從文件路徑中導入數(shù)據集,并設置圖像大小、batch_size和是否shuffle等參數(shù)。

train_datagen = keras.preprocessing.image.ImageDataGenerator(
        rescale=1. / 255,
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest',
    )

    train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(width, height),
        batch_size=batch_size,
        seed=7,
        shuffle=True,
        class_mode='categorical'
    )

    valid_datagen = keras.preprocessing.image.ImageDataGenerator(
        rescale=1. / 255,
    )

    valid_generator = valid_datagen.flow_from_directory(
        valid_dir,
        target_size=(width, height),
        batch_size=valid_batch_size,
        seed=7,
        shuffle=False,
        class_mode="categorical"
    )

3. 編寫神經網絡結構

編寫一個非?;A的卷積神經網絡

model = keras.models.Sequential([
        keras.layers.Conv2D(filters=32, kernel_size=3,
                            padding='same', activation='relu',
                            input_shape=[width, height, channel]),
        keras.layers.Conv2D(filters=32, kernel_size=3,
                            padding='same', activation='relu'),
        keras.layers.MaxPool2D(pool_size=2),

        keras.layers.Conv2D(filters=64, kernel_size=3,
                            padding='same', activation='relu'),
        keras.layers.Conv2D(filters=64, kernel_size=3,
                            padding='same', activation='relu'),
        keras.layers.MaxPool2D(pool_size=2),

        keras.layers.Conv2D(filters=128, kernel_size=3,
                            padding='same', activation='relu'),
        keras.layers.Conv2D(filters=128, kernel_size=3,
                            padding='same', activation='relu'),
        keras.layers.MaxPool2D(pool_size=2),

        keras.layers.Flatten(),
        keras.layers.Dense(128, activation='relu'),
        keras.layers.Dense(num_classes, activation='softmax')
    ])
    
    model.compile(loss='categorical_crossentropy',
                  optimizer='adam', metrics=['accuracy'])
    model.summary()

優(yōu)化器使用adam,損失函數(shù)使用'categorical_crossentropy' ,metrics參數(shù)填入accuracy,評估模型在訓練和測試過程中的準確率。

4. 模型訓練

訓練模型,設置callbacks,使用model.fit() 開始訓練。

callbacks = [
            keras.callbacks.TensorBoard(logdir),
            keras.callbacks.ModelCheckpoint(output_model_file,
                                            save_best_only=True,
                                            save_weights_only=True),
            keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)
        ]
history = model.fit(
        train_generator,
        epochs=epochs,
        validation_data = valid_generator,
        callbacks = callbacks
    )

訓練100步,看看效果。

由于使用了EarlyStopping,當準確率在幾個epochs內都沒有提高超過一定幅度的話就會停止訓練。由圖可以看出,訓練到40個epoch左右驗證集的準確率達到90%多了。下面是訓練過程的準確率和損失值變化曲線!

5.預測和分類

先讀取文件夾test1中的圖像,使用 model.predict() 進行預測,再根據預測結果把圖像進行分類,分別存儲到 貓 和 狗 的文件夾中。

分類為貓的圖像
分類為狗的圖像

預測的圖像一共12500張,分類之后兩個文件夾內分別都是6000多張,幾乎持平,分類效果還是不錯的。寫完了這篇,繼續(xù)擼擼貓,繼續(xù)咸魚。

ps: 在本人公眾號回復「貓狗」即可獲取完整代碼。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容