真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python深度學(xué)習(xí)實例--基于卷積神經(jīng)網(wǎng)絡(luò)的小型數(shù)據(jù)處理(貓狗分類)-創(chuàng)新互聯(lián)

Python深度學(xué)習(xí)實例--基于卷積神經(jīng)網(wǎng)絡(luò)的小型數(shù)據(jù)處理(貓狗分類)
  • 1.卷積神經(jīng)網(wǎng)絡(luò)
    • 1.1卷積神經(jīng)網(wǎng)絡(luò)簡介
    • 1.2卷積運算
    • 1.3 深度學(xué)習(xí)與小數(shù)據(jù)問題的相關(guān)性
  • 2.下載數(shù)據(jù)
    • 2.1下載原始數(shù)據(jù)集
    • 2.2訓(xùn)練集和測試集的文件介紹
  • 3.構(gòu)建網(wǎng)絡(luò)
  • 4.數(shù)據(jù)處理并擬合模型
    • 4.1使用 ImageDataGenerator從目錄中讀取圖像
    • 4.2利用批量生成器擬合模型
    • 4.3 繪制訓(xùn)練過程中的損失與精度曲線
  • 5.使用數(shù)據(jù)增強來防止過擬合

站在用戶的角度思考問題,與客戶深入溝通,找到白銀區(qū)網(wǎng)站設(shè)計與白銀區(qū)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋白銀區(qū)地區(qū)。1.卷積神經(jīng)網(wǎng)絡(luò) 1.1卷積神經(jīng)網(wǎng)絡(luò)簡介

卷積神經(jīng)網(wǎng)絡(luò),也叫CNN,它是計算機視覺應(yīng)用幾乎都在使用的一種深度學(xué)習(xí)模型。我們都知道,成功提取顯著相關(guān)的特征是保障任何機器學(xué)習(xí)的算法成功的保障,傳統(tǒng)的機器學(xué)習(xí)模型依賴領(lǐng)域?qū)<业妮斎胩卣鳎蛘呋谟嬎闾卣鞯奶崛〖夹g(shù)。神經(jīng)網(wǎng)絡(luò)能夠自動地從原始數(shù)據(jù)中學(xué)習(xí)對特定任務(wù)最有用的特征。因此通常把神經(jīng)網(wǎng)絡(luò)作為特征提取引擎:即從緊靠著輸入層后面的早期層提取低級特征。
卷積神經(jīng)網(wǎng)絡(luò),通過逐層組合低級特征來構(gòu)造所謂的特征層次,從而形成高級特征。例如可以在處理圖像時從早期層把如邊緣和斑點之類的低級特征提取出來,然后把它們組合在一起形成如建筑物、汽車或狗的形狀的高級特征。
正如在下面的圖片中可以看到的,CNN根據(jù)輸入圖像計算特征映射,其中每個元素都來自于輸入圖像中的局部像素區(qū):
在這里插入圖片描述

該局部像素區(qū)被稱之為局部接收場。CNN通常會很好的完成與圖像相關(guān)的任務(wù),這主要是因為下面兩個重要思想:

  1. 稀疏連通:特征映射的單個元素只連接到一小塊像素點。
  2. 參數(shù)共享:對于輸入圖像的不同區(qū)域使用相同的權(quán)重。
    作為這種思想的直接結(jié)果,網(wǎng)絡(luò)的權(quán)重數(shù)急劇下降,并且可以看到模型捕獲顯著特征的能力得以提高。
1.2卷積運算

