首页 > 其他分享 >深度学习(二)

深度学习(二)

时间:2024-05-30 21:30:04浏览次数:19  
标签:layers sample plt 训练 模型 学习 深度 model

深度学习(二)

4.前馈全连接神经网络(Sequential模型)
import tensorflow as tf

from tensorflow import keras

model = keras.models.Sequential([

    keras.layers.Flatten(input_shape=[784]),

    keras.layers.Dense(300,activation="relu"),

    keras.layers.Dense(100,activation="relu"),

    keras.layers.Dense(10,activation="softmax")

])

使用TensorFlow和Keras库来创建一个简单的神经网络模型,用于分类MNIST数据集中的手写数字。

import tensorflow as tf:导入TensorFlow库,这是一个流行的开源机器学习库,用于构建和训练各种类型的神经网络。

from tensorflow import keras:从TensorFlow库中导入Keras API。Keras是一个高级神经网络API,它能够以TensorFlow作为后端运行,提供了一种更简洁、更模块化的方式来构建和训练神经网络。

model = keras.models.Sequential():创建一个Keras的顺序模型(Sequential model)。顺序模型是Keras中最常见的模型类型,它允许我们逐层堆叠各个层来构建模型。

keras.layers.Flatten(input_shape=[784]):向模型中添加一个展平层(Flatten layer),它的作用是将输入的数据展平成一个一维数组。由于MNIST图像的原始大小是28x28像素,所以展平后的数组长度为784。

keras.layers.Dense(300, activation="relu"):添加一个全连接层(Dense layer),它有300个神经元,并使用ReLU(Rectified Linear Unit)作为激活函数。ReLU激活函数在输入为正时输出与输入相同,在输入为负时输出0。

keras.layers.Dense(100, activation="relu"):再添加一个全连接层,它有100个神经元,同样使用ReLU激活函数。

keras.layers.Dense(10, activation="softmax"):最后添加一个全连接层,它有10个神经元,每个神经元对应一个数字类别(0到9)。这个层使用softmax激活函数,它将神经元的输出转换为概率分布,表示每个类别的预测概率。

model.layers[1]

在TensorFlow Keras模型中,model.layers属性是一个列表,包含了模型中的所有层。列表中的每个元素都是一个层对象,它们按照模型构建时的顺序排列。

当你使用model.layers[1]时,你正在访问列表中的第二个元素,即模型的第二个层。根据之前定义的模型结构,第二个层是一个全连接层(Dense layer),它有300个神经元,并使用ReLU激活函数。

这个层的具体配置可以在model.layers[1].get_config()中找到,这将返回一个包含层配置的字典。例如,它将包含层的名称、激活函数、单元数等信息。

weights_1, bias_1 = model.layers[1].get_weights()

print(weights_1.shape)

print(bias_1.shape)

提取模型中第二个层的权重和偏置,并打印它们的形状。

weights_1, bias_1 = model.layers[1].get_weights():这行代码调用了get_weights()方法,它返回一个列表,其中包含了层的权重和偏置。在这个例子中,weights_1将包含第二个层的权重,而bias_1将包含偏置。

print(weights_1.shape):这行代码打印权重数组的形状。在这个模型中,第二个层是一个全连接层,它的输入维度是784(因为MNIST图像被展平成784个像素),输出维度是300(因为该层有300个神经元)。因此,权重的形状将是(784, 300)。

print(bias_1.shape):这行代码打印偏置数组的形状。在这个模型中,第二个层有300个神经元,因此偏置的形状将是(300,),即一个长度为300的一维数组。

model.summary()

打印出模型的概况,包括每一层的类型、输出形状、层的参数数量以及整个模型的总参数数量。

在一个已经构建好的Keras模型上调用model.summary()时,它会输出以下信息:

  1. 每层的类型(例如,Flatten、Dense)。
  2. 每层的输出形状。对于全连接层,输出形状是(批量大小, 单元数)。对于展平层,输出形状是(批量大小, 展平后的特征数)。
  3. 每层的参数数量。对于全连接层,参数数量是(输入特征数 * 单元数) + 单元数(因为还要加上偏置项)。
  4. 整个模型的总参数数量。

