T6打卡-好莱坞明星识别

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值