深度学习实战(1):花的分类任务|附数据集与源码

写在前面:

实验目的:通过建立Alexnet神经网络建立模型并根据训练数据来训练模型 以达到可以将一张花的类别进行分类

Python版本:Python3

IDE:VSCode

系统:MacOS

数据集以及代码的资源放在文章末尾了 有需要请自取~

 

7c816bfef6df46ffaff198b783bdf8df.jpeg

 

目录

写在前面:

前言

数据集 

训练模型代码 (附有注释)

训练集数据量展示

训练迭代过程展示

训练结果 Accuracy展示 

训练结果 Loss展示 

测试集 

预测结果代码 

预测结果展示

结语 


 

 

前言

本文仅作为学习训练 不涉及任何商业用途 如有错误或不足之处还请指出

数据集 

数据集一共有五种花的类别 但本次实验模型仅用了rose和sunflower两种类别进行分类测试

五种花的类别:

ef7bd1871b4e4fef987e59dbac0b9d75.png

 Rose:

 

b36a72916e6c438790b79f90724a6e1e.png

Sunflower: 

97c2dd12a3a249c6ba758daa7f01fb93.png

训练模型代码 (附有注释)

import os , glob
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt

# 变量
resize = 224 # 图片尺寸参数
epochs = 8 # 迭代次数
batch_size = 5 # 每次训练多少张

#——————————————————————————————————————————————————————————————————————————————————

# 训练集路径
train_data_path = '/Users/liqun/Desktop/KS/MyPython/DataSet/flowers/Training'
# 玫瑰花文件夹路径
rose_path = os.path.join(train_data_path,'rose')
# 太阳花文件夹路径
sunflower_path = os.path.join(train_data_path,'sunflower')

# 将文件夹内的图片读取出来
fpath_rose = [os.path.abspath(fp) for fp in glob.glob(os.path.join(rose_path,'*.jpg'))]
fpath_sunflower = [os.path.abspath(fp) for fp in glob.glob(os.path.join(sunflower_path,'*.jpg'))]

#文件数量
num_rose = len(fpath_rose)
num_sunflower = len(fpath_sunflower)

# 设置标签
label_rose = [0] * num_rose
label_sunflower = [1] * num_sunflower

# 展示
print('rose:   ', num_rose)
print('sunflower: ', num_sunflower)

# 划分为多少验证集
RATIO_TEST = 0.1

num_rose_test = int(num_rose * RATIO_TEST)
num_sunflower_test = int(num_sunflower * RATIO_TEST)

# train
fpath_train = fpath_rose[num_rose_test:] + fpath_sunflower[num_sunflower_test:]
label_train = label_rose[num_rose_test:] + label_sunflower[num_sunflower_test:]

# validation
fpath_vali = fpath_rose[:num_rose_test] + fpath_sunflower[:num_sunflower_test]
label_vali = label_rose[:num_rose_test] + label_sunflower[:num_sunflower_test]

num_train = len(fpath_train)
num_vali = len(fpath_vali)

# 展示
print('num_train:   ', num_train)
print('num_label: ', num_vali)

# 预处理函数
def preproc(fpath, label):
    image_byte = tf.io.read_file(fpath) # 读取文件
    image = tf.io.decode_image(image_byte) # 检测图像是否为BMP,GIF,JPEG或PNG,并执行相应的操作将输入字节string转换为类型uint8的Tensor
    image_resize = tf.image.resize_with_pad(image, 224, 224) #缩放到224*224
    image_norm = tf.cast(image_resize, tf.float32) / 255. #归一化
    
    label_onehot = tf.one_hot(label, 2)
    
    return image_norm, label_onehot

dataset_train = tf.data.Dataset.from_tensor_slices((fpath_train, label_train)) #将数据进行预处理
dataset_train = dataset_train.shuffle(num_train).repeat()  #打乱顺序
dataset_train = dataset_train.map(preproc, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset_train = dataset_train.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE) #一批次处理多少份

dataset_vali = tf.data.Dataset.from_tensor_slices((fpath_vali, label_vali))
dataset_vali = dataset_vali.shuffle(num_vali).repeat()
dataset_vali = dataset_vali.map(preproc, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset_vali = dataset_vali.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE)

#——————————————————————————————————————————————————————————————————————————————————

# 建立模型 卷积神经网络
model = tf.keras.Sequential(name='Alexnet')
# 第一层
model.add(layers.Conv2D(filters=96, kernel_size=(11,11),
                    strides=(4,4), padding='valid',
                    input_shape=(resize,resize,3),
                    activation='relu'))
model.add(layers.BatchNormalization())
# 第一层池化层:最大池化层
model.add(layers.MaxPooling2D(pool_size=(3,3), 
                    strides=(2,2), 
                    padding='valid'))

#第二层
model.add(layers.Conv2D(filters=256, kernel_size=(5,5), 
                    strides=(1,1), padding='same', 
                    activation='relu'))
model.add(layers.BatchNormalization())
#第二层池化层
model.add(layers.MaxPooling2D(pool_size=(3,3), 
                    strides=(2,2), 
                    padding='valid'))

#第三层
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), 
                    strides=(1,1), padding='same', 
                    activation='relu'))
