- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
1.导入及查看数据
from tensorflow import keras
from tensorflow.keras import layers,models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
data_dir="data/48-data"
data_dir=pathlib.Path(data_dir)
image_count=len(list(data_dir.glob('*/*.jpg')))
image_count
roses=list(data_dir.glob('Jennifer Lawrence/*.jpg'))
PIL.Image.open(str(roses[0]))
2.加载数据
batch_size=32
img_hight=224
img_width=224
train_ds=tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.1,
subset="training",
label_mode="categorical",
seed=123,
image_size=(img_width,img_width),
batch_size=batch_size)
val_ds=tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.1,
subset="validation",
label_mode="categorical",
seed=123,
image_size=(img_width,img_width),
batch_size=batch_size)
class_names=train_ds.class_names
print(class_names)
3.数据可视化
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[np.argmax(labels[i])])
plt.axis("off")
4.检查与配置数据集
for image_batch,labels_batch in train_ds:
print(image_batch.shape)
print(labels_batch.shape)
break
AUTOTUNE=tf.data.AUTOTUNE
train_ds=train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds=val_ds.cache().prefetch(buffer_size=AUTOTUNE)
5.构建模型
model = models.Sequential([
layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_hight, img_width, 3)),
layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_hight, img_width, 3)),
layers.AveragePooling2D((2, 2)),
layers.Conv2D(32, (3, 3), activation='relu'),
layers.AveragePooling2D((2, 2)),
layers.Dropout(0.3),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.Dropout(0.3),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(len(class_names))
])
model.summary()
6.编译及训练模型
initial_learning_rate=1e-4
lr_schedule=tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate,
decay_steps=60,
decay_rate=0.96,
staircase=True
)
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
model.compile(optimizer=optimizer,
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
epochs=100
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])
7.结果可视化
acc=history.history['accuracy']
val_acc=history.history['val_accuracy']
loss=history.history['loss']
val_loss=history.history['val_loss']
epoch_range=range(len(loss))
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
plt.plot(epoch_range,acc,label='Training Accuracy')
plt.plot(epoch_range,val_acc,label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title("Training and Validation Accuracy")
plt.subplot(1,2,2)
plt.plot(epoch_range,loss,label='Training loss')
plt.plot(epoch_range,val_loss,label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
8.预测数据
model.load_weights('best_model.h5')
from PIL import Image
import numpy as np
img=Image.open("data/48-data/Jennifer Lawrence/003_963a3627.jpg")
image=tf.image.resize(img,[img_hight,img_width])
img_array=tf.expand_dims(image,0)
predictions=model.predict(img_array)
print("预测结果:",class_names[np.argmax(predictions)])
总结:
损失函数Loss
1. binary_crossentropy(对数损失函数)
与 sigmoid
相对应的损失函数,针对于二分类问题。
2. categorical_crossentropy(多分类的对数损失函数)
与 softmax
相对应的损失函数,如果是one-hot编码,则使用 categorical_crossentropy
调用方式:
#调用方式一
model.compile(optimizer="adam",
loss='categorical_crossentropy',
metrics=['accuracy'])
#调用方式二
model.compile(optimizer="adam",
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=['accuracy'])
3. sparse_categorical_crossentropy(稀疏性多分类的对数损失函数)
与 softmax
相对应的损失函数,如果是整数编码,则使用 sparse_categorical_crossentropy
#调用方式一
model.compile(optimizer="adam",
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#调用方式二
model.compile(optimizer="adam",
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
函数原型
tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=False,
reduction=losses_utils.ReductionV2.AUTO,
name='sparse_categorical_crossentropy'
)
参数:
from_logits
: 为True时,会将y_pred转化为概率(用softmax),否则不进行转换,通常情况下用True结果更稳定;
reduction
:类型为tf.keras.losses.Reduction,对loss进行处理,默认是AUTO;
name
: name