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