>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/AtyZUu_j2k_ScNH6e732ow) 中的学习记录博客**
>- **🍦 参考文章:365天深度学习训练营-第6周:好莱坞明星识别(训练营内部成员可读)**
>- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**
>- **🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)**
本次实践学习知识:
Categorical Crossentropy(交叉熵)
Categorical Crossentropy(交叉熵)是一种常用的多分类损失函数,用于评估模型预测结果与实际结果之间的差异。在多分类问题中,每个样本都属于一个类别,因此需要将模型输出的概率分布与实际类别进行比较。交叉熵损失函数可以衡量模型输出的概率分布与实际类别之间的差异,越小表示模型预测结果越接近实际结果。
交叉熵损失函数的计算公式如下:
其中,p表示实际的概率分布,q表示模型的输出概率分布,$n$表示类别数。交叉熵损失函数的本质是用真实分布p的负对数似然来衡量模型输出$q$的负对数似然,即用模型预测结果的概率分布来估计真实结果的概率分布。
在多分类问题中,交叉熵损失函数可以帮助模型更好地区分不同的类别,使得模型输出的概率分布更接近真实分布。此外,交叉熵损失函数还具有梯度下降优化的可导性和凸性,可以方便地使用反向传播算法进行模型训练。
总之,交叉熵损失函数是一种常用的多分类损失函数,可以帮助模型更好地区分不同的类别,优化模型的输出概率分布,提高模型的分类性能。
对不同损失函数的使用场景和代码实现的探索
不同的损失函数适用于不同的机器学习任务和模型结构。下面将介绍几种常用的损失函数及其使用场景和代码实现。
1. 均方误差(Mean Squared Error,MSE)
均方误差是一种常用的回归损失函数,用于衡量模型预测值与真实值之间的差异。MSE适用于输出为连续变量的模型,如线性回归、多层感知机等。
MSE的数学公式为:
其中,y为真实值,为模型预测值,n为样本数。
MSE的代码实现如下:
import tensorflow as tf
mse = tf.keras.losses.MeanSquaredError()
loss = mse(y_true, y_pred)
2. 交叉熵(Cross Entropy)
交叉熵是一种常用的分类损失函数,用于衡量模型预测值与真实值之间的差异。交叉熵适用于输出为分类变量的模型,如逻辑回归、softmax分类器等。
交叉熵的数学公式为:
其中,y为真实概率分布,为模型预测概率分布,n为类别数。
交叉熵的代码实现如下:
import tensorflow as tf
cross_entropy = tf.keras.losses.CategoricalCrossentropy()
loss = cross_entropy(y_true, y_pred)
3. 二元交叉熵(Binary Cross Entropy)
二元交叉熵是一种常用的二分类损失函数,用于衡量模型预测值与真实值之间的差异。二元交叉熵适用于输出为二分类变量的模型,如逻辑回归、sigmoid分类器等。
二元交叉熵的数学公式为:
其中,y为真实值(0或1),为模型预测值。
二元交叉熵的代码实现如下:
import tensorflow as tf
binary_crossentropy = tf.keras.losses.BinaryCrossentropy()
loss = binary_crossentropy(y_true, y_pred)
4. Hinge Loss
Hinge Loss是一种常用的分类损失函数,用于支持向量机(SVM)等模型。Hinge Loss适用于输出为分类变量的模型,如SVM等。
Hinge Loss的数学公式为:
其中,y为真实值(1或-1),为模型预测值。
Hinge Loss的代码实现如下:
import tensorflow as tf
hinge_loss = tf.keras.losses.Hinge()
loss = hinge_loss(y_true, y_pred)
总之,不同的损失函数适用于不同的机器学习任务和模型结构,选择合适的损失函数可以提高模型的性能。在使用时,可以根据具体的任务和模型结构选择合适的损失函数,并使用相应的代码实现。
模型搭建
手动搭建
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.models import Sequential
model = Sequential([
Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)),
Conv2D(64, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(128, (3, 3), activation='relu', padding='same'),
Conv2D(128, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(256, (3, 3), activation='relu', padding='same'),
Conv2D(256, (3, 3), activation='relu', padding='same'),
Conv2D(256, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), activation='relu', padding='same'),
Conv2D(512, (3, 3), activation='relu', padding='same'),
Conv2D(512, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), activation='relu', padding='same'),
Conv2D(512, (3, 3), activation='relu', padding='same'),
Conv2D(512, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Flatten(),
Dense(4096, activation='relu'),
Dense(4096, activation='relu'),
Dense(1000, activation='softmax')
])
官方调用
from tensorflow.keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet', include_top=True)
编译和训练模型:
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test, y_test))
结果
发现模型过拟合严重
解决方案
增加drop和BN,
增加L2正则化
减少神经元个数