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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习之基于CNN和VGG19实现灵笼人物识别

發(fā)布時(shí)間:2023/12/15 pytorch 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之基于CNN和VGG19实现灵笼人物识别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

VGG19是VGG網(wǎng)絡(luò)中一個(gè)更復(fù)雜的網(wǎng)絡(luò),相比較于VGG16,它的層數(shù)更深。
VGG19網(wǎng)絡(luò)都使用了同樣大小的卷積核尺寸(3x3)和最大池化尺寸(2x2)。但是它的訓(xùn)練時(shí)間過長(zhǎng),調(diào)參難度大,并且需要的存儲(chǔ)容量大,不利于部署。
本次基于CNN和VGG19,對(duì)靈籠人物進(jìn)行識(shí)別。其中VGG19網(wǎng)絡(luò)分別調(diào)用了官方模型和自己搭建的模型。

1.導(dǎo)入庫

import numpy as np import tensorflow as tf import matplotlib.pyplot as plt import os,PIL,pathlib from tensorflow import keras from tensorflow.keras import layers,models,Sequential,Input from tensorflow.keras.layers import Conv2D,MaxPooling2D,Dense,Flatten,Dropout from tensorflow.keras.models import Model

2.數(shù)據(jù)加載

①添加文件路徑

data_dir = "E:/tmp/.keras/datasets/linglong_photos" data_dir = pathlib.Path(data_dir)

②構(gòu)建一個(gè)ImageDataGenerator

#因?yàn)橛?xùn)練集和測(cè)試集是在一個(gè)文件夾中,所以構(gòu)建一個(gè)ImageDataGenerator就可以 train_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45,shear_range=0.2,validation_split=0.2,#以8:2的比例劃分訓(xùn)練集和測(cè)試集horizontal_flip=True )

③劃分訓(xùn)練集和測(cè)試集

train_ds = train_data_gen.flow_from_directory(directory=data_dir,target_size=(height,width),batch_size=batch_size,shuffle=True,class_mode='categorical',subset='training' ) test_ds = train_data_gen.flow_from_directory(directory=data_dir,target_size=(height,width),batch_size=batch_size,class_mode='categorical',subset='validation' )

結(jié)果如下:

Found 225 images belonging to 6 classes. Found 55 images belonging to 6 classes.

3.設(shè)置超參數(shù)

height = 224 width = 224 batch_size = 16 epochs = 10

4.搭建CNN網(wǎng)絡(luò)

網(wǎng)絡(luò)結(jié)構(gòu):3層卷積池化層+Flatten+全連接層

model = tf.keras.Sequential([tf.keras.layers.Conv2D(16,3,padding="same",activation="relu",input_shape=(height,width,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(32,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(128,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(1024,activation="relu"),tf.keras.layers.Dense(512,activation="relu"),tf.keras.layers.Dense(6,activation="softmax") ])

網(wǎng)絡(luò)編譯&&運(yùn)行

model.compile(optimizer="adam",loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=["acc"]) history = model.fit(train_ds,validation_data=test_ds,epochs=epochs )

實(shí)驗(yàn)結(jié)果如下:

不盡如人意,這個(gè)上下波動(dòng)就很無語。將epochs調(diào)大后的結(jié)果如下:


在20次訓(xùn)練之后沒有任何的效果。
修改優(yōu)化器:

opt = tf.keras.optimizers.Adam(learning_rate=1e-5) model.compile(optimizer=opt,loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=["acc"])


在改變優(yōu)化器之后,效果得到了很大的改善,準(zhǔn)確率也得到了提高。

4.VGG19網(wǎng)絡(luò)

網(wǎng)絡(luò)結(jié)構(gòu)如下所示:

①官方模型

conv_base = tf.keras.applications.VGG19(weights='imagenet',include_top=False) #設(shè)置為不可訓(xùn)練 conv_base.trainable =False #模型搭建 model = tf.keras.Sequential() model.add(conv_base) model.add(tf.keras.layers.GlobalAveragePooling2D()) model.add(tf.keras.layers.Dense(1024,activation='relu')) model.add(tf.keras.layers.Dense(6,activation='sigmoid'))opt = tf.keras.optimizers.Adam(learning_rate=1e-5) model.compile(optimizer=opt,loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=["acc"]) history = model.fit(train_ds,validation_data=test_ds,epochs=epochs )

實(shí)驗(yàn)結(jié)果如下所示(epochs=10):

相比于上面的網(wǎng)絡(luò),效果還算可以。沒有出現(xiàn)大規(guī)模的波動(dòng),最后的準(zhǔn)確率也比較高。
②自己搭建VGG19網(wǎng)絡(luò)

參考自K同學(xué)啊

def VGG19(nb_classes,input_shape):input_ten = Input(shape=input_shape)#1blockx = Conv2D(64,(3,3),activation='relu',padding='same',name='block1_conv1')(input_ten)x = Conv2D(64,(3,3),activation='relu',padding='same',name='block1_conv2')(x)x = MaxPooling2D((2,2),strides=(2,2),name='block1_pool')(x)#2blockx = Conv2D(128,(3,3),activation='relu',padding='same',name='block2_conv1')(x)x = Conv2D(128,(3,3),activation='relu',padding='same',name='block2_conv2')(x)x = MaxPooling2D((2,2),strides=(2,2),name='block2_pool')(x)#3blockx = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv4')(x)x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)#4blockx = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv4')(x)x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)#5blockx = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv4')(x)x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)#Fullx = Flatten()(x)x = Dense(4096, activation='relu', name='fc1')(x)x = Dense(4096, activation='relu', name='fc2')(x)output_ten = Dense(nb_classes, activation='softmax', name='predictions')(x)model = Model(input_ten, output_ten)return model model = VGG19(6,(width,height,3))

實(shí)驗(yàn)結(jié)果如下所示:

就特么離譜,都不知道為啥會(huì)有這么大的差別,希望路過的大佬批評(píng)指正。
總結(jié)
經(jīng)過改變優(yōu)化器以及增加epochs之后,自己搭建的CNN準(zhǔn)確率是比較好的,但是出現(xiàn)了較大規(guī)模的波動(dòng)。VGG19網(wǎng)絡(luò)的訓(xùn)練速度確實(shí)比較慢,但是官方模型的準(zhǔn)確率是比較好的,沒有出現(xiàn)CNN模型的波動(dòng)情況。由于硬件原因,博主在實(shí)驗(yàn)時(shí)的epochs設(shè)置的都比較小,可以嘗試一下epochs增大時(shí)的效果如何。自己搭建的VGG19網(wǎng)絡(luò),最后的模型準(zhǔn)確率也比較高,但是波動(dòng)較大,而且很不穩(wěn)定,具體原因不清楚。

總結(jié)

以上是生活随笔為你收集整理的深度学习之基于CNN和VGG19实现灵笼人物识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。