文章目录
1.数据集的准备:
链接:https://pan.baidu.com/s/1rNmb_nxsBnoZqXT6pjsO-Q
提取码:0wmi
2.requirements.txt文件:
直接:pip install requirements.txt
链接:https://pan.baidu.com/s/1VcUOZtDyXlN5F-_kDudDJw
提取码:xpk3
3.文件结构:
4.预测效果:
5.首先普通的训练:
(1)导入相关的库函数:
import os
import cv2
import time
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau
from tensorflow.keras.layers import Dense,Dropout,Flatten,BatchNormalization,Conv2D,MaxPool2D
(2)相关的变量的初始化:
#设置类别数,我们这里只训练了狗这个类别
num_classes=1
batch_size=4
img_h,img_w=224,224
#文件路径
train_data_dir='images/train'
valid_data_dir='images/valid'
(3)数据增强和导入文件:
#数据增强,对图像进行归一化
train_datagen=ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
#导入要训练的和验证文件中的数据
train_generate=train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_h,img_w),
batch_size=batch_size,
class_mode='categorical',
shuffle=True
)
validation_generate=validation_datagen.flow_from_directory(
valid_data_dir,
target_size=(img_h,img_w),
batch_size=batch_size,
class_mode='categorical',
shuffle=True
)
(4)模型定义:
#模型定义
model=tf.keras.Sequential([
#输入图像大小的设置
layers.InputLayer(input_shape=(img_h,img_w,3)),
layers.Conv2D(32,kernel_size=[3,3],strides=[1,1],padding='same'),
layers.Activation('relu'),
layers.BatchNormalization(),
layers.Conv2D(32,kernel_size=[3,3],strides=[1,1],padding='same'),
layers.Activation('relu'),
layers.BatchNormalization(),
layers.MaxPool2D(pool_size=[2,2]),
layers.Conv2D(64,kernel_size=[3,3],strides=[1,1],padding='same'),
layers.Activation('relu'),
layers.BatchNormalization(),
layers.Conv2D(64,kernel_size=[3,3],strides=[1,1],padding='same'),
layers.Activation('relu'),
layers.BatchNormalization(),
layers.MaxPool2D(pool_size=[2,2]),
layers.Conv2D(128,kernel_size=[3,3],strides=[1,1],padding='same'),
layers.Activation('relu'),
layers.BatchNormalization(),
# layers.Flatten(),
layers.GlobalAveragePooling2D(),
layers.Dense(64),
layers.Activation('relu'),
layers.BatchNormalization(),
layers.Dropout(0.5),
layers.Dense(64),
layers.Activation('relu'),
layers.BatchNormalization(),
layers.Dropout(0.5),
layers.Dense(num_classes),
layers.Activation('softmax'),
])
(5)相关回调函数定义:
#打印模型细节查看
model.summary()
#保存最优的模型
checkpoing=ModelCheckpoint(
'model/recognitionDog.h5',
monitor='val_loss',
mode='min',
save_best_only=True,
save_weights_only=False,
verbose=1
)
#当经过5代之后,验证集的损失值没有下降就提前终止训练
earlystop=EarlyStopping(
monitor='val_loss',
min_delta=0,
patience=5,
verbose=1,
restore_best_weights=True
)
#当经过3代的训练之后验证集的损失值没有下降就学习衰减率
reduce_lr=ReduceLROnPlateau(
monitor='val_loss',
factor=0.8,
patience=3,
verbose=1,
min_delta=0.0001
)
callbacks=[earlystop,checkpoing,reduce_lr]
(6)开始训练:
model.compile(
loss='categorical_crossentropy',optimizer=Adam(lr=0.01),metrics=['accuracy']
)
epochs=20
history=model.fit(
train_generate,
steps_per_epoch=train_generate.n//batch_size,
epochs=epochs,
callbacks=callbacks,
validation_data=validation_generate,
validation_steps=validation_generate.n//batch_size
)
(7)画图:
x=range(1,len(history.history['accuracy'])+1)
plt.plot(x,history.history['accuracy'])
plt.plot(x,history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.xticks(x)
plt.legend(['Train','Val'],loc='upper left')
plt.savefig(fname='inception_v3.png',figsize=[10,10])
plt.show()
6.迁移学习训练:
(1)导入相关的库函数:
import os
import cv2
import time
import tensorflow
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras import layers
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau
from tensorflow.keras.layers import Dense,Dropout,Flatten,BatchNormalization,Conv2D,MaxPool2D
(2)相关的变量的初始化:
#设置类别数,我们这里只训练了狗这个类别
num_classes=1
batch_size=4
img_h,img_w=224,224
train_data_dir='images/train'
valid_data_dir='images/valid'
(3)数据增强和导入文件:
#数据增强,对图像进行归一化
train_datagen=ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
#导入要训练的和验证文件中的数据
train_generate=train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_h,img_w),
batch_size=batch_size,
class_mode='categorical',
shuffle=True
)
validation_generate=validation_datagen.flow_from_directory(
valid_data_dir,
target_size=(img_h,img_w),
batch_size=batch_size,
class_mode='categorical',
shuffle=True
)
(4)迁移学习模型定义:
#模型定义
model_inception_v3=tensorflow.keras.applications.inception_v3.InceptionV3(weights='imagenet',include_top=False)
x=model_inception_v3.output
x=layers.GlobalAveragePooling2D()(x)
x=layers.Dense(1024,activation='relu')(x)
predications=layers.Dense(num_classes,activation='softmax')(x)
model_inception_V3=Model(inputs=model_inception_v3.input,outputs=predications)
#冻结住所有的层,因为我们这里的数据集很少,所以需要冻结这里的所有层
for layer in model_inception_V3.layers:
layer.trainable=False
#打印模型细节查看
model_inception_V3.summary()
(5)相关回调函数定义:
#保存最优的模型
checkpoing=ModelCheckpoint(
'model/recognitionDog_InceptionV3.h5',
monitor='val_loss',
mode='min',
save_best_only=True,
save_weights_only=False,
verbose=1
)
#当经过5代之后,验证集的损失值没有下降就提前终止训练
earlystop=EarlyStopping(
monitor='val_loss',
min_delta=0,
patience=5,
verbose=1,
restore_best_weights=True
)
#当经过3代的训练之后验证集的损失值没有下降就学习衰减率
reduce_lr=ReduceLROnPlateau(
monitor='val_loss',
factor=0.8,
patience=3,
verbose=1,
min_delta=0.0001
)
callbacks=[earlystop,checkpoing,reduce_lr]
(6)开始训练:
epochs=20
history=model_inception_V3.fit(
train_generate,
steps_per_epoch=train_generate.n//batch_size,
epochs=epochs,
callbacks=callbacks,
validation_data=validation_generate,
validation_steps=validation_generate.n//batch_size
)
(7)画图:
x=range(1,len(history.history['accuracy'])+1)
plt.plot(x,history.history['accuracy'])
plt.plot(x,history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.xticks(x)
plt.legend(['Train','Val'],loc='upper left')
plt.savefig(fname='inception_v3.png',figsize=[10,10])
plt.show()
7.前端文件:
可以参考我这篇文章:
https://mydreamambitious.blog.csdn.net/article/details/123405384
注意:因为我这里训练的是一个类别,所以前端文件中的一些地方需要修改:
修改地方如下:
修改如下: