建站公司maxsem競(jìng)價(jià)托管多少錢
在 TensorFlow 2.0 及之后的版本中,默認(rèn)采用?Eager Execution 的方式,不再使用 1.0 版本的 Session 創(chuàng)建會(huì)話。Eager Execution 使用更自然地方式組織代碼,無需構(gòu)建計(jì)算圖,可以立即進(jìn)行數(shù)學(xué)計(jì)算,簡(jiǎn)化了代碼調(diào)試的過程。本文主要介紹 TensorFlow 的基本用法,通過構(gòu)建一個(gè)簡(jiǎn)單損失函數(shù),介紹 TensorFlow 優(yōu)化損失函數(shù)的過程。
目錄
1 tf.Tensor
2 tf.Variable
3 tf.GradientTape
TensorFlow 是一個(gè)用于機(jī)器學(xué)習(xí)的端到端平臺(tái)。它支持以下內(nèi)容:
- 基于多維數(shù)組的數(shù)值計(jì)算(類似于 NumPy)
- GPU 和分布式處理
- 自動(dòng)微分
- 模型構(gòu)建、訓(xùn)練和導(dǎo)出
1 tf.Tensor
????????TensorFlow 用 tf.Tensor 對(duì)象處理多維數(shù)組(或張量),以下是一個(gè) 2 維張量例子:
import tensorflow as tf
x = tf.constant([[1., 2., 3.],[4., 5., 6.]])
print(x)
tf.Tensor(
[[1. 2. 3.]
?[4. 5. 6.]], shape=(2, 3), dtype=float32)
tf.Tensor 對(duì)象最重要的屬性是 shape 與 dtype:
- Tensor.shape? 返回張量每個(gè)維度的大小
- Tensor.dtype? ?返回張量中元素的數(shù)據(jù)類型
print(x.shape)
(2, 3)
print(x.dtype)
<dtype: 'float32'>
????????TensorFlow 實(shí)現(xiàn)了張量的標(biāo)準(zhǔn)數(shù)學(xué)運(yùn)算,同時(shí)也包括為機(jī)器學(xué)習(xí)定制的運(yùn)算。以下是一些示例:
x + x
5 * x
tf.transpose(x)
tf.nn.softmax(x, axis=-1)
tf.reduce_sum(x)
2 tf.Variable
????????在 TensorFlow 中,模型的權(quán)重用 tf.Variable 對(duì)象存儲(chǔ),稱為變量。
import tensorflow as tfx = tf.Variable([0., 0., 0.])
x.assign([1, 2, 3])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32,?
numpy=array([1., 2., 3.], dtype=float32)>
????????tf.Variable 對(duì)象的數(shù)值可以改變,在 TensorFlow 2.0 中,不再使用 Session 啟動(dòng)計(jì)算,變量可以直接算出結(jié)果。
x.assign_add([1, 1, 1,])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32,?
numpy=array([2., 3., 4.], dtype=float32)>
x.assign_sub([1, 1, 1])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32,?
numpy=array([1., 2., 3.], dtype=float32)>
3 tf.GradientTape
????????梯度下降法與相關(guān)算法是現(xiàn)在機(jī)器學(xué)習(xí)的基礎(chǔ)。TensorFLow 實(shí)現(xiàn)了自動(dòng)微分來計(jì)算梯度,通常用于計(jì)算機(jī)器學(xué)習(xí)模型的損失函數(shù)的梯度。
? ? ? ? TensorFlow 2.0 提供了 tf.GradientTape 對(duì)象,可以理解為“梯度流”,顧名思義,tf.GradientTape 是用來計(jì)算梯度用的。
????????以下是一個(gè)簡(jiǎn)單的示例:
import tensorflow as tfdef f(x):return x**2 + 2*x - 5x = tf.Variable(1.0)with tf.GradientTape() as tape:y = f(x)
g_x = tape.gradient(y, x) # 計(jì)算 y 在 x = 1.0 處的梯度
print(g_x)
4.0
最后,構(gòu)建一個(gè)簡(jiǎn)單損失函數(shù),并使用 TensorFlow 計(jì)算最小值。
import tensorflow as tfdef loss(x):return x**2 - 10*x + 25x = tf.Variable(1.0) # 隨機(jī)初始值losses = [] # 記錄損失函數(shù)值
for i in range(100):with tf.GradientTape() as tape:one_loss = loss(x)lossed.append(one_loss)grad = tape.gradient(one_loss, x)x.assign_sub(0.1 * grad) # 執(zhí)行一次梯度下降法print("The mininum of loss function is: ")
tf.print(x)
The mininum of loss function is:?
4.99999905
# 可視化優(yōu)化過程
import matplotlib
from matplotlib import pyplot as pltmatplotlib.rcParams['figure.figsize'] = [8, 5]plt.figure()
plt.plot(losses)
plt.title('Loss vs training iterations')
plt.xlabel('iterations')
plt.ylabel('loss')