>- **🍨 本文为[🔗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]))
设置图片输入尺寸:
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")
再次确认数据:
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()
设置超参数
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])
可见我的参数并没有调整好,作者将会努力继续调整
绘制相关的训练结果:
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()
加载最好的权重文件,进行预测:
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)])
3.总结
本文基于CNN进行运动品牌的识别,但效果并不理想,原因在于我为进行参数调整,作者将在工作之余进行调整,如果期待小贵哦,敬请期待!