卷積是CNN的基本操作,因此了解該操作的工作原理很重要。密集連接層與卷積層的根本區(qū)別在于:Dense層從輸入特征空間中學(xué)到的是全局模式,而卷積層學(xué)到的是局部模式。(見下圖),對于圖像來說,學(xué)到的就是在輸入圖像的二維小窗口中發(fā)現(xiàn)的模式。
圖一
這個重要特性使卷積神經(jīng)網(wǎng)絡(luò)具有以下兩個性質(zhì)。

  1. 卷積神經(jīng)網(wǎng)絡(luò)學(xué)到的模式具有平移不變性(translation invariant)。卷積神經(jīng)網(wǎng)絡(luò)在圖像右下角學(xué)到某個模式之后,它可以在任何地方識別這個模式,比如左上角。對于密集連接網(wǎng)絡(luò)來說,如果模式出現(xiàn)在新的位置,它只能重新學(xué)習(xí)這個模式。這使得卷積神經(jīng)網(wǎng)絡(luò)在處理圖像時可以高效利用數(shù)據(jù)(因為視覺世界從根本上具有平移不變性),它只需要更少的訓(xùn)練樣本就可以學(xué)到具有泛化能力的數(shù)據(jù)表示。
  2. 卷積神經(jīng)網(wǎng)絡(luò)可以學(xué)到模式的空間層次結(jié)構(gòu)(spatial hierarchies of patterns),如下圖。第一個卷積層將學(xué)習(xí)較小的局部模式(比如邊緣),第二個卷積層將學(xué)習(xí)由第一層特征組成的更大的模式,以此類推。這使得卷積神經(jīng)網(wǎng)絡(luò)可以有效地學(xué)習(xí)越來越復(fù)雜、越來越抽象的視覺概念。
    在這里插入圖片描述

對于包含兩個空間軸(高度和寬度)和一個深度軸(也叫通道軸)的 3D 張量,其卷積也叫特征圖(feature map)。對于 RGB 圖像,深度軸的維度大小等于 3,因為圖像有 3 個顏色通道:紅色、綠色和藍色。對于黑白圖像,深度等于 1(表示灰度等級)。卷積運算從輸入特征圖中提取圖塊,并對所有這些圖塊應(yīng)用相同的變換,生成輸出特征圖(output feature map)。該輸出特征圖仍是一個 3D 張量,具有寬度和高度,其深度可以任意取值,因為輸出深度是層的參數(shù),深度軸的不同通道不再像 RGB 輸入那樣代表特定顏色,而是代表過濾器。
卷積由以下兩個關(guān)鍵參數(shù)所定義。

  1. 從輸入中提取的圖塊尺寸:這些圖塊的大小通常是 3×3 或 5×5。本例中為 3×3,這是
    很常見的選擇。
  2. 輸出特征圖的深度:卷積所計算的過濾器的數(shù)量。本例第一層的深度為 32,最后一層的
    深度是 64。

卷積的工作原理:在 3D 輸入特征圖上滑動這些 3×3 或 5×5 的窗口,在每個可能的位置停止并提取周圍特征的 3D 圖塊[形狀為 (window_height, window_width, input_depth)]。然后每個 3D 圖塊與學(xué)到的同一個權(quán)重矩陣[叫作卷積核]做張量積,轉(zhuǎn)換成形狀為 (output_depth,) 的 1D 向量。然后對所有這些向量進行空間重組,使其轉(zhuǎn)換為形狀為 (height, width, output_depth) 的 3D 輸出特征圖。輸出特征圖中的每個空間位置都對應(yīng)于輸入特征圖中的相同位置(比如輸出的右下角包含了輸入右下角的信息)。舉個例子,利用 3×3 的窗口,向量 output[i, j, :] 來自 3D 圖塊 input[i-1:i+1,
j-1:j+1, :]。整個過程詳見下圖。
在這里插入圖片描述

1.3 深度學(xué)習(xí)與小數(shù)據(jù)問題的相關(guān)性

有這樣一種說法,僅在有大量數(shù)據(jù)可用時,深度學(xué)習(xí)才有效。這種說法部分正確:深度學(xué)習(xí)的一個基本特性就是能夠獨立地在訓(xùn)練數(shù)據(jù)中找到有趣的特征,無須人為的特征工程,而這只在擁有大量訓(xùn)練樣本時才能實現(xiàn)。對于輸入樣本的維度非常高(比如圖像)的問題尤其如此。但對于初學(xué)者來說,所謂“大量”樣本是相對的,即相對于你所要訓(xùn)練網(wǎng)絡(luò)的大小和深度而言。只用幾十個樣本訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)就解決一個復(fù)雜問題是不可能的,但如果模型很小,并做了很好的正則化,同時任務(wù)非常簡單,那么幾百個樣本可能就足夠了。由于卷積神經(jīng)網(wǎng)絡(luò)學(xué)到的是局部的、平移不變的特征,它對于感知問題可以高效地利用數(shù)據(jù)。雖然數(shù)據(jù)相對較少,但在非常小的圖像數(shù)據(jù)集上從頭開始訓(xùn)練一個卷積神經(jīng)網(wǎng)絡(luò),仍然可以得到不錯的結(jié)果,而且無須任何自定義的特征工程。
在這個例子中我們將重點討論貓狗圖像分類,數(shù)據(jù)集中包含 4000 張貓和狗的圖像(2000 張貓的圖像,2000 張狗的圖像)。我們將 2000 張圖像用于訓(xùn)練,1000 張用于驗證,1000張用于測試。

