从零开始构建并编写神经网络---Keras【学习笔记】[1/2]
Keras简介:
Keras是由纯python编写的基于theano/tensorflow的深度学习框架。
Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:
- 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
- 支持CNN和RNN,或二者的结合
- 无缝CPU和GPU切换
一、背景
本次构建神经网络最终目的:输入一张手写数字图片后,网络输出该图片对应的数字。
二、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”。
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:该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的对象;
- 损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个损失函数;
- 指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数。指标函数应该返回单个张量,或一个完成metric_name - > metric_value映射的字典。
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
2.4 数据预处理
2.4.1 对训练集和测试集的数据部分预处理
- 将每张图片数据由(28, 28)的二维数组变成(28 * 28)的一维数组
- 将灰度图中[0, 255]的整数灰度值归一化为[0, 1]的浮点数
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
2.4.2 对训练集和测试集的标签部分预处理
对应输出层的units=10,将标签做one-hot编码,用一个拥有10个元素的一位数组替换标签。我们需要把数值7变成一个含有10个元素的数组,然后在第8个元素设置为1,其他元素设置为0,即[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]
from tensorflow.keras.utils import to_categorical
print("before change:", test_labels[0])
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
print("after change: ", test_labels[0])
你一定发现了我们使用了to_categorical函数。它是将类别向量(从0到nb_classes的整数向量)映射为二值类别矩阵, 用于应用到以categorical_crossentropy为目标函数的模型中.
而我们在使用.compile()方法来编译模型参数中损失函数loss='categorical_crossentropy'。
2.5 开始对神经网络进行训练
network.fit(train_images, train_labels, epochs=5, batch_size=128)
"""
传入fit()各变量的含义:
train_images:用于训练的手写数字图片;
train_labels:对应的是图片的标记;
batch_size=128:每次网络从输入的图片数组中随机选取128个作为一组进行计算。
epochs=5: 每次计算训练数据将会被遍历5次。
fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况。
"""
2.6 测试神经网络的训练效果
测试数据输入,检验网络学习后的图片识别效果。
P.S. 识别效果与硬件有关(CPU/GPU)
本人使用的TensorFlow 2.5搭配GPU为:NVIDIA GeForce GTX 1660 Ti with Max-Q Design computeCapability: 7.5(辣鸡啊!多么想要一个3080!!!)
test_loss, test_acc = network.evaluate(test_images, test_labels, verbose=1)
# verbose: 日志记录——0:静默不显示任何信息,1(default):输出进度条记录
print('test_loss', test_loss) # 打印loss
print('test_acc', test_acc) # 打印accuracy
展示训练过程输出信息:
2.7 神经网络的预测能力
随机输入一张手写数字图片到网络中,看看它的识别效果
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
digit = test_images[1] # 挑选测试集第2张图片,是数字2
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()
test_images = test_images.reshape((10000, 28*28))
res = network.predict(test_images) # 应用已经训练好的模型进行预测
for i in range(res[1].shape[0]): # 提取第二个预测结果,即对数字2的预测结果
if res[1][i] == 1: # 看结果中10个元素的数组中第几位是1
print("the number for the picture is : ", i) # 第几位是1就输出这个数字的预测结果是几
break
展示预测结果输出:
结尾
至此,我们完成了借助Keras编写出一个简单的预测手写数字的神经网络并完成了训练、测试和预测过程,实现了我们最初的目的。
当然Keras的功能强大远不止于本文所展示的内容,更多丰富且便利的功能请各位继续参考附录学习探索。
接下来我们还将继续学习,尝试不借助Keras而是依托numpy等库,更加贴近“从零开始”构建一个神经网络。
最最重要的,本文一定存在错误和不足,恳请各位不吝赐教,不吝赐教谢谢!
附录一:有帮助的文档
1. 【官方】The Functional API
2. 【官方】The Model class
3. 【官方】The Sequential class
4. 【官方】Layer activation functions
5. Keras中文文档
附录二:网络上的好文分享
1. 深度学习笔记 目标函数的总结与整理 model.compile(loss='categorical_crossentropy'
从零开始构建并编写神经网络---Keras【学习笔记】[1/2]的更多相关文章
- 官网实例详解-目录和实例简介-keras学习笔记四
官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras 版权声明: ...
- 卷积神经网络(CNN)学习笔记1:基础入门
卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01 | In Machine Learning | 9 Comments | 14935 Vie ...
- Keras学习笔记——Hello Keras
最近几年,随着AlphaGo的崛起,深度学习开始出现在各个领域,比如无人车.图像识别.物体检测.推荐系统.语音识别.聊天问答等等.因此具备深度学习的知识并能应用实践,已经成为很多开发者包括博主本人的下 ...
- keras 学习笔记:从头开始构建网络处理 mnist
全文参考 < 基于 python 的深度学习实战> import numpy as np from keras.datasets import mnist from keras.model ...
- Keras学习笔记
Keras基于Tensorflow和Theano.作为一个更高级的框架,用其编写网络更加方便.具体流程为根据设想的网络结构,使用函数式模型API逐层构建网络即可,每一层的结构都是一个函数,上一层的输出 ...
- Keras学习笔记(完结)
使用Keras中文文档学习 基本概念 Keras的核心数据结构是模型,也就是一种组织网络层的方式,最主要的是序贯模型(Sequential).创建好一个模型后就可以用add()向里面添加层.模型搭建完 ...
- 卷积神经网络 CNN 学习笔记
激活函数Relu 最近几年卷积神经网络中,激活函数往往不选择sigmoid或tanh函数,而是选择relu函数.Relu函数的定义 $$f(x)= max(0,x)$$ Relu函数图像如下图所示: ...
- Keras学习笔记1--基本入门
""" 1.30s上手keras """ #keras的核心数据结构是“模型”,模型是一种组织网络层的方式,keras 的主要模型是Sequ ...
- [matlab]bp神经网络工具箱学习笔记
基本就三个函数: newff():创建一个bp神经网络 train():训练函数 sim():仿真函数 同时具有可视化界面,但目前不知道可视化界面如何进行仿真,且设置不太全 工具箱:Neural ne ...
随机推荐
- 拼写检查-c++
[问题描述] 作为一个新的拼写检查程序开发团队的成员,您将编写一个模块,用已知的所有形式正确的词典来检查给定单词的正确性. 如果字典中没有这个词,那么可以用下列操作中的一个来替换正确的单 ...
- title与h1的区别、b与strong的区别、i与em的区别
strong标签有语义,是起到加重语气的效果,而b标签是没有的,b标签只是一个简单加粗标签.b标签之间的字符都设为粗体,strong标签加强字符的语气都是通过粗体来实现的,而搜索引擎更侧重strong ...
- JavaScript脚本延迟加载的方式有哪些?
延迟加载就是等页面加载完成之后再加载 JavaScript 文件. js 延迟加载有助于提高页面加载速度. 一般有以下几种方式: defer 属性: 给 js 脚本添加 defer 属性,这个属性会让 ...
- Ubuntu安装docker-compose(摘自官网,自用)
安装 Docker Compose 预计阅读时间:8分钟 加速 Docker 桌面中的新功能 Docker Desktop 可帮助您在 Mac 和 Windows 上轻松构建.共享和运行容器,就像在 ...
- Filebeat和logstash 使用过程中遇到的一些小问题记录
一.filebeat 收集软链文件日志 1.1.场景 由于我们新部署的Nginx 日志都是采用的软链的形式. lrwxrwxrwx 1 root root 72 Apr 6 00:00 jy.baid ...
- Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习
Problem - C - Codeforces 看清题目要求, 最重要部分在第二段. 大佬最后给出的代码果然简单, 思路简单化, 未必非要把答案在一个大括号里全部完成, 两个指针同时跑,中间加了一堆 ...
- Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(被坑好几次)1300
原题链接 Problem - B - Codeforces 题意 给一串数,要把任意两个相邻的数的最大公约数=1 每次可以进行一个操作: 取下标为i, j的数,和任意二数x,y,且min(ai,aj) ...
- SSM整合_年轻人的第一个增删改查_新增
写在前面 SSM整合_年轻人的第一个增删改查_基础环境搭建 SSM整合_年轻人的第一个增删改查_查找 SSM整合_年轻人的第一个增删改查_新增 SSM整合_年轻人的第一个增删改查_修改 SSM整合_年 ...
- selenium模块无头化浏览器 设置不加载页面css、图片、js
下面代码基于火狐浏览器,谷歌浏览器代码类似 from selenium import webdriver from selenium.webdriver.firefox.options import ...
- 组合式应用新利器?SaaS新时代事件网格如何解决集成标准化问题
摘要:组合式应用需要面临的一个难题是如何解决各个应用之间的集成标准问题,比如应用可能仅支持HTTP.TCP等协议中的一种,而缺乏统一的通讯标准就给业务落地该架构带来了困难.下面介绍事件网格(Event ...