1.导包
import tensorflow as tf
2.构造数据y=W*x+b
def synthetic_data(w,b,num_examples):
X=tf.zeros((num_examples,w.shape[0]))
X+=tf.random.normal(shape=X.shape)
y=tf.matmul(X,tf.reshape(w,(-1,1)))+b
y+=tf.random.normal(shape=y.shape,stddev=0.01)
#print(y.shape)
y=tf.reshape(y,(-1,1))
#print(y.shape)
return X,y
true_w=tf.constant([2,-3.4])
true_b=4.2
features,lables=synthetic_data(true_w,true_b,1000)
3.构造一个tensorflow数据迭代器
def load_array(data_arrays,batch_size,is_train=True):
dataset=tf.data.Dataset.from_tensor_slices(data_arrays)
if is_train:
dataset=dataset.shuffle(buffer_size=1000)
dataset=dataset.batch(batch_size)
return dataset
batch_size=10
data_iter=load_array((features,lables),batch_size)
next(iter(data_iter))
4.设置线性网络
为了方便使用,Keras不要求我们为每个层指定输入形状。 所以在这里,我们不需要告诉Keras有多少输入进入这一层。 当我们第一次尝试通过我们的模型传递数据时,例如,当后面执行net(X)时, Keras会自动推断每个层输入的形状。
net=tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1))
initializer=tf.initializers.RandomNormal(stddev=0.01)
net=tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1,kernel_initializer=initializer))
5.设置均方误差
loss=tf.keras.losses.MeanSquaredError()
6.定义梯度下降
trainer=tf.keras.optimizers.SGD(learning_rate=0.03)
7.训练
num_epochs=3
for epoch in range(num_epochs):
for X,y in data_iter:
with tf.GradientTape() as tape:
l=loss(net(X,training=True),y)
grads=tape.gradient(l,net.trainable_variables)
trainer.apply_gradients(zip(grads,net.trainable_variables))
l=loss(net(features),lables)
print(f'epoch {epoch+1},loss {l:f}')
8.预测值与真实值之间误差
w=net.get_weights()[0]
print(w.shape)
print(true_w.shape)
print(true_w-tf.reshape(w,true_w.shape))
b=net.get_weights()[1]
print(true_b-b)