2.下載數(shù)據(jù) 2.1下載原始數(shù)據(jù)集

下載原始數(shù)據(jù)集:https://www.kaggle.com/c/dogs-vs-cats/data如果沒有 Kaggle 賬號的話,注冊一個即可。這個數(shù)據(jù)集包含 25 000 張貓狗圖像(每個類別都有 12 500 張),大小為 543MB。下載數(shù)據(jù)并解壓之后,你需要創(chuàng)建一個新數(shù)據(jù)集,其中包含三個子集:每個類別各 1000 個樣本的訓(xùn)練集、每個類別各 500 個樣本的驗證集和每個類別各 500 個樣本的測試集。

2.2訓(xùn)練集和測試集的文件介紹

一級目錄:一共有三個文件夾,分別是測試集,訓(xùn)練集,驗證集。
在這里插入圖片描述
二級目錄:(以訓(xùn)練集為例)一共有兩個文件夾,分別是貓和狗。
在這里插入圖片描述
三級目錄:(訓(xùn)練集中的狗圖像為例)訓(xùn)練集中一共有1000張狗的圖像。
在這里插入圖片描述
代碼實現(xiàn):

import os, shutil
original_dataset_dir='D:\dogs-vs-cats\train'  # 這是我自己存儲完整數(shù)據(jù)的地址
# 創(chuàng)建一個保存較小數(shù)據(jù)集的目錄,將其命名為cats_and_dogs
base_dir='D:\cats_and_dogs' 
os.mkdir(base_dir)

# 分別對應(yīng)劃分后的訓(xùn)練、驗證和測試的目錄
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)

# 貓的訓(xùn)練圖像目錄
train_cats_dir = os.path.join(train_dir, 'cats')
os.mkdir(train_cats_dir)

# 狗的訓(xùn)練圖像目錄
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.mkdir(train_dogs_dir)

# 貓的驗證圖像目錄
validation_cats_dir = os.path.join(validation_dir, 'cats')
os.mkdir(validation_cats_dir)

# 狗的驗證圖像目錄
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
os.mkdir(validation_dogs_dir)

# 貓的測試圖像目錄
test_cats_dir = os.path.join(test_dir, 'cats')
os.mkdir(test_cats_dir)

# 狗的測試圖像目錄
test_dogs_dir = os.path.join(test_dir, 'dogs')
os.mkdir(test_dogs_dir)

# 將前1000張貓的圖像復(fù)制到 train_cats_dir
fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(train_cats_dir, fname)
    shutil.copyfile(src, dst)

# 將接下來500張貓的圖像復(fù)制到validation_cats_dir
fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(validation_cats_dir, fname)
    shutil.copyfile(src, dst)
    
# 將接下來的500張貓的圖像復(fù)制到test_cats_dir
fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(test_cats_dir, fname)
    shutil.copyfile(src, dst)
    
# 將前1000張狗的圖像復(fù)制到train_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(train_dogs_dir, fname)
    shutil.copyfile(src, dst)
    
# 將接下來500張狗的圖像復(fù)制到validation_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(validation_dogs_dir, fname)
    shutil.copyfile(src, dst)
    
# 將接下來500張狗的圖像復(fù)制到test_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(test_dogs_dir, fname)
    shutil.copyfile(src, dst)
    
# 檢查一下訓(xùn)練、驗證、測試中分別包含多少張圖像
print('total training cat images:', len(os.listdir(train_cats_dir)))  
print('total training dog images:', len(os.listdir(train_dogs_dir)))
print('total validation dog images:', len(os.listdir(validation_dogs_dir)))
print('total validation cat images:', len(os.listdir(validation_cats_dir)))
print('total test cat images:', len(os.listdir(test_cats_dir)))
print('total test dog images:', len(os.listdir(test_dogs_dir)))

輸出:

total training cat images: 1000
total training dog images: 1000
total validation cat images: 500
total validation dog images: 500
total test cat images: 500
total test dog images: 500
3.構(gòu)建網(wǎng)絡(luò)

