首页 > 其他分享 >SciTech-BigDataAIML-Tensorflow-模型的训练与评估: tf.keras.losses + tf.keras.optimizer + tf.keras.metrics

SciTech-BigDataAIML-Tensorflow-模型的训练与评估: tf.keras.losses + tf.keras.optimizer + tf.keras.metrics

时间:2024-05-16 12:31:27浏览次数:11  
标签:index optimizer keras pred losses batch tf

模型的训练: tf.keras.losses 和 tf.keras.optimizer
定义一些模型超参数:
num_epochs = 5
batch_size = 50
learning_rate = 0.001

实例化模型和数据读取类,并实例化一个 tf.keras.optimizer 的优化器(这里使用常用的 Adam 优化器):

model = MLP()
data_loader = MNISTLoader()
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
然后迭代进行以下步骤:

从 DataLoader 中随机取一批训练数据;

将这批数据送入模型,计算出模型的预测值;

将模型预测值与真实值进行比较,计算损失函数(loss)。这里使用 tf.keras.losses 中的交叉熵函数作为损失函数;

计算损失函数关于模型变量的导数;

将求出的导数值传入优化器,使用优化器的 apply_gradients 方法更新模型参数以最小化损失函数(优化器的详细使用方法见 前章 )。

具体代码实现如下:

num_batches = int(data_loader.num_train_data // batch_size * num_epochs)
for batch_index in range(num_batches):
    X, y = data_loader.get_batch(batch_size)
    with tf.GradientTape() as tape:
        y_pred = model(X)
        loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y, y_pred=y_pred)
        loss = tf.reduce_mean(loss)
        print("batch %d: loss %f" % (batch_index, loss.numpy()))
    grads = tape.gradient(loss, model.variables)
    optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))

交叉熵(cross entropy)与 tf.keras.losses

你或许注意到了,在这里,我们没有显式地写出一个损失函数,而是使用了 tf.keras.losses 中的 sparse_categorical_crossentropy (交叉熵)函数,
将模型的预测值 y_pred 与真实的标签值 y 作为函数参数传入,由 Keras 帮助我们计算损失函数的值。

交叉熵作为损失函数,在分类问题中被广泛应用。其离散形式为 H(y, \hat{y}) = -\sum_{i=1}^{n}y_i \log(\hat{y_i}) ,其中 y 为真实概率分布, \hat{y} 为预测概率分布, n 为分类任务的类别个数。
预测概率分布与真实分布越接近,则交叉熵的值越小,反之则越大。更具体的介绍及其在机器学习中的应用可参考 这篇博客文章 。

tf.keras 有两个交叉熵相关的损失函数 tf.keras.losses.categorical_crossentropy 和 tf.keras.losses.sparse_categorical_crossentropy 。其中 sparse 的含义是,真实的标签值 y_true 可以直接传入 int 类型的标签类别。具体而言:

loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y, y_pred=y_pred)

loss = tf.keras.losses.categorical_crossentropy(
y_true=tf.one_hot(y, depth=tf.shape(y_pred)[-1]),
y_pred=y_pred
)
的结果相同。

模型的评估: tf.keras.metrics
模型的评估: tf.keras.metrics
最后,我们使用测试集评估模型的性能。
这里,我们使用 tf.keras.metrics 中的 SparseCategoricalAccuracy 评估器来评估模型在测试集上的性能,该评估器能够对模型预测的结果与真实结果进行比较,并输出预测正确的样本数占总样本数的比例。我们迭代测试数据集,每次通过 update_state() 方法向评估器输入两个参数: y_pred 和 y_true ,即模型预测出的结果和真实结果。评估器具有内部变量来保存当前评估指标相关的参数数值(例如当前已传入的累计样本数和当前预测正确的样本数)。迭代结束后,我们使用 result() 方法输出最终的评估指标值(预测正确的样本数占总样本数的比例)。

以下代码,实例化一个 tf.keras.metrics.SparseCategoricalAccuracy 评估器,
并使用 For 循环迭代分批次传入了测试集数据的预测结果与真实结果,
并输出训练后的模型在测试数据集上的准确率。

sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()
num_batches = int(data_loader.num_test_data // batch_size)
for batch_index in range(num_batches):
    start_index, end_index = batch_index * batch_size, (batch_index + 1) * batch_size
    y_pred = model.predict(data_loader.test_data[start_index: end_index])
    sparse_categorical_accuracy.update_state(y_true=data_loader.test_label[start_index: end_index], y_pred=y_pred)
print("test accuracy: %f" % sparse_categorical_accuracy.result())

输出结果:

test accuracy: 0.947900
可以注意到,使用这样简单的模型,已经可以达到 95% 左右的准确率。

神经网络的基本单位:神经元

如果我们将上面的神经网络放大来看,详细研究计算过程,
比如取第二层的第 k 个计算单元,可以得到示意图如下:

../../images/neuron.png
该计算单元 Q_k 有 100 个权值参数 w
, w_{1k}, ..., w_{99k} 和 1 个偏置参数 b_k 。将第 1 层中所有的 100 个计算单元 P_0, P_1, ..., P_{99} 的值作为输入,分别按权值 w_{ik} 加和(即 \sum_{i=0}^{99} w_{ik} P_i ),并加上偏置值 b_k ,然后送入激活函数 f 进行计算,即得到输出结果。

事实上,这种结构和真实的神经细胞(神经元)类似。神经元由树突、胞体和轴突构成。树突接受其他神经元传来的信号作为输入(一个神经元可以有数千甚至上万树突),胞体对电位信号进行整合,而产生的信号则通过轴突传到神经末梢的突触,传播到下一个(或多个)神经元。

../../_images/real_neuron.png
神经细胞模式图(修改自 Quasar Jarosz at English Wikipedia [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)])

