深度学习第五周--运动品牌识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/xLjALoOD8HPZcH563En8bQ) 中的学习记录博客**
>- ** 参考文章:365天深度学习训练营-第5周:运动鞋品牌识别(训练营内部成员可读)**
>- **🍖 原作者:[K同学啊](https://mp.weixin.qq.com/s/xLjALoOD8HPZcH563En8bQ)**

1.实验前准备

   1.设置GPU

from tensorflow import keras
from tensorflow.keras import layers,models
import os,PIL,pathlib
import matplotlib.pyplot as plt
import tensorflow as tf
gpus=tf.config.list_physical_devices("GPU")
if gpus:
    gpu0=gpus[1]
    tf.config.experimental.set_memory_growth(gpu0,True)
    tf.config.set_visible_devices([gpu0],"GPU")
gpus

 2.设置数据路径

data_dir="./46-data/"
data_dir=pathlib.Path(data_dir)

2.实验代码

 统计图像总数

image_count=len(list(data_dir.glob('*/*/*.jpg')))
print("图片总数为:",image_count)

 查看数据

roses=list(data_dir.glob('train/nike/*.jpg'))
PIL.Image.open(str(roses[0]))

f5d90b3de6da40b494cfeba858fc9f3a.png

 设置图片输入尺寸:

batch_size=32
img_height=224
img_width=224

 加载数据到tensorflow的dataset中

train_ds=tf.keras.preprocessing.image_dataset_from_directory(
"./46-data/train/",
    seed=123,
    image_size=(img_height,img_width),
    batch_size=batch_size
)

加载验证集

val_ds=tf.keras.preprocessing.image_dataset_from_directory(
"./46-data/test/",
    seed=123,
    image_size=(img_height,img_width),
    batch_size=batch_size
)

 输出标签类别:

class_names=train_ds.class_names
print(class_names)

 展示部分数据

plt.figure(figsize=(20.,10))
for images,labels in train_ds.take(1):
    for i in range(20):
        ax=plt.subplot(5,10,i+1)
        plt.imshow(images[i].numpy().astype('uint8'))
        plt.title(class_names[labels[i]])
        plt.axis("off")

 2ec1f639f0874720930a48166c9ff3e2.png

 再次确认数据:

for image_batch,labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break

 设置CPU自动处理资源调度

UTOTUNE=tf.data.AUTOTUNE
train_ds=train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds=val_ds.cache().prefetch(buffer_size=AUTOTUNE)

 搭建网络模型:

model=models.Sequential([
    layers.experimental.preprocessing.Rescaling(1./255,input_shape=(img_height,img_width,3)),
    layers.Conv2D(16,(3,3),activation='relu',input_shape=(img_height,img_width,3)),
    layers.AveragePooling2D((2,2)),
    layers.Conv2D(32,(3,3),activation='relu'),
    layers.AveragePooling2D((2,2)),
    layers.Dropout(0.3),
    layers.Flatten(),
    layers.Dense(128,activation='relu'),
    layers.Dense(len(class_names))
])
model.summary()

b818494d57d9445e936c84dbbe9d617c.png

设置超参数

initial_learning_rate=0.1
lr_schedule=tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate,
decay_steps=10,
    decay_rate=0.92,
    staircase=True
)
optimizer=tf.keras.optimizers.Adam(learning_rate=lr_schedule)
model.compile(optimizer=optimizer,
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
epochs=50
checkpointer=ModelCheckpoint('best_model.h5',
                            monitor='val_accuracy',
                             verbose=1,
                             save_best_only=True,
                             save_weights_only=True
                            )
earlystopper=EarlyStopping(monitor='val_accuracy',
                          min_delta=0.001,
                           patience=20,
                           verbose=1
                          )

 开始训练

history=model.fit(train_ds,validation_data=val_ds,epochs=epochs,callbacks=[checkpointer,earlystopper])

 44ab4cf9a62f4577b55c2ebf5349c975.png

可见我的参数并没有调整好,作者将会努力继续调整

绘制相关的训练结果:
 

acc=history.history['accuracy']
val_acc=history.history['val_accuracy']
loss=history.history['loss']
val_loss=history.history['val_accuracy']
epochs=range(len(loss))
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
plt.plot(epochs,acc,label='Training Accuracy')
plt.plot(epochs,val_acc,label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1,2,2)
plt.plot(1,2,3)
plt.plot(epochs,loss,label='Training Loss')
plt.plot(epochs,val_loss,label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

 73c0328953aa4efdb8e9271a980e97c0.png

 加载最好的权重文件,进行预测:

model.load_weights('best_model.h5')
from PIL import Image
import numpy as np
img=Image.open("./46-data/test/nike/4.jpg")
image=tf.image.resize(img,[img_height,img_width])
img_array=tf.expand_dims(image,0)
predictions=model.predict(img_array)
print("预测结果为:",class_names[np.argmax(predictions)])

 eb1c6bc2265649579ca7a09b935997bd.png

3.总结

本文基于CNN进行运动品牌的识别,但效果并不理想,原因在于我为进行参数调整,作者将在工作之余进行调整,如果期待小贵哦,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

留学找浩浩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值