如標(biāo)題,tf2相較tf1.x在api上有比較大的變動(dòng),1.x的很多api都在2.0中移除。
本文使用tf2.0的api實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)性回歸算法。
import tensorflow as tf
print(tf.__version__)
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(199346745)
# 產(chǎn)生測(cè)試數(shù)據(jù)
w_known = [1.4, 0.4, -0.4, .3, -1.9]
DIM = len(w_known)
N = 1000
BATCH = 300
x = np.random.random((N, DIM))
# default DIM=5
y_ = sum(w_known[i]*x[:,i] for i in range(len(w_known)))
err = 0.01*np.random.normal(size=N)
y = (y_ + err).reshape((N, 1))
# 查看測(cè)試數(shù)據(jù)分布
plt.hist(err, 30)
plt.show()
plt.hist(y.reshape(1000), 30)
plt.show()
# 得益于tf2.0的動(dòng)態(tài)圖特性,可以在函數(shù)中直接循環(huán)訓(xùn)練
def lr(x, y, BATCH=None, niter=1000):
if BATCH is None:
BATCH = N
losses = []
w = tf.Variable(tf.random.normal(shape=(DIM, 1), mean=0))
for i in range(niter):
randidx = np.random.choice(N, size=BATCH)
x2, y2 = (tf.constant(x[randidx], dtype='float32'),
tf.constant(y[randidx], dtype='float32'))
loss = lambda: tf.losses.MeanSquaredError()(tf.matmul(x2, w), y2)
opt = tf.keras.optimizers.SGD(1e-1)
opt.minimize(loss, var_list=[w])
losses.append(loss().numpy())
return w, losses
w, losses = lr(x, y, 300)
# 查看loss的變化
plt.plot(losses)
plt.show()
# 查看w和設(shè)定的w的距離
tf.losses.MeanSquaredError()(w, tf.reshape(tf.constant(w_known),(5,1)))