在这个输出中:

  1. None表示批量大小是未知的,可以是任意的。
  2. flatten层没有参数,因为它只是将输入展平。
  3. 第一个dense层有235,500个参数,计算方式是784(输入特征数)* 300(单元数)+ 300(偏置项)。
  4. 第二个dense层有30,100个参数,计算方式是300(输入特征数)* 100(单元数)+ 100(偏置项)。
  5. 第三个dense层有1,010个参数,计算方式是100(输入特征数)* 10(单元数)+ 10(偏置项)。
  6. 整个模型总共有266,610个参数,这些参数都是可训练的。
# 编译网络

model.compile(loss="sparse_categorical_crossentropy",optimizer="sgd",metrics=["accuracy"])

编译了Keras模型,指定了损失函数、优化器和评估指标。编译后的模型就可以使用model.fit()方法进行训练,使用model.evaluate()方法进行评估,以及使用model.predict()方法进行预测。

loss="sparse_categorical_crossentropy":这指定了模型的损失函数为稀疏分类交叉熵(sparse categorical crossentropy)。这个损失函数适用于多分类问题,其中每个样本只有一个真实的标签,并且标签是以整数形式给出的(例如,0到9)。在MNIST数据集中,每个图像都标记有一个0到9之间的数字,因此这个损失函数是合适的。

optimizer="sgd":这指定了模型的优化器为随机梯度下降(Stochastic Gradient Descent,SGD)。优化器负责在训练过程中更新模型的权重,以最小化损失函数。SGD是一种简单的优化算法,但它可能需要更多的时间来训练模型,并且可能需要仔细调整学习率和其他超参数。

metrics=["accuracy"]:这指定了模型在训练和评估过程中要监控的指标。在这里,你选择了准确率(accuracy)作为评估模型性能的主要指标。准确率是指模型正确预测的样本数与总样本数之间的比例。


# 训练网络

h = model.fit(X_train, y_train, batch_size=32, epochs=30,validation_data=(X_valid, y_valid))

使用Keras模型的fit方法来训练之前编译的模型。fit方法负责执行实际的训练过程,在每个训练周期(epoch)中多次迭代训练数据,并更新模型的权重。

X_train, y_train:这些是训练数据的特征和标签。X_train包含了模型的输入数据,而y_train包含了对应的真实标签。

batch_size=32:这是每次梯度更新中使用的样本数量。批量大小(batch size)是一个重要的超参数,它影响了模型训练的稳定性和速度。在这个例子中,每个批量包含32个样本。

epochs=30:这是训练过程中遍历整个训练数据集的次数。每个周期(epoch)中,模型会看到一次所有的训练样本。在这个例子中,模型将进行30次这样的遍历。

validation_data=(X_valid, y_valid):这是验证数据集的特征和标签。在每次训练周期结束后,模型将使用这个数据集来评估当前模型的性能。这有助于监控训练过程,防止过拟合,并调整模型或训练参数。

h = model.fit:方法的返回值是一个历史对象(History object),它包含了训练过程中的损失值和评估指标值。这个对象可以用来分析训练过程中的性能变化,例如,通过绘制损失和准确率随时间的变化图。

总结:使用训练数据集X_train和y_train来训练模型,每个周期遍历整个数据集30次,每次使用32个样本的批量大小。同时,使用验证数据集X_valid和y_valid来监控训练过程中的模型性能。训练完成后,可以通过h对象来分析训练历史。

pd.DataFrame(h.history)

在Keras中,当使用model.fit()方法训练模型时,可以返回一个历史对象(History object),它记录了训练过程中的损失值和评估指标值。这个历史对象有一个history属性,它是一个字典,包含了训练过程中每个周期(epoch)的损失和评估指标。

pd.DataFrame(h.history)这行代码的作用是将历史对象的history属性转换为一个pandas的DataFrame对象。这样做的目的是为了更方便地查看和分析训练过程中的数据。

DataFrame是一个二维标签化数据结构,它提供了许多灵活的操作和数据分析工具。通过将历史数据转换为DataFrame,你可以轻松地执行以下操作:

  1. 查看每个周期结束时模型的损失和评估指标。
  2. 绘制损失和评估指标随时间的变化图。
  3. 计算损失和评估指标的平均值、标准差等统计信息。
  4. 将数据导出为CSV文件或其他格式。

