通过 Tensorflow 的基础类,构建卷积神经网络,用于花朵图片的分类

news/2025/2/21 5:51:59/

实验目的

通过 Tensorflow 的基础类,构建卷积神经网络,用于花朵图片的分类。

实验环境

import tensorflow as tfprint(tf.__version__)

output:
2.3.0

实验步骤

(一) 数据获取和预处理

1.1 数据选择 TensorFlow 官方提供的花朵图片数据,经如下代码获取:

dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
img_dir= tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)

1.2 读取图片:这里,我们通过 tf.keras.preprocessing.image_dataset_from_directory 函数批量读入图片。

import pathlib
# 数据保存路径
data_dir = pathlib.Path(data_dir)BATCH_SIZE = 32  # BATCH size 设为32
img_height = 180  # 读取图片后,高度转换为180像素
img_width = 180  # 读取图片后,宽度转换为180像素# 读入images (training data)
train_ds = tf.keras.preprocessing.image_dataset_from_directory(img_dir,shuffle=True, validation_split=0.2, seed=123, subset='training', batch_size=BATCH_SIZE,image_size=(img_height, img_width))# 读入images(test data)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(img_dir, shuffle=True,validation_split=0.2,seed=123,subset='validation',image_size=(img_height, img_width),batch_size=BATCH_SIZE)

1.3 查看训练数据的前9张图片.

plt.figure(figsize=(6, 6))
for imgs, labels in train_ds.take(1):for i in range(9):ax = plt.subplot(3,3,i+1)plt.imshow(imgs[i].numpy().astype("uint8"))plt.title(class_names[labels[i]])plt.axis("off")

在这里插入图片描述

(二) 通过 tf 的基础类,自定义模型

class Mymodel(tf.keras.Model):def __init__(self):super().__init__()# 定义normalization 层self.normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1.0 / 255)# 定义数据增强层self.aug1 = tf.keras.layers.experimental.preprocessing.RandomFlip('horizontal')self.aug2 = tf.keras.layers.experimental.preprocessing.RandomRotation(0.1)self.aug3 = tf.keras.layers.experimental.preprocessing.RandomZoom(0.1)# 定义cov1self.cov1 = tf.keras.layers.Conv2D(16, (3,3), padding='same', activation='relu', name='cov1')self.pool1 = tf.keras.layers.MaxPool2D(name='pool1')# 定义cov2self.cov2 = tf.keras.layers.Conv2D(32, (3,3), padding='same', activation='relu', name='cov2')self.pool2 = tf.keras.layers.MaxPool2D(name='pool2')# 定义cov3self.cov3 = tf.keras.layers.Conv2D(64, (3,3), padding='same', activation='relu', name='cov3')self.pool3 = tf.keras.layers.MaxPool2D(name='pool3')# 定义 Dropoutself.dropout = tf.keras.layers.Dropout(0.2)# 定义 flattenself.flatten = tf.keras.layers.Flatten()# 定义 Denseself.dense1 = tf.keras.layers.Dense(128, activation='relu', name='dense1')self.dense2 = tf.keras.layers.Dense(5)def call(self, img):# 执行normalizationX = self.normalization_layer(img)# 执行augX = self.aug1(X)X = self.aug2(X)X = self.aug3(X)X = self.cov1(X)X = self.pool1(X)X = self.cov2(X)X = self.pool2(X)X = self.cov3(X)X = self.pool3(X)X = self.flatten(X)X =  self.dense1(X)X = self.dense2(X)return X

(三) 定义损失函数

def loss(y_true, y_predict):return tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)(y_true, y_predict)

(四) 定义优化函数

optimizer = tf.keras.optimizers.Adam()

(五) 定义训练函数

def train_step(batch_inp, batch_targ, model):with tf.GradientTape() as tape:dense_ = model(batch_inp)batch_loss = loss(batch_targ, dense_)gradients = tape.gradient(batch_loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))return batch_loss

