从零开始构建并编写神经网络---Keras【学习笔记】[1/2]

发布时间:2022-10-08 11:00

优质资源分享

学习路线指引(点击解锁) 知识定位 人群定位
Python实战微信订餐小程序 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
Python量化交易实战 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

Keras简介:

Keras是由纯python编写的基于theano/tensorflow的深度学习框架。
  Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:

  1. 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
  2. 支持CNN和RNN,或二者的结合
  3. 无缝CPU和GPU切换

Keras官网首页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnKSC4p9-1654449650750)(https://img2022.cnblogs.com/blog/2745075/202206/2745075-20220601225945507-629925755.png “Keras官网首页logo”)]

一、背景

本次构建神经网络最终目的:输入一张手写数字图片后,网络输出该图片对应的数字。

二、Keras代码实现

2.1 导入Keras库

import tensorflow as tf
from tensorflow.keras.datasets import mnist

如果没有安装TensorFlow,那么可以参考我之前的文章:重装CUDA和cuDNN(目的是装TensorFlow和pytorch)【个人梳理总结】

2.2 加载数据集(训练集和测试集)

我们使用Keras下的MNIST手写字符数据集,可以使用如下命令下载数据集:

(train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data()
'''
load\_data() returns tuple of NumPy arrays: (x\_train, y\_train), (x\_test, y\_test).
train\_images: uint8 NumPy array of grayscale image data with shapes (60000, 28, 28), containing the training data. 
Pixel values range from 0 to 255.
train\_labels: uint8 NumPy array of digit labels (integers in range 0-9) with shape (60000,) for the training data.
test\_images: uint8 NumPy array of grayscale image data with shapes (10000, 28, 28), containing the test data. 
Pixel values range from 0 to 255.
test\_labels: uint8 NumPy array of digit labels (integers in range 0-9) with shape (10000,) for the test data.
'''

下面是选做步骤~

如果想验证一下各个变量的shape可以使用python中的断言关键字:

assert train_images.shape == (60000, 28, 28)
assert train_labels.shape == (10000, 28, 28)
assert test_images.shape == (60000,)
assert test_labels.shape == (10000,)

我们可以使用matplotlib先为我们显示一下测试集第一张图片,请记住它:

digit = test_images[0]
import matplotlib.pyplot as plt

plt.imshow(digit, cmap=plt.cm.binary)  # 输出二值化图像
plt.show()

需要安装matplotlib,请移步至Matplotlib 3.5.2 documentation

或者可以打印test_labels,记住第一个元素的label是什么。

print('test\_labels', test_labels)

不出意外的话结果是“7”。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXlIYdhg-1654449650755)(https://img2022.cnblogs.com/blog/2745075/202206/2745075-20220605123023429-560745067.png “7”)]

2.3 搭建神经网络

Sequential序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。
  可以通过向Sequential模型传递一个layer的list来构造该模型,也可以像本文使用的通过.add()方法一个个的将layer加入模型中:

from tensorflow.keras import models
from tensorflow.keras import layers

network = models.Sequential()  # 创建实例命名为network。Sequential意为顺序的,即序贯模型。
network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))  # 第一层需要加一个input\_shape关键字参数
network.add(layers.Dense(10, activation='softmax'))  # ①输出层的units=10,意味着存在10个类别,实际意义为输出的结果是从0~10这是个数字。②我们想要将结果的分类数值范围限定在[0,1]之间,理论上activation也可以换成其他能够将结果限定在[0,1]的激活函数

关于Dense层的理解,可以阅读深入理解 KERAS 中 DENSE 层参数

此时,我们可以通过一些命令整体查看搭建的神经网络(可任选其一):

network.summary()  # 输出一下搭建的神经网络框架总结
tf.keras.utils.plot_model(network, "my\_first\_network.png")  # 图形化输出
keras.utils.plot_model(network, "my\_first\_network\_with\_shape\_info.png", show_shapes=True)  # 带有输入shape和输出shape的图形化输出

输出结果省略,各位可在实践中自行感受。

完成模型的搭建后,我们需要使用.compile()方法来编译模型:

  • 优化器optimizer:该参数可指定为已预定义的优化器名,如rmspropadagrad,或一个Optimizer类的对象;
  • 损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical\_crossentropymse,也可以为一个损失函数;
  • 指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数。指标函数应该返回单个张量,或一个完成metric\_name - > metric\_value映射的字典。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号