初学者的 TensorFlow 2.0 教程 代码详解,链接地址如下:
初学者的 TensorFlow 2.0 教程 | TensorFlow Core
一、搭建python环境
配置环境这里不详细说了。简单说下几个步骤:
1:安装anaconda
2:anaconda创建环境假如名字叫(env38),并且在env38上安装配置
安装一些基本开发库conda install numpy / pip install tensorflow / install PIL
3: 安装pycharm
4:要求设备联网,这个demo没有显卡要求
二、新建工程设置interpret
新建工程名假设命名为tensorflow
pycharm的菜单 file-->setting--> project:tensorflow-->Python Interpreter
设置刚刚的哪个env38
三、测试环境是否ok
直接新建python文件然后输入print("hello tensorflow") 然后运行测试
四、初学者的 TensorFlow 2.0 教程
初学者的 TensorFlow 2.0 教程 | TensorFlow Corehttps://tensorflow.google.cn/tutorials/quickstart/beginner
4.1 代码分析
首先:下面第一个代码部分 导入库,导入的时候可以根据PyCharm提示安装tensorflow的库
import tensorflow as tf
第二部分提到的MNIST数据集,首先有个链接可以进入MNIST数据集的官网。这里就不详细说明数据集的来源和用途了。
mnist = tf.keras.datasets.mnist
上面这行代码,没什么实际用途,是因为后面这个名字太长了。使用一个短一点的名字而已。没实际作用。模块的名字重命名为mnist,为了书写方便
(x_train, y_train), (x_test, y_test) = mnist.load_data()
上面这行代码是从MNIST中加载数据集,首先我也是后来才知道,数据集的数据是著名的手写体数据,这个后面会详细解释。
由上面调试信息可以知道一些内容:
1:x_train的类型是{ndarray: (60000,28,28)} y_train的类型是{ ndarray:{60000,} }
2: x_test的类型是{ndarray: (10000,28,28)} y_test的类型是{ ndarray:{10000,} }
详细解释: ndarray是数组。y_train和y_test是数组,即手写体图片对应的数字。
x_train和x_test也是数组,x_train数组成员数有6万个。其中每个成员是28*28的矩阵组成。
直接得到的信息:
1:x_train的数组成员数量和y_train的数组成员数量一样多。都是60000,x是图片数据,y是真实数据。两个一起称之为训练数据。
2:x_test的数组成员数和ytest也是一样多,都是10000,x表示图片矩阵数据,y表示数值
在这里两个称之为测试数据。
3:图片中的数据取值范围是0-255, y_train和y_test中的取值范围是0-9
分析得到的信息:
1: 输入的训练数据都非常整齐,这一点在后面也可以看到。都是28*28像素的图片,并且每个手写体都给出了真实的值。
2:训练数据数量一般远远大于y中值的真实数量。手写体一共10个,然而训练数据给了6万个。
3:训练数据数量一般比测试数据量大。
4:训练数据的维度和测试数据的维度一致,都是28*28的图片矩阵数据。
4.2 x_tran到底是什么?
我们刚刚说x_train是数组,数组的成员是28*28的图片数据矩阵。
这样说不够直观,不太方便理解到底是什么东西。
我们导入下面两个库来作为辅助查看x_tran到底是什么数据。我们能收到什么启发?
import numpy as np from PIL import Image
for i in range(0,len(x_train)):
data = np.reshape(x_train[i], (28, 28))
newpic = Image.fromarray(data)
newpic.save(r"E:\AIdata\x_train" + r"\xtrain_" + str(i) + "__" + str(y_train[i]) + ".png")
return
我写了个简单的测试代码如上。基本功能就是将x_train中的图片数据保存到本地png图片。
np.reshape:从名字上看是重新构造图形:将数组从新构造成28*28的二维矩阵数据。
data就是28*28的矩阵数据
Image.fromarray(data): 从名字上来看从矩阵转换为图像数据。
newpic =就是一个new picture 然后保存到本地,保存的时候。字符串中指明了png类型。
因为6万个数据量太大。实际上打印出几百个就可以知道是什么样的图片了。
数据图片如下:
启发:
1:x_train 确实是图像数据,并且每个图片都是28*28像素的图像
2:可以知道手写体的实际值,即y_train的值。
数据的来源,我们先不研究,数据的来源有几大问题,
1: 数据量,2:正确性,3:是否已经删除了一些模糊的数据,甚至于之前是否有字母的数据混合?4:全部转换为28*28的图像数据,5:黑白图像。黑底白字(无噪音),
6:几乎每个图片中的数字都是居中的。
4.2.2 数据可视化2:
前提:
import numpy as np from PIL import Image
xnew = x_train[0:100]
t = []
for i in range(0, 10):
t.append(np.hstack(xnew[i*10:i*10+10]))
t = np.vstack(t)
newpic = Image.fromarray(t)
newpic.save(r"E:\a.png")
打印出前100个手写图片。上面实际代码
4.3 图像数据归一化
x_train, x_test = x_train / 255.0, x_test / 255.0
上面一行代码其实理解为: x_train = x_train / (255.0 - 0)
注意的是:因为图片数据中最大值是255,最小值是0 所以是除以最大值和最小值的差
后面有个.0 是为了得出0-1之间的小数。
矩阵除以某个常数,代表是矩阵中每一个值都除以这个常数。然后返回新的矩阵。
4.4 顺序模型构造
首先使用的是keras的顺序模型。关于顺序模型这里需要注意几个地方。
顺序模型的api文档
The Sequential modelhttps://www.tensorflow.org/guide/keras/sequential_model?hl=zh-cnA
Sequential
model is appropriate for a plain stack of layers where each layer has exactly one input tensor and one output tensor.
百度翻译是这样的:
序列模型适用于层的普通堆栈,其中每个层正好有一个输入张量和一个输出张量。
我认为应该翻译为:
顺序模型适用于一堆简单的层的组合,其中每个层都只包含一个输入张量和一个输出张量
根据官方文档说明,
A Sequential model is not appropriate when:
- Your model has multiple inputs or multiple outputs
- Any of your layers has multiple inputs or multiple outputs
- You need to do layer sharing
- You want non-linear topology (e.g. a residual connection, a multi-branch model)
译文:
顺序模型不适用于下列几个场景
1:你的模型具有多输入或者多输出
2:你的模型中任意一层包含多输入或者多输出
3:你需要做图层共享。(这个后面再讲)
4:你想用非线性的技术(例如,残差连接,多分支模型等)
4.4 顺序模型参数
1:构造函数中可以添加每一层到
后面更新,在跟着一个外文网站教程学