代碼實現(xiàn):

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

from keras import optimizers
model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])
              
# 看一下特征圖的維度如何隨著每層變化
model.summary()

輸出:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 15, 15, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 7, 7, 128)         0         
_________________________________________________________________
flatten (Flatten)            (None, 6272)              0         
_________________________________________________________________
dense (Dense)                (None, 512)               3211776   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 3,453,121
Trainable params: 3,453,121
Non-trainable params: 0

這里列出常見問題類型的損失函數(shù)和最后一層激活函數(shù)
在這里插入圖片描述

4.數(shù)據(jù)處理并擬合模型 4.1使用 ImageDataGenerator從目錄中讀取圖像

你現(xiàn)在已經(jīng)知道,將數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò)之前,應(yīng)該將數(shù)據(jù)格式化為經(jīng)過預(yù)處理的浮點數(shù)張量。
現(xiàn)在,數(shù)據(jù)以 JPEG 文件的形式保存在電腦中,所以數(shù)據(jù)預(yù)處理步驟大致如下。

  1. 讀取圖像文件。
  2. 將 JPEG 文件解碼為 RGB 像素網(wǎng)格。
  3. 將這些像素網(wǎng)格轉(zhuǎn)換為浮點數(shù)張量。
  4. 將像素值(0~255 范圍內(nèi))縮放到 [0, 1] 區(qū)間。
    代碼實現(xiàn):
# ImageDataGenerator(rescale=所有數(shù)據(jù)集將乘以該數(shù)值, rotation_range=隨即旋轉(zhuǎn)角度數(shù)范圍,   width_shift_range=隨即寬度偏移量, height_shift_range=隨即高度偏移量,horizontal_flip=是否隨機水平翻轉(zhuǎn),zoom_range=隨機縮放的范圍)
from keras.preprocessing.image import ImageDataGenerator

# 將所有圖像乘以1/255縮放
train_datagen = ImageDataGenerator(rescale=1./255) 
test_datagen = ImageDataGenerator(rescale=1./255)

