目录
前言
一、针对新手的damo
二、进阶demo
2.1 model.py
2.2 train.py
2.2.1 准备输入数据
2.2.2 搭建模型
2.2.3 定义损失函数及优化器
2.2.4 传参计算model()
2.3 运行结果
同样的,对于新框架的学习直接看官网!!
TensorFlow Core不论您是机器学习新手还是专家,都可使用完整的端到端示例了解如何使用 TensorFlow。请试用 Google Colab 中的教程 - 无需进行任何初始设置。https://tensorflow.google.cn/tutorials?hl=zh_cn官网提供的是Jupyter 笔记本格式的教程,能够一段一段的边看边运行,可惜Jupyter服务器在国外,所以国内没法运行。那就直接看好了。
初学者的 TensorFlow 2.0 教程 | TensorFlow Corehttps://tensorflow.google.cn/tutorials/quickstart/beginner?hl=zh_cn1. 下载并安装 TensorFlow 2.0 测试版包。将 TensorFlow 载入你的程序:
# 安装 TensorFlow
import tensorflow as tf
2. 载入并准备好 Keras自带的MNIST 数据集。将样本从整数转换为浮点数:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
3. 将模型的各层堆叠起来,以搭建 tf.keras.Sequential
模型。为训练选择优化器和损失函数:
model = tf.keras.models.Sequential([ # 定义模型网络结构
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', # 定义模型优化器
loss='sparse_categorical_crossentropy', # 定义模型loss函数
metrics=['accuracy']) # 定义模型的指标
4. 训练并验证模型:
model.fit(x_train, y_train, epochs=5) # 5轮
model.evaluate(x_test, y_test, verbose=2)
5. 训练结果
现在,这个照片分类器的准确度已经达到 98%。
针对专业人员的 TensorFlow 2.0 入门 | TensorFlow Corehttps://tensorflow.google.cn/tutorials/quickstart/advanced?hl=zh_cn2.2 tensorflow2官方demo_哔哩哔哩_bilibiliTensorflow2官方demo,手写数字的识别https://www.bilibili.com/video/BV1n7411T7o6?spm_id_from=333.999.0.01. 注意在TensorFlow中,tensor的通道排序和pytorch有所不同。
1)TensorFlow tensor: [batch, height, width, channel]
2)Pytorch tensor: [batch,channel, height, width]
2. 这个demo分为model.py和train.py两个脚本。
3.使用mnist数据集,是一个识别人手写的数据集。
1. 模型的搭建风格
使用Model Subclassing API,类似于pytorch的一种风格。
2. 先看一下import
我们自己构造的MyModel继承了keras的Model类
搭建网络用的Dense、Flatten、Conv2D函数来自keras的layers类
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Model
3. 搭建
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
self.conv1 = Conv2D(32, 3, activation='relu') # 卷积层
self.flatten = Flatten() # 展平
self.d1 = Dense(128, activation='relu') # 全连接层
self.d2 = Dense(10) # 全连接层
# 定义网络正向传播的过程
def call(self, x):
x = self.conv1(x) # input[batch,28,28,1] ouput[batch,26,26,32]
x = self.flatten(x) # output[batch,21632]
x = self.d1(x) # output[batch,128]
return self.d2(x) # output[batch,10]
1)super函数:避免多继承带来的问题
2)Conv2D函数,我们来看一下它的参数
这里要注意padding的使用方式和pytorch不同。padding参数由两种值“valid”和“same”。默认“valid”。valid表示不需要补0,same表示需要补0.。输出图片大小的计算公式如下:
3)Faltten函数:展平。因为要和后面的全连接层进行连接,所以要展成一维向量的形式。
4)Dense函数的参数,比较重要的就是前两个参数 。还有一点需要注意,最后一个全连接层的节点数等于我们的分类数。因为mnist数据集的分类数是10,所以,规定最后一个全连接层的节点数为10。并且最后一个全连接层跟着的激活函数为“softmax”,最终softmax给出的就是属于每个类别的概率分布了。
5)和pytorch的另一个区别:上面用到的Conv2D、Dense、Faltten函数的参数中没有指定input是什么。因为TensorFlow会自动进行推理,这也是TensorFlow的强大之处。
6)再来看张量在这个网络中的变化情况。首先,输入进去的图片大小是28×28×1的,经过卷积层后,用上面的padding公式去计算,输出是26×26×32(通道数32是我们指定的)的;然后经过展平操作,batch数不变,图片变成1维向量,26×26×32=21632个值;输入到结点个数为128的全连接层,得到128个值的一维向量;最后,输入到结点个数为10的全连接层,得到10个值的一维向量。
模型的搭建步骤遵循这篇博客:【Tensorflow1.0 和 Tensorflow2.0】—— 区别_玛丽莲茼蒿的博客-CSDN博客一、搭建深度学习模型的区别(背过!!!)对于Tensorflow1.0,step 01 :准备输入数据step 02:定义输入PlaceHolderstep 03:搭建模型step 04:定义损失函数及优化器step 05:初始化所有变量step 06:创建会话sessionstep 07:传参计算session.run()对于Tensorflow 2.0,...https://blog.csdn.net/qq_44886213/article/details/123721940?spm=1001.2014.3001.5502
1. 导入输入模块和数据集
一共有60000张灰度图。
import tensorflow as tf
from model import MyModel
# ketas自带的数据集
mnist = tf.keras.datasets.mnist
# 下载数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
默认下载到了C盘用户文件夹下的.keras目录下。
2. 加入通道数这一维度
# Add a channels dimension
x_train = x_train[..., tf.newaxis].astype("float32")
x_test = x_test[..., tf.newaxis].astype("float32")
从mnist导入的数据集是28×28的灰度图,通过下图加断点的方式可以看到:
增加一个维度后,我们再通过加断点的方式来查看一下,数据集变成了28×28×1的格式
3. 构造数据生成器
构造训练集和测试集的数据生成器:
train_ds = tf.data.Dataset.from_tensor_slices(
(x_train, y_train)).shuffle(10000).batch(32)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
1)调用TensorFlow的from_tensor_slices函数:把数据x_train和标签y_train合并为元祖的方式作为输入。
2)shuffle函数:每次从硬盘中导入10000张图片到内存(训练集一共有60000张),进行随机洗牌打乱顺序,保证数据的随机性。理论上来说,括号内的取值越接近训练集的总数越贴近随机采样(越好),但是内存不允许。
3)batch函数:32张图作为一个batch。
实例化一个我们的模型
# Create an instance of the model
model = MyModel()
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.Adam()
1. 定义历史平均loss和历史平均精确率。
他们在 每个epoch上累计值,然后打印出一个epoch累计的结果。便于一轮一轮地观察训练情况。
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
2. 训练模型函数
@tf.function
def train_step(images, labels):
with tf.GradientTape() as tape:
# training=True is only needed if there are layers with different
# behavior during training versus inference (e.g. Dropout).
predictions = model(images, training=True)
loss = loss_object(labels, predictions) # 一张图的loss
# 得到误差梯度(将loss反向传播到model.trainable_variables模型每一个可训练的参数中
gradients = tape.gradient(loss, model.trainable_variables)
# 使用误差梯度更新模型参数
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss) # 历史平均loss,全局变量(再次进入函数后在上一次结果的基础上变)
train_accuracy(labels, predictions) # 历史平均准确率
1)tf.GradientTape:与pytorch不同,pytorch会自动跟踪每一个训练参数的误差梯度,而TensorFlow不会。 在这里使用tf.GradientTape函数去记,返回tape。
2)tape.gradient函数:将loss反向传播到模型每一个可训练的参数中(model.trainable_variables),最终得到误差梯度
3)优化器Adam的apply_gradients函数:将误差梯度和模型的所有可训练参数用Zip函数打包成元祖,作为函数的输入。使用误差梯度更新模型参数。
4)最后两行是用来计算历史平均loss和历史平均准确率。根据后面将要讲的“清零”代码,可以看出,计算的是一个epoch的历史平均loss和历史平均准确率。
5)tf.function修饰器:用来将修饰的函数转化成图结构,那么以后这个函数内就不能加断点了,但是会大大提升训练的效率。
3. 测试模型函数
@tf.function
def test_step(images, labels):
# training=False is only needed if there are layers with different
# behavior during training versus inference (e.g. Dropout).
predictions = model(images, training=False)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)
4. 开始跑训练及测试
EPOCHS = 5
for epoch in range(EPOCHS):
# Reset the metrics at the start of the next epoch
train_loss.reset_states()
train_accuracy.reset_states()
test_loss.reset_states()
test_accuracy.reset_states()
# 从训练数据生成器中取数据,训练
for images, labels in train_ds:
train_step(images, labels)
for test_images, test_labels in test_ds:
test_step(test_images, test_labels)
print(
f'Epoch {epoch + 1}, '
f'Loss: {train_loss.result()}, '
f'Accuracy: {train_accuracy.result() * 100}, '
f'Test Loss: {test_loss.result()}, '
f'Test Accuracy: {test_accuracy.result() * 100}'
)
1)reset_states函数:每一轮都把tf.keras.metrics(训练loss、训练准确率、测试loss、测试准确率)清零。这样才不影响下一轮的训练。
2)result函数:获取tf.keras.metrics(训练loss、训练准确率、测试loss、测试准确率)的结果
Epoch 1, Loss: 0.13267311453819275, Accuracy: 96.02333068847656, Test Loss: 0.061965566128492355, Test Accuracy: 98.06999969482422
Epoch 2, Loss: 0.042059458792209625, Accuracy: 98.72000122070312, Test Loss: 0.048135414719581604, Test Accuracy: 98.3499984741211
Epoch 3, Loss: 0.023382706567645073, Accuracy: 99.24333190917969, Test Loss: 0.05048979073762894, Test Accuracy: 98.3499984741211
Epoch 4, Loss: 0.01350458711385727, Accuracy: 99.57333374023438, Test Loss: 0.0620846264064312, Test Accuracy: 98.25
Epoch 5, Loss: 0.009131859056651592, Accuracy: 99.69999694824219, Test Loss: 0.06238056719303131, Test Accuracy: 98.33999633789062