上面的计算单元,可以被视作对神经元结构的数学建模。
在上面的例子里,第二层的每一个计算单元(人工神经元)有 100 个权值参数和 1 个偏置参数,
而第二层计算单元的数目是 10 个,因此这一个全连接层的总参数量为 100*10 个权值参数和 10 个偏置参数。
事实上,这正是该全连接层的两个变量 kernel 和 bias 的形状。
仔细研究一下,你会发现,这里基于神经元建模的介绍与上文基于矩阵计算的介绍是等价的。

事实上,应当是先有神经元建模的概念,再有基于人工神经元和层结构的人工神经网络。
但由于本手册着重介绍 TensorFlow 的使用方法,所以调换了介绍顺序。

标签:index,optimizer,keras,pred,losses,batch,tf
From: https://www.cnblogs.com/abaelhe/p/18195755

相关文章

  • ATFNet:长时间序列预测的自适应时频集成网络
    ATFNet是一个深度学习模型,它结合了时间域和频域模块来捕获时间序列数据中的依赖关系。引入了一种新的加权机制来调整周期性的权重,增强了离散傅立叶变换,并包括一个复杂关系识别的注意力机制,在长期时间序列预测中优于当前方法(每个模型都这么说)。这是4月发布在arxiv上的论文,还包含......
  • Bug搬运工-support of DACL on 9800 WLC platform.
    supportofDACLon9800WLCplatform.CSCvv16183 Symptom:noneConditions:9800runninganycodeandanymodelofAP.Workaround:noneFurtherProblemDescription:dACLwasaddedinrelease17.10 Requestfor9800tosupportDACLCSCvw89561 Symptom:......
  • NSSCTF round#22逆向
    NSSCTFround#22逆向1.wp要及时写不然忘光光2.赛题分文件夹放ezcrypt下载下来是python打包的exe,解包出pyc用pycdc反编译看一下嗯不认识BEFORE_WITH命令。丢到gpt4o里看看还蛮准确的,和作者提供的源码一样。不过对填充的处理不对,原程序是填充'\x00'。不过比自己硬看好太多......
  • SciTech-BigDataAIML-Tensorflow-Optimizer:优化器
    https://keras.io/api/optimizers/OptimizersAvailableoptimizers:SGDRMSpropAdamAdamWAdadeltaAdagradAdamaxAdafactorNadamFtrlLionLossScaleOptimizerUsagewithcompile()&fit()Anoptimizerisoneofthetwoargumentsrequiredforcompilin......
  • [SWPUCTF 2021 新生赛]fakerandom 关于random.seed的一些事
    最近开始接触reverse了,难得有些力不从心(本质还是汇编看不懂),来看看这道题吧。点击查看代码importrandomflag='xxxxxxxxxxxxxxxxxxxx'random.seed(1)l=[]foriinrange(4):l.append(random.getrandbits(8))result=[]foriinrange(len(l)):random.se......
  • [HDCTF 2023]YamiYami python中的另一种反序列化--yaml
    今天做了到新颖的题,关于python中的yaml反序列化的题目,直接上题吧。发现第一个链接的参数是?url=XXXX,一眼利用点。嗯?直接出了flag,应该是非预期解。再看看有app.py,那就试试。发现app.*被过滤了,二次编码绕过试试。点击查看代码@app.route('/')defindex():session['pas......
  • 实验12-使用keras预训练模型完成猫狗识别
    win10python3.7tensorflow-gpu2.6.0keras2.6.0 出现ValueError:Askedtoretrieveelement0,buttheSequencehaslength0原因:老师给的代码中标红的文件夹下没有所需文件或缺失 解决办法:将image文件夹下的test下的cat和dog文件夹分别复制到dc下的test和train......
  • ctfshow-菜狗杯-web
    菜狗杯一言既出打开题目就是一个朴实无华的php代码我们分析一下:需要传入一个num的参数,使num==114514,后面经过intval转化后要num==1919810,否则直接结束进程这下就有点难办了,但其实我们只要其实闭合一下这个assert函数,不让这个结束的条件成立就行,payload如下num=114514);//......
  • 实验10-使用keras完成线性回归
    VMware虚拟机Ubuntu20-LTSpython3.6tensorflow1.15.0keras2.3.1运行截图:   代码:importnumpyasnpnp.random.seed(1337)fromkeras.modelsimportSequentialfromkeras.layersimportDensefromsklearn.metricsimportr2_scorefrommatplotlibimportp......
  • 实验11-使用keras完成逻辑回归
    VMware虚拟机Ubuntu20-LTSpython3.6tensorflow1.15.0keras2.3.1运行截图:   代码:importnumpyasnpfromkeras.modelsimportSequentialfromkeras.layersimportDense,Dropout,Activation,Flattenimportmatplotlib.pyplotaspltfromsklearnimport......