在这个DataFrame中,每一行代表一个训练周期,列包括训练损失(loss)、训练准确率(accuracy)、验证损失(val_loss)和验证准确率(val_accuracy)。通过这个DataFrame,可以直观地看到模型在每个周期中的性能变化。

# 绘图

pd.DataFrame(h.history).plot(figsize=(8,5))

plt.grid(True)

plt.gca().set_ylim(0, 1) # set the vertical range to[0 - 1]

plt.show()

使用pandas和matplotlib库来绘制模型训练过程中的损失和评估指标的变化图。

pd.DataFrame(h.history).plot(figsize=(8,5)):首先,将历史对象的history属性转换为pandas的DataFrame对象,然后调用DataFrame的plot方法来绘制图表。figsize=(8,5)参数设置了图表的大小,宽为8英寸,高为5英寸。

plt.grid(True):这行代码为图表添加网格线,以便更容易地读取数据点的值。

plt.gca().set_ylim(0, 1):这行代码设置了图表的垂直范围。由于损失值和准确率通常在0到1之间,因此将垂直范围设置为[0, 1]可以更清楚地展示这些数据。

plt.show():最后,调用plt.show()来显示图表。这将在一个新的窗口中显示包含损失和准确率变化图的图表。

将模型训练过程中的损失和评估指标(如准确率)以图表的形式展示出来,这有助于分析和理解模型的训练效果。通过观察这些指标随时间的变化,可以判断模型是否收敛,是否出现过拟合,以及是否需要调整训练参数。

# 对测试集验证训练模型手写识别准确率

model.evaluate(X_test, y_test,batch_size = 1)

用Keras模型的evaluate方法来对测试集进行评估,以计算模型在测试数据上的损失和评估指标。

model.evaluate():这个方法会返回一个包含损失值和评估指标值的列表。对于分类问题,通常返回的指标包括损失函数的值和准确率。在这个例子中,由于模型在编译时指定了metrics=["accuracy"],evaluate方法将返回测试集上的损失率和准确率。

x_sample,y_sample=X_test[11:12],y_test[11]

y_prob=model.predict(x_sample).round(2)

y_prob

对测试集中的单个样本进行预测,并查看模型预测的概率分布。

x_sample, y_sample = X_test[11:12], y_test[11]:这行代码从测试集中提取第12个样本(索引为11,因为索引从0开始)的特征和标签。x_sample包含了这个样本的图像数据,而y_sample是这个样本的真实标签。

y_prob = model.predict(x_sample).round(2):这行代码使用模型的predict方法来预测x_sample的概率分布。predict方法返回一个数组,其中每个元素是模型预测的对应类别的概率。round(2)函数将预测的概率四舍五入到小数点后两位,以便于阅读。

y_prob:这个变量包含了模型对x_sample的预测概率。由于MNIST数据集有10个类别(数字0到9),y_prob将是一个长度为10的数组,每个元素对应一个类别的预测概率。

img = x_sample.reshape(28,28)

plt.imshow(img)#画图

plt.title('label =' + str(np.argmax(y_prob)))

plt.show()

显示测试集中一个样本的图像,并使用模型预测的标签作为标题。

img = x_sample.reshape(28,28):这行代码将单个样本的特征数据x_sample重新整形为一个28x28的二维数组,这样就可以将其视为一个图像。由于MNIST图像的原始大小是28x28像素,这个重塑操作将一维数组转换成二维的图像格式。

plt.imshow(img):这行代码使用matplotlib的imshow函数来显示图像。imshow函数可以显示二维数组作为图像。

plt.title('label = ' + str(np.argmax(y_prob))):这行代码设置图像的标题。np.argmax(y_prob)返回概率数组y_prob中最大值的索引,这个索引代表了模型预测的类别。标题显示了字符串"label = "后跟这个预测的类别。

plt.show():这行代码显示图像。图像将在一个新的窗口中显示,标题为模型预测的标签。

