3.4 Kaggle自然场景图片分类
3.4 Kaggle自然場(chǎng)景圖片分類
自然場(chǎng)景識(shí)別數(shù)據(jù)集來(lái)自kaggle競(jìng)賽平臺(tái),最初是由Intel舉辦的一個(gè)圖片分類競(jìng)賽數(shù)據(jù)集,它的訓(xùn)練集有14034張圖片,測(cè)試集有3000張圖片,未標(biāo)注數(shù)據(jù)集有7301張圖片,格式都為jpg,圖片分辨率統(tǒng)一為150×150。
數(shù)據(jù)集共有6個(gè)類別:
- buildings(建筑)
- forest(森林)
- glacier(冰川)
- mountain(高山)
- sea(海洋)
- street(街道)
每個(gè)類別的訓(xùn)練集圖片數(shù)量大概有2000多張。
鏈接:https://pan.baidu.com/s/1u02PyMyTKl2mD5imG4eirQ
提取碼:k13k
項(xiàng)目文件樹(shù)狀圖
實(shí)際項(xiàng)目文件結(jié)構(gòu)
主要流程
data_generator.py數(shù)據(jù)讀取腳本
圖片生成器tf.keras.preprocessing.image.ImageDataGenerator
用到的參數(shù):
- rescale:輸入一個(gè)整數(shù),通常為1/255,由于圖像像素都是0~255的整數(shù),rescale可以 讓所有像素統(tǒng)一乘上一個(gè)數(shù)值,如果是1/255,像素會(huì)被轉(zhuǎn)化為0~1之間的數(shù)。
從目錄讀取圖片tf.keras.preprocessing.image.ImageDataGenerator.flow_from_directory
flowchatchat_from_directory:從文件中讀寫
用到的參數(shù):
- directory:圖片存放路徑。
- target_size:圖片寬高縮放到指定的大小,默認(rèn)(256, 256)。
- batch_size:每次讀取的圖片數(shù),默認(rèn)32。
- class_mode:類別格式,默認(rèn)’categorical’。
如果是’sparse’:類別[‘paper’, ‘rock’, ‘scissors’] ——> [0, 1, 2]
如果是’categorical’:類別[‘paper’, ‘rock’, ‘scissors’] ——> [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
如果是’input’:類別[‘paper’, ‘rock’, ‘scissors’]保持不變
如果是None:不返回標(biāo)簽。 - subset:子集
image_plot.py圖片可視化腳本
畫圖函數(shù)plot_images
參數(shù)介紹:
- images:包含多張圖片數(shù)據(jù)的序列。
- labels:包含圖片對(duì)應(yīng)標(biāo)簽的序列(序列中的元素需要是0,1,2,…,9這樣的正整數(shù))。
conv_net.py模型網(wǎng)絡(luò)文件
卷積操作tf.keras.layers.Conv2D
用到的參數(shù):
- input_shape:輸入數(shù)據(jù)的維度大小,如3通道64X64的輸入圖片,要設(shè)置為(64,64,3),參數(shù)input_shape只需要在第一個(gè)網(wǎng)絡(luò)層進(jìn)行設(shè)置
- filters:輸入整數(shù),卷積核個(gè)數(shù)(等于卷積后輸出的通道數(shù))。
- kernel_size:卷積核的大小,通常為一個(gè)正整數(shù)或者一個(gè)列表。
例子:kernel_size = 3, kernel_size(3,3),都表示卷積核寬高方向的大小為3.
設(shè)置為整數(shù)就表示卷積核的height = width = 指定整數(shù)。 - strides:卷積核的滑動(dòng)步長(zhǎng),通常為一個(gè)正整數(shù)或者一個(gè)列表,列表可以包含2個(gè)或者4個(gè)元素,默認(rèn)為(1, 1)。
例子:strides=2, strides=(2,2),都表示卷積核寬高方向的大小為3 - padding:補(bǔ)0設(shè)置,可選項(xiàng)為"VALID","SAME"。
- 如果padding="VALID",表示不做補(bǔ)0設(shè)置
- 如果padding="SAME",程序會(huì)自動(dòng)補(bǔ)0,使得輸出feature map的寬高=ceil(輸入圖片寬高/strides),
ceil表示向上取整,當(dāng)strides=1時(shí),輸入輸出的寬高是一致的
- kernel_initializer:權(quán)重初始化,默認(rèn)是’glorot_uniform’(即Xavier均勻初始化)。
可選項(xiàng):- ‘RandomNormal’:正態(tài)分布采樣,均值為0,標(biāo)準(zhǔn)差0.05
- ‘glorot_normal’:正態(tài)分布采樣,均值為0,標(biāo)準(zhǔn)差stddev = sqrt(2 / (fan_in + fan_out))
- ‘glorot_uniform’:均勻分布采樣,范圍[-limit, limit],標(biāo)準(zhǔn)差limit = sqrt(6 / (fan_in + fan_out))
- ‘lecun_normal’:正態(tài)分布采樣,均值為0,標(biāo)準(zhǔn)差stddev = sqrt(1 / fan_in)
- ‘lecun_uniform’:均勻分布采樣,范圍[-limit, limit],標(biāo)準(zhǔn)差limit = sqrt(3 / fan_in)
- ‘he_normal’:正態(tài)分布采樣,均值為0,標(biāo)準(zhǔn)差stddev = sqrt(2 / fan_in)
- ‘he_uniform’:均勻分布采樣,范圍[-limit, limit],標(biāo)準(zhǔn)差limit = sqrt(6 / fan_in)
fan_in是輸入的神經(jīng)元個(gè)數(shù),fan_out是輸出的神經(jīng)元個(gè)數(shù)。
- activation:激活函數(shù)。
可選項(xiàng):- ‘sigmoid’:sigmoid激活函數(shù)
- ‘tanh’:tanh激活函數(shù)
- ‘relu’:relu激活函數(shù)
- 'elu'或tf.keras.activations.elu(alpha=1.0):elu激活函數(shù)
- ‘selu’:selu激活函數(shù)
- ‘swish’: swish激活函數(shù)(tf2.2版本以上才有)
- ‘softmax’:softmax函數(shù)
- input_shape:如果是第一層卷積,需要設(shè)置輸入圖片的大小(height, width, channel),如input_shape=(128, 128, 3)。
- name:輸入字符串,給該層設(shè)置一個(gè)名稱。
池化操作tf.keras.layers.MaxPool2D
用到的參數(shù):
- pool_size:池化的大小,設(shè)置為整數(shù)就表示池化的height = width = 指定整數(shù)。
- strides:池化的滑動(dòng)步長(zhǎng),通常等于pool_size。
- name:輸入字符串,給該層設(shè)置一個(gè)名稱。
全連接操作tf.keras.layers.Dense
用到的參數(shù):
- units:輸入整數(shù),全連接層神經(jīng)元個(gè)數(shù)。
- activation:激活函數(shù),分類網(wǎng)絡(luò)的輸出層一般用’softmax’激活函數(shù)。
- name:輸入字符串,給該層設(shè)置一個(gè)名稱。
展平操作tf.keras.layers.Flatten
舉例說(shuō)明:
[[1,2,3],
[4,5,6], ——> [1,2,3,4,5,6,7,8,9]
[7,8,9]]
train.py
import os import time import tensorflow as tf import pandas as pd import matplotlib.pyplot as plt from tensorflow.keras.models import save_modelfrom nets.conv_net import ConvModel from utils.data_generator import train_val_generator from utils.image_plot import plot_imagestrain_gen = train_val_generator(data_dir='../dataset/natural-scenes/seg_train',target_size=(64, 64),batch_size=32,class_mode='categorical',subset='training')val_gen = train_val_generator(data_dir='../dataset/natural-scenes/seg_train',target_size=(64, 64),batch_size=32,class_mode='categorical',subset='validation')# ImageDataGenerator的返回結(jié)果是個(gè)迭代器,調(diào)用一次才會(huì)吐一次結(jié)果,可以使用.next()函數(shù)分批讀取圖片。 # 取15張訓(xùn)練集圖片進(jìn)行查看 train_batch, train_label_batch = train_gen.next() plot_images(train_batch, train_label_batch)# 取15張測(cè)試集圖片進(jìn)行查看 val_batch, val_label_batch = val_gen.next() plot_images(val_batch, val_label_batch)# 類實(shí)例化 model = ConvModel()''' 模型設(shè)置tf.keras.Sequential.compile用到的參數(shù): - loss:損失函數(shù),對(duì)于分類任務(wù),如果標(biāo)簽沒(méi)做onehot編碼,一般使用"sparse_categorical_crossentropy",否則使用"categorical_crossentropy"。 - optimizer:優(yōu)化器,這里選用"sgd",更多優(yōu)化器請(qǐng)查看https://tensorflow.google.cn/api_docs/python/tf/keras/optimizers。 - metrics:評(píng)價(jià)指標(biāo),這里選用"accuracy",更多優(yōu)化器請(qǐng)查看https://tensorflow.google.cn/api_docs/python/tf/keras/metrics。 '''# 設(shè)置損失函數(shù)loss、優(yōu)化器optimizer、評(píng)價(jià)標(biāo)準(zhǔn)metrics model.compile(loss='categorical_crossentropy',optimizer=tf.keras.optimizers.SGD(learning_rate=0.001),metrics=['accuracy'])''' 模型訓(xùn)練tf.keras.Sequential.fit用到的參數(shù): - x:輸入的訓(xùn)練集,可以用ImageDataGenerator讀取的數(shù)據(jù)。 - steps_per_epoch:輸入整數(shù),每一輪跑多少步數(shù),這個(gè)數(shù)可以通過(guò) 圖片總量/batch_size 得到,如2520/32=78.75。 - epochs:輸入整數(shù),數(shù)據(jù)集跑多少輪模型訓(xùn)練,一輪表示整個(gè)數(shù)據(jù)集訓(xùn)練一次。 - validation_data:輸入的驗(yàn)證集,也可以用ImageDataGenerator讀取的數(shù)據(jù)。 - validation_steps:輸入整數(shù),驗(yàn)證集跑多少步來(lái)計(jì)算模型的評(píng)價(jià)指標(biāo),一步會(huì)讀取batch_size張圖片,所以一共驗(yàn)證validation_steps * batch_size張圖片。 - shuffle:每輪訓(xùn)練是否打亂數(shù)據(jù)順序,默認(rèn)True。返回: History對(duì)象,History.history屬性會(huì)記錄每一輪訓(xùn)練集和驗(yàn)證集的損失函數(shù)值和評(píng)價(jià)指標(biāo)。 '''history = model.fit(x=train_gen, steps_per_epoch=351,epochs=100, validation_data=val_gen,validation_steps=88, shuffle=True)# 畫圖查看history數(shù)據(jù)的變化趨勢(shì) pd.DataFrame(history.history).plot(figsize=(8, 5)) plt.grid(True) plt.xlabel('epoch') plt.show()''' 模型保存tf.keras.models.save_model用到的參數(shù): - model:要保存的模型,也就是搭建的keras.Sequential。 - filepath:模型保存路徑。 ''' # 模型保存 # 創(chuàng)建保存路徑 model_name = "model-" + time.strftime('%Y-%m-%d-%H-%M-%S') model_path = os.path.join('models', model_name) if not os.path.exists(model_path):os.makedirs(model_path)save_model(model=model, filepath=model_path)test.py
from tensorflow.keras.models import load_model from utils.data_generator import test_generator, pred_generator from utils.image_plot import plot_imagestest_gen = test_generator(data_dir='../dataset/natural-scenes/seg_test',target_size=(64, 64),batch_size=32,class_mode='categorical')pred_gen = pred_generator(data_dir='../dataset/natural-scenes/seg_pred',target_size=(64, 64),batch_size=32,class_mode=None)''' 模型載入tf.keras.models.load_model 用到的參數(shù): - filepath:載入模型存放的路徑。模型驗(yàn)證tf.keras.Sequential.evaluate 用到的參數(shù): - x:輸入的驗(yàn)證集,可以用ImageDataGenerator讀取的數(shù)據(jù)。模型預(yù)測(cè)tf.keras.Sequential.predict 用到的參數(shù): - x:需要做預(yù)測(cè)的數(shù)據(jù)集,可以用ImageDataGenerator讀取的數(shù)據(jù)。 '''model_path = '../models/model-2020-07-22-16-51-19' loaded_model = load_model(filepath=model_path) loss, accuracy = loaded_model.evaluate(x=test_gen)pred_batch = pred_gen.next() pred_result = loaded_model.predict(x=pred_batch) plot_images(pred_batch, pred_result)總結(jié)
以上是生活随笔為你收集整理的3.4 Kaggle自然场景图片分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中小企业如何选择OA协同办公产品?最全的
- 下一篇: java医疗报销_医疗保险报销流程图(修