# flow_from_directory(): 這是ImageDataGenerator類的一個方法,以文件夾路徑為參數(shù),在一個無限循環(huán)中無限產(chǎn)生batch數(shù)據(jù),需要詳細參數(shù)說明可以自行查閱相關(guān)資料
train_generator = train_datagen.flow_from_directory(
        # 目標(biāo)目錄
        train_dir,
        # 將所有圖像的大小調(diào)整為150*150
        target_size=(150, 150),
        batch_size=20,
        # 需要使用二進制標(biāo)簽
        class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')
4.2利用批量生成器擬合模型

利用生成器,我們讓模型對數(shù)據(jù)進行擬合。我們將使用 fit_generator 方法來擬合,它在數(shù)據(jù)生成器上的效果和 fit 相同。它的第一個參數(shù)應(yīng)該是一個 Python 生成器,可以不停地生成輸入和目標(biāo)組成的批量,比如 train_generator。因為數(shù)據(jù)是不斷生成的,所以 Keras 模型要知道每一輪需要從生成器中抽取多少個樣本。這是 steps_per_epoch 參數(shù)的作用:從生成器中抽取 steps_per_epoch 個批量后(即運行了 steps_per_epoch 次梯度下降),擬合過程將進入下一個輪次。本例中,每個批量包含 20 個樣本,所以讀取完所有 2000 個樣本需要 100個批量。
使用 fit_generator 時,你可以傳入一個 validation_data 參數(shù),其作用和在 fit 方法中類似。值得注意的是,這個參數(shù)可以是一個數(shù)據(jù)生成器,但也可以是 Numpy 數(shù)組組成的元組。如果向 validation_data 傳入一個生成器,那么這個生成器應(yīng)該能夠不停地生成驗證數(shù)據(jù)批量,因此你還需要指定 validation_steps 參數(shù),說明需要從驗證生成器中抽取多少個批次用于評估。
代碼實現(xiàn):

history = model.fit_generator(
 train_generator,
 steps_per_epoch=100,
 epochs=30,
 validation_data=validation_generator,
 validation_steps=50)

# 在訓(xùn)練完成后保存模型、
model.save('cats_and_dogs_small_1.h5')
4.3 繪制訓(xùn)練過程中的損失與精度曲線

代碼實現(xiàn):

import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

輸出:
在這里插入圖片描述
從這些圖像中都能看出過擬合的特征。訓(xùn)練精度隨著時間線性增加,直到接近 100%,而驗
證精度則停留在 70%~72%。驗證損失僅在 5 輪后就達到最小值,然后保持不變,而訓(xùn)練損失則
一直線性下降,直到接近于 0。

5.使用數(shù)據(jù)增強來防止過擬合

因為訓(xùn)練樣本相對較少(2000 個),所有模型容易過擬合。在本節(jié)中將使用一種針對于計算機視覺領(lǐng)域的新方法,在用深度學(xué)習(xí)模型處理圖像時幾乎都會用到這種方法,它就是數(shù)據(jù)增強(data augmentation)。數(shù)據(jù)增強是從現(xiàn)有的訓(xùn)練樣本中生成更多的訓(xùn)練數(shù)據(jù),其方法是利用多種能夠生成可信圖像的隨機變換來增加(augment)樣本。其目標(biāo)是,模型在訓(xùn)練時不會兩次查看完全相同的圖像。這讓模型能夠觀察到數(shù)據(jù)的更多內(nèi)容,從而具有更好的泛化能力。在 Keras 中,這可以通過對 ImageDataGenerator 實例讀取的圖像執(zhí)行多次隨機變換來實現(xiàn)。
如果使用這種數(shù)據(jù)增強來訓(xùn)練一個新網(wǎng)絡(luò),那么網(wǎng)絡(luò)將不會兩次看到同樣的輸入。但網(wǎng)絡(luò)看到的輸入仍然是高度相關(guān)的,因為這些輸入都來自于少量的原始圖像。你無法生成新信息,而只能混合現(xiàn)有信息。因此,這種方法可能不足以完全消除過擬合。為了進一步降低過擬合,你還需要向模型中添加一個 Dropout 層,添加到密集連接分類器之前。
代碼實現(xiàn):

# 定義一個包含dropout的新卷積神經(jīng)網(wǎng)絡(luò)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])


# 利用數(shù)據(jù)增強生成器訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)
 train_datagen = ImageDataGenerator(                        # 設(shè)置數(shù)據(jù)增強
                              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,)
test_datagen = ImageDataGenerator(rescale=1./255) 
train_generator = train_datagen.flow_from_directory(        # 對訓(xùn)練數(shù)據(jù)進行增強
                              train_dir,
                              target_size=(150, 150), 
                              batch_size=32,
                              class_mode='binary') 
validation_generator = test_datagen.flow_from_directory(    # 驗證數(shù)據(jù)不能進行增強
                              validation_dir,
                              target_size=(150, 150),
                              batch_size=32,
                              class_mode='binary')
history = model.fit_generator(                              #擬合模型
                              train_generator,
                              steps_per_epoch=100,
                              epochs=100,
                              validation_data=validation_generator,
                              validation_steps=50)
                            
                            
# 保存模型
model.save('cats_and_dogs_small_2.h5')          

在上面代碼中只選擇了幾個參數(shù)進行數(shù)據(jù)增強。(想了解更多參數(shù),請點擊此處)下面介紹一下這些參數(shù)的含義。

  1. rotation_range 是角度值(在 0~180 范圍內(nèi)),表示圖像隨機旋轉(zhuǎn)的角度范圍。
  2. width_shift 和 height_shift 是圖像在水平或垂直方向上平移的范圍(相對于總寬度或總高度的比例)。
  3. shear_range 是隨機錯切變換的角度。
  4. zoom_range 是圖像隨機縮放的范圍。
  5. horizontal_flip 是隨機將一半圖像水平翻轉(zhuǎn)。
  6. fill_mode是用于填充新創(chuàng)建像素的方法,這些新像素可能來自于旋轉(zhuǎn)或?qū)挾?高度平移。

我們可以再次繪制訓(xùn)練過程中的損失與精度曲線(這里不再展示結(jié)果),可以發(fā)現(xiàn)使用了數(shù)據(jù)增強和dropout之后,模型不再過擬合?,F(xiàn)在的精度大約為80%左右,比未使用數(shù)據(jù)增強的模型提高了15%(相對比例)。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


本文標(biāo)題:Python深度學(xué)習(xí)實例--基于卷積神經(jīng)網(wǎng)絡(luò)的小型數(shù)據(jù)處理(貓狗分類)-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/ggheh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部