TensorFlow線形回帰
環境:TensorFlow2.0
事前知識
テンソル
データを表現するためにテンソル(テンソル)を用いTensorFlow、高価なビッグに名前が、実際には、多次元配列として理解することができます。
import tensorflow as tf # 每次使用TensorFlow的第一件事
A = tf.constant([1, 2, 3]) # constant是表示A是一个常量
B = tf.constant([[1,2],[3,4]])
ここでは、一次元テンソルA 2つのテンソルを定義する、Bは、二次元テンソルです。私たちは、印刷を見ます
>>> A # 形状是(3,)是一个3有个元素的向量
<tf.Tensor: id=0, shape=(3,), dtype=int32, numpy=array([1, 2, 3])>
>>> B # 形状是(2, 2)一个2*2矩阵
<tf.Tensor: id=1, shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
[3, 4]])> # 两者都是int32类型,可以通过numpy()方法来得到它们的值
テンソル操作
tf.add(tensor_A, tensor_B) # 矩阵元素相加
tf.subtract(tensor_A, tensor_B) # 矩阵元素相减
tf.multiply(tensor_A, tensor_B) # 矩阵元素相乘
tf.divide(tensor_A, tensor_B) # 矩阵元素相除
tf.matmul(tensor_A, tensor_B) # 矩阵乘法
tf.pow(tensor_A, num) # 矩阵元素幂运算
上記の、また他の数学記号を加えて使用することができ、この行列乗算は、要素が動作マトリックスに+-*/和**
代わり。
テンソル操作は背後にその経験を繰り返し、ブロードキャスト・メカニズムが存在します。
自動導出
マシン(奥行き)学習フレームワーク、自動導出機構として、最終的に、私たちはコードを見て
x = tf.Variable(initial_value=1.) # tf.Variable表示这是一个变量,里面的initial参数将其初始值设为1
with tf.GradientTape() as tape: # GradientTape:梯度带,在with中的所有过程将会被记录
y = x**2+7*x+1 # 也就是你的函数放在这里就行,甚至可以分好几步写
dy_dx = tape.gradient(y,x) # 求with过程中y关于x的梯度
print(dy_dx) # tf.Tensor(9.0, shape=(), dtype=float32)
直線回帰
まず、私たちは本当の機能を得るためにガウスノイズを追加することにより、データ、データラベルを生成しました。
次に、勾配を計算するために、Xは、Y TFフォーマットを変換する必要があります。
変数wが定義され、オフセットBは、初期値は0に設定されています。
# 构造数据,方程y=2x+1
x_data = np.linspace(0, 1, 200).reshape((-1,1))
y_data = 2*x_data+1 + np.random.normal(0,0.02, x_data.shape)
X = tf.constant(x_data, dtype=tf.float32)
y = tf.constant(y_data, dtype=tf.float32)
w = tf.Variable(0.)
b = tf.Variable(0.)
勾配を有する勾配は、オプティマイザが自動的にモデル及びbパラメータwを更新し、自動的に計算します
epoches = 1000
# 优化器,设置学习率为0.001
optimizer = tf.keras.optimizers.SGD(learning_rate=0.001)
for _ in range(epoches):
with tf.GradientTape() as tape:
y_pred = X*w+b
loss = 0.5*tf.reduce_sum((y_pred-y)**2)
grads = tape.gradient(loss, [w,b])
# 通过apply_gradients来最小化损失函数,参数是梯度,变量对(grad, variable)
optimizer.apply_gradients(grads_and_vars=zip(grads, [w, b]))
真のパラメータに非常に近い私たちの印刷パラメータ、
>>> print(w.numpy(), b.numpy())
1.9974449 1.003515
遂に
当社の線形回帰を使用すると、より直感的に確認したい場合は、描かれた離散点とフィッティング関数をプロットするために使用することができ、完了です。
import matplotlib.pyplot as plt
y_pred = X*w+b
plt.figure()
plt.scatter(x_data, y_data)
plt.plot(x_data, y_pred, "r", lw=2)
plt.show()