欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人工智能 > pytorch >内容正文

pytorch

深度学习-Tensorflow2.2-Eager模式与自定义训练{4}-微分运算训练练习-16

发布时间:2024/9/15 pytorch 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 深度学习-Tensorflow2.2-Eager模式与自定义训练{4}-微分运算训练练习-16 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Eager模式简介

Tensorflow 发布了新的 TF 2.0 Beta 版本我们可以通过以下命令安装:pip install tensorflow==2.0.0-beta1

TensorFlow的eager模式是一个命令式编程环境,它使得我们可以立即评估操作产生的结果,而无需构建计 算图。

Eager模式极大的方便我们使用TensorFlow、调试模型,增加了网络调试的灵活程度和tensorflow对于初学者友好性。

在这里我们可以叫它 tensorflow的交互模式。

与Tensorflow 1.x版本不同,tensorflow 2.0 默认使用 eager 模式。
执行tf.executing_eagerly() 返回 True

Eager模式提供了一个灵活的研究和实验机器学习平台,提供直观的界面 - 自然地构建代码并使用Python数据结构。快速迭代小型模型和小型数据。

更容易调试 -在交互式环境中直接检查、运行模型、测试变化。这个过程中代码会即时错误报告。

自然控制流 - eager模式下使用Python控制流而不是图控制流,简化了动态模型的创建。

Eager模式支持大多数TensorFlow操作和GPU加速。

eager模式下,TensorFlow操作会立即执行并将其值返回给Python。

tf.Tensor对象引用具体值而不是计算图中节点的符号句柄。

Eager模式运行特点

由于在会话中没有构建和运行的计算图,因此使用print()语句或调试器很容易检查结果、评估输出,打印和检查张量值,而不影响计算梯度的过程。

Eager模式下Tensorflow可与NumPy很好地协作。

TensorFlow 数学运算可将Python对象和NumPy数组转换为tf.Tensor对象。

而 tf.Tensor.numpy方法将对象的值作NumPy返回ndarray。

Eager模式中梯度的计算

在Eager模式中,使用tf.GradientTape跟踪计算梯度的操作

由于在每次执行可能发生不同的操作,所有前向传递操作都被记录到Tape上。要计算渐变,就往后播放磁带
然后丢弃。

特定的tf.GradientTape只能计算一个梯度; 后续调用会引发运行时错误。

也可以设置可重复调用

张量


自动微分


自定义训练

import tensorflow as tf (train_image,train_labels),_=tf.keras.datasets.mnist.load_data() train_image.shape,train_labels

train_image = tf.expand_dims(train_image,-1)# 扩充维度 train_image.shape

# 改变数据类型 train_image = tf.cast(train_image/255,tf.float32) # 归一化并改变数据类型 train_labels = tf.cast(train_labels,tf.int64) dataset = tf.data.Dataset.from_tensor_slices((train_image,train_labels)) # 建立数据集 dataset

dataset = dataset.shuffle(10000).batch(32) # 对数据进行洗牌 乱序 dataset

# 建立模型 model = tf.keras.Sequential([tf.keras.layers.Conv2D(16,[3,3],activation="relu",input_shape=(28,28,1)),tf.keras.layers.Conv2D(32,[3,3],activation="relu"),tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(10) # 未激活 ]) # 自定义循环(编译) optimizers = tf.keras.optimizers.Adam() # 优化函数 loss_func = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) # 损失函数 features,labels = next (iter(dataset)) features.shape,labels.shape

predictions = model(features) predictions.shape

tf.argmax(predictions,axis=1)

labels

def loss(model,x,y):y_ = model(x)return loos_func(y,y_) def train_step(model,images,labels):with tf.GradientTape() as t:loss_step = loss(model,images,labels)grads = t.gradient(loss_step,model.trainable_variables)optimizers.apply_gradients(zip(grads,model.trainable_variables)) def train():for epoch in range(10):for (batch,(images,labels)) in enumerate(dataset):train_step(model,images,labels)print("epoch{} is finshed".format(epoch)) train()



代码如下:

import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 修改警告级别,不显示警告(train_image,train_labels),_=tf.keras.datasets.mnist.load_data() print(train_image.shape,train_labels) train_image = tf.expand_dims(train_image,-1)# 扩充维度 print(train_image.shape) # 改变数据类型 train_image = tf.cast(train_image/255,tf.float32) # 归一化并改变数据类型 train_labels = tf.cast(train_labels,tf.int64) dataset = tf.data.Dataset.from_tensor_slices((train_image,train_labels)) # 建立数据集 dataset = dataset.shuffle(10000).batch(32) # 对数据进行洗牌 print(dataset) # 建立模型 model = tf.keras.Sequential([tf.keras.layers.Conv2D(16,[3,3],activation="relu",input_shape=(28,28,1)),tf.keras.layers.Conv2D(32,[3,3],activation="relu"),tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(10) # 未激活 ]) # 自定义循环(编译) optimizers = tf.keras.optimizers.Adam() # 优化函数 loss_func = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) # 损失函数 features,labels = next (iter(dataset)) print(features.shape,labels.shape) predictions = model(features) print(predictions.shape) tf.argmax(predictions,axis=1) print(labels)def loss(model,x,y):y_ = model(x)return loss_func(y,y_)train_loss = tf.keras.metrics.Mean("train_loss") train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy("train_accuracy")def train_step(model,images,labels):with tf.GradientTape() as t:pred = model(images)loss_step = loss_func(labels,pred)grads = t.gradient(loss_step,model.trainable_variables)optimizers.apply_gradients(zip(grads,model.trainable_variables))train_loss(loss_step)train_accuracy(labels,pred) def train():for epoch in range(10):for (batch,(images,labels)) in enumerate(dataset):train_step(model,images,labels)print("epoch{} loss is {},acc is {}".format(epoch,train_loss.result(),train_accuracy.result()))train_loss.reset_states()# 重置状态train_accuracy.reset_states()train()

总结

以上是生活随笔为你收集整理的深度学习-Tensorflow2.2-Eager模式与自定义训练{4}-微分运算训练练习-16的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。