#第四层
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), 
                    strides=(1,1), padding='same', 
                    activation='relu'))
#第五层
model.add(layers.Conv2D(filters=256, kernel_size=(3,3), 
                    strides=(1,1), padding='same', 
                    activation='relu'))
#池化层
model.add(layers.MaxPooling2D(pool_size=(3,3), 
                    strides=(2,2), padding='valid'))

#第6,7,8层
model.add(layers.Flatten())
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))

model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))

model.add(layers.Dense(1000, activation='relu'))
model.add(layers.Dropout(0.5))

# Output Layer
model.add(layers.Dense(2, activation='softmax'))

# Training 优化器 随机梯度下降算法
model.compile(loss='categorical_crossentropy',
                optimizer='sgd',           #梯度下降法
                metrics=['accuracy'])


history = model.fit(dataset_train,
            steps_per_epoch = num_train//batch_size,
            epochs = epochs,         #迭代次数
            validation_data = dataset_vali,
            validation_steps = num_vali//batch_size,
            verbose = 1)

# 评分标准
scores_train = model.evaluate(dataset_train, steps=num_train//batch_size, verbose=1)
print(scores_train)

scores_vali = model.evaluate(dataset_vali, steps=num_vali//batch_size, verbose=1)
print(scores_vali)

#保存模型
model.save('/Users/liqun/Desktop/KS/MyPython/project/flowerModel.h5')

'''
history对象的history内容(history.history)是字典类型,
键的内容受metrics的设置影响,值的长度与epochs值一致。
'''
history_dict = history.history
train_loss = history_dict['loss']
train_accuracy = history_dict['accuracy']
val_loss = history_dict['val_loss']
val_accuracy = history_dict['val_accuracy']

# Draw loss
plt.figure()
plt.plot(range(epochs), train_loss, label='train_loss')
plt.plot(range(epochs), val_loss, label='val_loss')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('loss')

# Draw accuracy
plt.figure()
plt.plot(range(epochs), train_accuracy, label='train_accuracy')
plt.plot(range(epochs), val_accuracy, label='val_accuracy')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('accuracy')

# Display
plt.show()

print('Train has finished')

训练集数据量展示

37b8fbcfa1b4469da5bc0e765aae37c3.png

训练迭代过程展示

d0b8fa7455ae4dfca9e0ba490c082bbe.png

训练结果 Accuracy展示 

a15235ed4e89401590efac46dd386ab5.png

训练结果 Loss展示 

be572936b42245c185eb03abe669868f.png

测试集 

e67a567ecf0947d6a48173e928512315.pngab17e899d7b247e29831e1ec0727b8d5.png

预测结果代码 

import cv2

from tensorflow.keras.models import load_model

resize = 224
label = ('rose', 'sunflower')

image = cv2.resize(cv2.imread('/Users/liqun/Desktop/KS/MyPython/DataSet/flowers/Training/sunflower/23286304156_3635f7de05.jpg'),(resize,resize))
image = image.astype("float") / 255.0 # 归一化

image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
# 加载模型
model = load_model('/Users/liqun/Desktop/KS/MyPython/project/flowerModel.h5')
predict = model.predict(image)
i = predict.argmax(axis=1)[0]
# 展示结果
print('——————————————————————')
print('Predict result')
print(label[i],':',max(predict[0])*100,'%')


预测结果展示

7608b44135a5481f9937a01f3ae073aa.png

结语 

模型到这里就训练并检测完毕了 如有需要的小伙伴可以下载下方的数据集测试集及源代码

链接: https://pan.baidu.com/s/1OJfwcF1PvX9qkZwT7MXd_Q?pwd=i0bt 提取码: i0bt

如果我的文章对你有帮助 麻烦点个赞再走呀 

 

 

  • 18
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类数据集五分类
《MATLAB计算机视觉与深度学习实战》这本书中提供了30个案例的配套代码,每个案例都包括完整的码、说明文档和数据。 这本书的作者通过这30个案例向读者展示了如何使用MATLAB来进行计算机视觉和深度学习的实践。每个案例都涵盖了不同的主题,包括图像处理、目标检测、人脸识别等。阅读这本书并实践其中的案例代码有助于读者更好地理解计算机视觉和深度学习的原理和应用。 每个案例的配套代码都是完整的,读者可以将其直接运行在MATLAB环境中。配套代码中使用了MATLAB的图像处理和深度学习工具包,读者可以通过这些案例了解如何使用这些工具包进行视觉和深度学习任务的开发。 除了完整的码,每个案例还有详细的说明文档。这些文档包括了该案例的背景介绍、算法原理、实现步骤和结果分析等内容,读者可以通过阅读这些文档更好地理解每个案例的思路和实现过程。 此外,每个案例还提供了所需的数据集,读者可以使用这些数据集进行实验和测试。这些数据集是经过处理和标注的,可以直接用于模型的训练和测试。 总之,《MATLAB计算机视觉与深度学习实战》这本书提供了30个案例的配套代码,包括完整的码、说明文档和数据集。读者可以通过阅读这本书和实践其中的案例代码来学习和掌握计算机视觉和深度学习的技术和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UESTC_KS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值