如何免费创建瑞安营销网站并拥有自己的独立空间?
摘要:瑞安营销网站建设,免费建立自己的网站空间,图行天下免费素材网,免费打广告有什么软件写在前面 上一阶段我们完成了手写数字识别项目的构建,了解了网络构建、训练、测试的基本流程,但是对于
瑞安营销网站建设,免费建立自己的网站空间,图行天下免费素材网,免费打广告有什么软件写在前面
上一阶段我们完成了手写数字识别项目的构建#xff0c;了解了网络构建、训练、测试的基本流程#xff0c;但是对于一些常见的操作#xff0c;因其使用过于频繁#xff0c;实际上并无必要手动实现#xff0c;而早已被封装为函数了。
这篇文章我们将了解keras高层…写在前面
上一阶段我们完成了手写数字识别项目的构建了解了网络构建、训练、测试的基本流程但是对于一些常见的操作因其使用过于频繁实际上并无必要手动实现而早已被封装为函数了。
这篇文章我们将了解keras高层API将手写数字识别项目用高层API重写一遍。 写在中间
学习之前来探讨之前一直有的疑问运行时提示没有相应模块原因肯定是引入包的原因如果不懂keras和tf.keras的区别还是很有必要看看这篇文章
其实 keras 可以理解为一套搭建与训练神经网络的高层 API 协议Keras 本身已经实现了此协议安装标准的 Keras 库就可以方便地调用TensorFlow、CNTK 等后端完成加速计算在 TensorFlow 中也实现了一套 keras 协议即 tf.keras它与 TensorFlow 深度融合且只能基于 TensorFlow 后端运算并对TensorFlow 的支持更完美。对于使用 TensorFlow 的开发者来说tf.keras 可以理解为一个普通的子模块与其他子模块如 tf.mathtf.data 等并没有什么差别。
但是为了方便我们操作为避免混淆我们就选择tf.keras来完成代码中的相关操作。
注意tensorflow版本和keras版本一定要相兼容不兼容的话引入tensorflow.keras就会报错。 1. 引包
import tensorflow as tf
from tensorflow.keras import datasets, layers, Sequential, optimizers, models, losses
# pycharm中会出现红色波浪线但不影响运行2. 数据集的读取与处理
这一步就老生常谈了直接复制粘贴过来
def preprocess(x, y):x tf.cast(x, dtypetf.float32) / 255.x tf.reshape(x, [-1, 28*28])y tf.cast(y, dtypetf.int32)y tf.one_hot(y, depth10)return x, y(x, y), (x_test, y_test) datasets.mnist.load_data()# 数据集的处理由于返回的数据集是numpy类型的若要使用GPU加速需转换为张量
train_db tf.data.Dataset.from_tensor_slices((x, y))
train_db train_db.shuffle(60000).batch(128).map(preprocess).repeat(5)
# 对测试集的简单处理
test_db tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db test_db.shuffle(10000).batch(128).map(preprocess)
3. 网络层的构建
封装创建 对于常见的网络原来需要手动调用每一层的类实例完成前向传播运算当网络层数变得较深时这一部分代码显得非常臃肿。可以通过 tf.keras 提供的网络容器 Sequential 将多个网络层封装成一个大网络模型只需要调用网络模型的实例一次即可完成数据从第一层到最末层的顺序传播运算。
在完成网络创建时网络层类并没有创建内部权值张量等成员变量此时通过调用类的 build 方法并指定输入大小即可自动创建所有层的内部张量。通过 summary()函数可以方便打印出网络结构和参数量
# 创建网络
network Sequential([layers.Dense(256, activationrelu),layers.Dense(128, activationrelu),layers.Dense(64, activationrelu),layers.Dense(32, activationrelu),layers.Dense(10)])
network.build(input_shape(None, 28 * 28)) # None代表batch不定
network.summary()就如我们会打印出以下信息 Layer (type)层名称、层类型 Output Shape输出形状 Param #层的参数个数 Trainable params、Non-trainable params可优化的参数、不可优化的参数
Model: sequential
_________________________________________________________________Layer (type) Output Shape Param #
dense (Dense) (None, 256) 200960 dense_1 (Dense) (None, 128) 32896 dense_2 (Dense) (None, 64) 8256 dense_3 (Dense) (None, 32) 2080 dense_4 (Dense) (None, 10) 330
Total params: 244,522
Trainable params: 244,522
Non-trainable params: 0
_________________________________________________________________4. 模型装配、训练、测试
在训练网络时一般的流程是通过前向计算获得网络的输出值再通过损失函数计算网络误差然后通过自动求导工具计算梯度并更新同时间隔性地测试网络的性能。对于这种常用的训练逻辑可以直接通过 Keras 提供的模型装配与训练等高层接口实现简洁清晰。
在 tf.keras 中提供了 compile()和 fit()函数方便实现上述逻辑。首先通过compile 函数指定网络使用的优化器对象、损失函数类型评价指标等设定这一步称为装配。
# 模型装配
network.compile(optimizeroptimizers.Adam(learning_rate0.01),losslosses.CategoricalCrossentropy(from_logitsTrue),metrics[accuracy])模型装配完成后即可通过 fit()函数送入待训练的数据集和验证用的数据集这一步称为模型训练。
# 指定训练集和测试集训练5个epochs每2个epoch验证一次
network.fit(train_db, epochs5, validation_datatest_db, validation_freq2)如果只是简单的测试模型的性能可以通过 Model.evaluate(test_db)循环测试完 test_db数据集上所有样本并打印出性能指标
network.evaluate(test_db)5. 模型保存与加载
在训练时间隔性地保存模型状态也是非常好的习惯这一点对于训练大规模的网络尤其重要。一般大规模的网络需要训练数天乃至数周的时长一旦训练过程被中断或者发生宕机等意外之前训练的进度将全部丢失。如果能够间断地保存模型状态到文件系统即使发生宕机等意外也可以从最近一次的网络状态文件中恢复从而避免浪费大量的训练时间和计算资源。因此模型的保存与加载非常重要。
仅保存网络参数 这种保存与加载网络的方式最为轻量级文件中保存的仅仅是张量参数的数值并没有其它额外的结构参数。但是它需要使用相同的网络结构才能够正确恢复网络状态因此一般在拥有网络源文件的情况下使用。
print(模型参数自动保存...)
network.save_weights(weights.ckpt)print(模拟意外情况网络删除...)
del networkprint(重新加载模型的参数...)# 重新创建相同的网络结构
network Sequential([layers.Dense(256, activationrelu),layers.Dense(128, activationrelu),layers.Dense(64, activationrelu),layers.Dense(32, activationrelu),layers.Dense(10)])network.compile(optimizeroptimizers.Adam(learning_rate0.01),losstf.losses.CategoricalCrossentropy(from_logitsTrue),metrics[accuracy])
# 从参数文件中读取数据并写入当前网络
network.load_weights(weights.ckpt)保存模型及参数 这是一种不需要网络源文件仅仅需要模型参数文件即可恢复出网络模型的方法。通过 Model.save(path)函数可以将模型的结构以及模型的参数保存到path文件上在不需要网络源文件的条件下通过tf.keras.models.load_model(path)即可恢复网络结构和网络参数。
network.save(model.h5)
print(模型已自动保存...)print(模拟意外情况网络删除...)
del networkprint(重新加载模型中...)
network tf.keras.models.load_model(model.h5, compileFalse) 学到这里就基本将手写数字识别的重点变化列举了出来下面我们就去摩拳擦掌地试试吧
写在最后 点赞你的认可是我创作的动力 ⭐收藏你的青睐是我努力的方向 ✏️评论你的意见是我进步的财富
