侧边栏壁纸
博主头像
云之彼端博主等级

行动起来,活在当下

  • 累计撰写 27 篇文章
  • 累计创建 6 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

softmax多分类

Administrator
2021-05-15 / 0 评论 / 2 点赞 / 108 阅读 / 5618 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-12-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
softmax多分类实现

softmax多分类回归

softmax各个样本分量之和为1。
当只有两个类别时,与对数几率回归完全相同。

softmax的交叉熵损失函数

在tf.keras中使用categorical_crossentropy和sparse_categorical_crossentropy来计算softmax交叉熵

Fashion MNIST数据集

Fashion MNIST的作用是成为经典MNST数据集的简易替
换。
MNST数据集包含手写数字(0、1、2等)的图像,这些图
像的格式与Fashion MNIST使用的服饰图像的格式相同。
Fashion MNIST比常规MNST手写数据集更具挑战性。
这两个数据集都相对较小,用于验证某个算法能否如期正常
运行。它们都是测试和调试代码的良好起点。
Fashion MNIST数据集包含70000张灰度图像,涵盖10
个类别。
我们将使用60000张图像训练网络。并使用10000张图像
评估经过学习的网络分类图像的准确率。
可以从 TensorFlow直接访问 Fashion MNIST,只需导入和
加载数据即可。

链接:数据集链接
提取码:6666

将Fashion MINST 放在C:/用户/你的用户名/.keras/datasets 目录下

学习速率

学习速率是一种超参数或对模型的一种手工可配置的设置
需要为它指定正确的值。如果学习速率太小,则找到损失函
数极小值点时可能需要许多轮迭代;如果太大,则算法可能
会“跳过”极小值点并且因周期性的“跳跃”而永远无法找
到极小值点。

反向传播算法

反向传播算法是一种高效计算数据流图中梯度的技术
每一层的导数都是后一层的导数与前一层输出之积,这正是
链式法则的奇妙之处,误差反向传播算法利用的正是这一特
点。
前馈时,从输入开始,逐一计算每个隐含层的输出,直到输
出层。
然后开始计算导数,并从输出层经过各隐含层逐一反向传播。
为了减少计算量,还需对所有已完成计算的元素进行复用
这便是反向传播算法名称的由来。

常见的优化函数

优化器( optimizer)是编译模型的所需的两个参数之一。
你可以先实例化一个优化器对象,然后将它传入
model. compile0,或者你可以通过名称来调用优化器。在
后一种情况下,将使用优化器的默认参数。

SGD:随机梯度下降优化器

随机梯度下降优化器SGD和min-batch是同一个意思,抽取
m个小批量(独立同分布)样本,通过计算他们平梯度均值。

RMSprop

经验上, RMSProp被证明有效目实用的深度学习网络优化算法
RMSProp增加了一个衰减系数来控制历史信息的获取多
RMSProp会对学习率进行衰减。

Adam优化器

  1. Adam算法可以看做是修正后的 Momentum+ RMSProp算
    法.
  2. Adam通常被认为对超参数的选择相当鲁棒
  3. 学习率建议为0.001

Adam是一种可以替代传统随机梯度下降过程的一阶优化算
法,它能基于训练数据迭代地更新神经网络权重。
Adam通过计算梯度的一阶矩估计和二阶矩估计而为不同的
参数设计独立的自适应性学习率。

如何提高网络的拟合能力

一种显然的想法是增大网络容量:

  1. 增加隐藏层深度
  2. 增加隐藏神经元个数

这两种方法哪种更好呢?

单纯的增加神经元个数对于网络性能的提高并不明显,
而增加层会大大提高网络的拟合能力
这也是为什么现在深度学习的层越来越深的原因。

注意

单层的神经元个数,不能太小,太小的话,会造成信息
瓶颈,使得模型欠拟合。

dropout防止过拟合

dropout防止过拟合
为什么说 Dropout可以解决过拟合?

  1. 取平均的作用:我们用相同的训练数据去训陈5个不同的神经网络,一般
    会得到5个不同的结果,此时我们可以采用“5个结果取
    均值”或者“多数取胜的投票策略″去决定最终结果。
  2. 减少神经元之间复杂的共适应关系:因为 dropout
    程序导致两个神经元不一定每次都在一个 dropout网络中
    出现。这样权值的更新不再依赖于有固定关系的隐含节
    点的共同作用,阻止了某些特征仅仅在其它特定特征下
    才有效果的情况。

构建网络的总原则

  1. 增大网络容量直到过拟合
  2. 采取措施抑制过拟合 (dropout、正则化、图像增强、加大数据集、交叉验证)
  3. 继续增大网络容量直到过拟合

实现

import tensorflow as tf
import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np
# 在jupyter notebook中使用,使结果直接输出在控制台中 
# %matplotlib inline
(train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data()
# 数据归一化
train_image = train_image/255
test_image = test_image/255
model = tf.keras.Sequential()
# 数据扁平化
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(32, activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['acc']
)
history = model.fit(train_image,train_label,epochs=30,validation_data=(test_image,test_label))
# 绘制loss函数折线图
plt.plot(history.epoch,history.history.get('loss'),label='loss')
plt.plot(history.epoch,history.history.get('val_loss'),label='val_loss')
plt.legend()
# 绘制acc折线图
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()

# 转换独热编码
train_label_onehot = tf.keras.utils.to_categorical(train_label)
test_label_onehot = tf.keras.utils.to_categorical(test_label)

model = tf.keras.Sequential()
# 数据扁平化
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['acc']
)
model.fit(train_image,train_label_onehot,epochs=5)
predict = model.predict(test_image)
# 预测结果 9
np.argmax(predict[0])
# label对应结果也是9
test_label[0]

2

评论区