(六) 训练模型

# 实例化模型
model = Mymodel()epochs = 50  # 训练50个epoch
els = [] # 存储每个epoch的损失函数,用于后续绘图
for epoch in range(epochs):epoch_loss = 0# 由于我的计算机显存太小,这里每个epoch只取前20个batch进行训练for batch, (inp, targ) in enumerate(train_ds.take(20)):batch_loss = train_step(inp, targ, model)epoch_loss += batch_loss.numpy()print('epoch {}: {:.4f}'.format(epoch, epoch_loss/10))els.append(epoch_loss/10)

训练过程如下:

epoch 0: 0.5867
epoch 1: 0.6709
epoch 2: 0.6393
epoch 3: 0.6831
epoch 4: 0.6870
epoch 5: 0.6461
epoch 6: 0.4888

Loss 随训练过程的变化情况:

在这里插入图片描述

(七) 通过模型进行预测

预测的代码来之 TensorFlow 官方社区。

sunflower_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/592px-Red_sunflower.jpg"
sunflower_path = tf.keras.utils.get_file('Red_sunflower', origin=sunflower_url)img = keras.preprocessing.image.load_img(sunflower_path, target_size=(img_height, img_width)
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create a batchpredictions = model.predict(img_array)
score = tf.nn.softmax(predictions[0])print("This image most likely belongs to {} with a {:.2f} percent confidence.".format(class_names[np.argmax(score)], 100 * np.max(score))
)

图片为:

在这里插入图片描述

预测结果:

This image most likely belongs to sunflowers with a 97.69 percent confidence.


http://www.ppmy.cn/news/438756.html

相关文章

CNN实现花卉图片分类识别

CNN实现花卉图片分 前言 本文为一个利用卷积神经网络实现花卉分类的项目,因此不会过多介绍卷积神经网络的基本知识。此项目建立在了解卷积神经网络进行图像分类的原理上进行的。 项目简介 本项目为一个图像识别项目,基于tensorflow,利用C…

抓取花卉图片

对比用request抓取而言,使用selenium库会更简便抓取 话不多说现在开始: 首先我们要配置一下chromedriver: 1、chromedirver 下载网站https://registry.npmmirror.com/binary.html?pathchromedriver/下载与自己对应的谷歌版本 查看谷歌版本 如我自己…

调试厉器addr2line

addr2line: 将地址转换为文件名和行号的命令行工具 在C/C程序的调试过程中,我们通常会使用调试器(如GDB)来定位崩溃或错误的位置。但有时候,我们可能只能获得程序崩溃时的地址,而没有调试器的支持。这时候&#xff0c…

如保查看wifi无线的mac地址

使用命令行,运行ipconfig /all 前提是保证无线网卡未被禁用。 找到无线局域网的物理地址。 以太网的特理地址,是网卡的mac地址。

查看wifi连接路由器的MAC地址

windows连接wifi ,通过cmd运行如下命令,查看 netsh wlan show networks modebssid

更改WLAN的IP地址

网络【右键】–>打开“网络和internet”设置【左键】–>高级网络设置–>更改适配器选项【左键】–>WLAN【右键】–>属性【左键】–>internet协议版本4(TCP/IPV4)【左键双击】–>更改IP地址和DNS服务器–>【确定】

蓝牙MAC地址认证以及WiFi MAC地址认证

有没有想过,手机,或者蓝牙耳机,蓝牙音响,产品需要链接蓝牙的时候,是通过怎么样的一个方法来识别那个产品对应的是那个蓝牙呢, 有没有想过,当你手机打开WIFI ,想要去链接WIFI的时候,有…

无线网络 设置网关和服务器,wifi网关地址怎么设置

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。 wifi网关主要分自动设置与手动设置两种。无线网关自动设置就是利用DHCP服务器来自动给网络中的电脑分配IP地址、子网掩码和默认网关。这样做的好处是一旦网络的默认网关发生了变化时…