这一个就是把昨天写的一些函数用API代替实现,不需要自己去写,比较简洁,实现的功能跟1一样,都是实现一个简单的线性回归网络
import random
import tensorflow as tf
def Data(w, b, num):
X = tf.zeros((num, w.shape[0]))
X = 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)
y = tf.reshape(y, (-1, 1))
return X, y
true_w = tf.constant([2, -3.4])
true_b = 4.2
data, labels = Data(true_w, true_b, 1000)
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((data, labels), batch_size)
initializer = tf.initializers.RandomNormal(stddev=0.01)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1, kernel_initializer=initializer))
loss = tf.keras.losses.MeanSquaredError()
trainer = tf.keras.optimizers.SGD(learning_rate=0.03)
num_epochs = 10
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(data), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
![在这里插入图片描述](https://img-blog.csdnimg.cn/20728c6b8959424496a3f41452bcf4f5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWDE5OTZf,size_20,color_FFFFFF,t_70,g_se,x_16)