日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.4 Kaggle自然场景图片分类

發布時間:2023/12/20 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:子集
from tensorflow.keras.preprocessing.image import ImageDataGeneratordef train_val_generator(data_dir, target_size, batch_size, class_mode = None, subset = 'training'):train_val_datagen = ImageDataGenerator(rescale = 1./255., validation_split = 0.2)return train_val_datagen.flow_from_directory(directory = data_dir,target_size = target_size,batch_size = batch_size,class_mode = class_mode,subset = subset)def test_generator(data_dir, target_size, batch_size, class_mode=None):test_datagen = ImageDataGenerator(rescale = 1./255.)return test_datagen.flow_from_directory(directory = data_dir,target_size = target_size,batch_size = batch_size,class_mode = class_mode)def pred_generator(data_dir, target_size, batch_size, class_mode = None):pred_datagen = ImageDataGenerator(rescale = 1./255.)return pred_datagen.flow_from_directory(directory = data_dir,target_size = target_size,batch_size = batch_size,class_mode = class_mode)

image_plot.py圖片可視化腳本

畫圖函數plot_images

參數介紹:

  • images:包含多張圖片數據的序列。
  • labels:包含圖片對應標簽的序列(序列中的元素需要是0,1,2,…,9這樣的正整數)。
import numpy as np import matplotlib.pyplot as pltclass_names = ['buildings', 'forest', 'glacier', 'mountain', 'sea', 'street']def plot_images(images, labels):fig, axes = plt.subplots(3, 5, figsize=(12,6))axes = axes.flatten()for img, label, ax in zip(images, labels, axes):ax.imshow(img)ax.set_title(class_names[np.argmax(label)])ax.axis('off')plt.tight_layout()//自動調整子圖參數,使之填充整個圖像區域plt.show()

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]]

from tensorflow.keras import Model from tensorflow.keras.layers import Flatten, Conv2D, MaxPool2D, Dense# 定義一個子類來搭建模型 class ConvModel(Model):def __init__(self):# 父類初始化super(ConvModel, self).__init__()# 卷積層conv_1_1self.conv_1_1 = Conv2D(input_shape=(64, 64, 3), filters=32, kernel_size=3, activation='relu', name='conv_1_1')# 卷積層conv_1_2self.conv_1_2 = Conv2D(filters=32, kernel_size=3,activation='relu', name='conv_1_2')# 池化層max_pool_1self.max_pool_1 = MaxPool2D(pool_size=2, name='max_pool_1')# 卷積層conv_2_1self.conv_2_1 = Conv2D(filters=64, kernel_size=3,activation='relu', name='conv_2_1')# 卷積層conv_2_2self.conv_2_2 = Conv2D(filters=64, kernel_size=3,activation='relu', name='conv_2_2')# 池化層max_pool_2self.max_pool_2 = MaxPool2D(pool_size=2, name='max_pool_2')# 展平層flattenself.flatten = Flatten(name='flatten')# 全連接層self.dense = Dense(units=6, activation="softmax", name='logit')def call(self, x):x = self.conv_1_1(x)x = self.conv_1_2(x)x = self.max_pool_1(x)x = self.conv_2_1(x)x = self.conv_2_2(x)x = self.max_pool_2(x)x = self.flatten(x)x = self.dense(x)return x

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自然场景图片分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。