显示了测试集中一个样本的图像,并使用模型预测的标签作为图像的标题。这有助于直观地验证模型的预测结果是否正确。如果模型的预测标签与图像的真实标签相同,则说明模型正确地识别了图像。如果不同,则说明模型在识别这个特定图像时犯了错误

标签:layers,sample,plt,训练,模型,学习,深度,model
From: https://blog.csdn.net/2303_77556681/article/details/139334921

相关文章

  • JVM学习-字节码指令集(二)
    对象的创建与访问指令创建指令虽然类实例和数组都是对象,但Java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令创建类实例指令:new它接收一个操作数,指向常量池的索引,表示要创建的类型,执行完成后,将对象的引用压入操作数栈创建数组的指令创建数组的指令:newarray,......
  • 模型节点操作学习笔记(Appendix)实验1 -- Tflite int8 删除最后的Round节点 (持续更新)
    背景如下:我要删除Round节点,同时看了一下,Dequantize和Quantize也是没有必要的。所以最好一起删除。原始项目地址:PINTO0309/hand-gesture-recognition-using-onnx:ThisisahandgesturerecognitionprogramthatreplacestheentireMediaPipeprocesswithONNX.Simultane......
  • 基于深度学习的鸟类声音识别系统
    鸟叫声识别在鸟类保护中具有重要意义。通过适当的声音分类,研究可以自动预测该地区的生活质量。如今,深度学习模型被用于对鸟类声音数据进行高精度的分类。然而,现有的大多数鸟类声音识别模型的泛化能力较差,并且采用复杂的算法来提取鸟类声音特征。为了解决这些问题,本文构建了一个包......
  • 数据结构学习笔记-快速排序
    快速排序的算法设计与分析问题描述:设计并分析快速排序【算法设计思想】选择基准值:从待排序数组中选择一个元素作为基准值(pivot)。在这个示例中,选择了数组中的最后一个元素作为基准值。分割数组:将数组分割为两部分,小于等于基准值的元素放在基准值的左边,大于基准值的元素放在右......
  • uoj项目部署的学习实践和基于JUnit进行的项目测试
    基于JUnit进行的项目测试对不同功能点进行测试:检测忘记密码功能、注册功能能否正常使用脚本文件:registerTest.java1.检测忘记密码功能。事先注册好一个账号用于测试测试步骤:输入账号输入电子邮箱输入验证码1)用例标题:验证码错误情况测试数据:账号2021127电子邮箱2848250......
  • uoj项目部署中题目管理的相关学习与应用
    一.概述1.新建题目和管理界面只有超级管理员有权限新建题目,每次新建题目都必须由超级管理员完成。在题目页面,超级管理员或该题目的管理员可以通过管理按钮进入题目管理界面。题目管理界面分为三个选项卡:编辑:题面编辑页面管理者:题目管理员管理页面数据:题目数据管理页面以及......
  • 模型节点操作学习笔记(1)--SavedModel详解
    参考:使用SavedModel格式 | TensorFlowCore(google.cn) (持续更新)   SavedModel是一个包含序列化签名和运行这些签名所需的状态的目录,其中包含变量值和词汇表。$ls{mobilenet_save_path}assetsfingerprint.pbsaved_model.pbvariablesassets目......
  • USP技术提升大语言模型的零样本学习能力
     大语言模型(LLMs)在零样本和少样本学习能力上取得了显著进展,这通常通过上下文学习(in-contextlearning,ICL)和提示(prompting)来实现。然而,零样本性能通常较弱,因为缺乏指导和难以应用现有的自动提示设计方法。论文提出了一种名为UniversalSelf-AdaptivePrompting(USP)的自动提示......
  • 列表样式,定位,元素居中学习
    1.列表样式<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>列表样式</title>......
  • 我说同事咋找工作命中率这么高,原来是学习了这些招式
    最近有两个同事离职了,其中一个还是专科,他俩一个是前端开发,一个是python开发,两个人都接近35岁了。我们还劝告他们,不要离职,要骑驴找马。但了解后,他俩非常有信心的说:不怕,哥们最近学习了写简历的新技巧,命中率非常高。他俩跟我说,之前也是写简历,就照着网上的模板写一写,随便罗列一些......