代码部分
import numpy as np
import tensorflow as tf
from d2l import tensorflow as d2l
生成数据集
true_w = tf.constant([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
读取数据集(调用框架中现有的API来读取数据)
def load_array(data_arrays, batch_size, is_train=True): #@save
"""构造一个TensorFlow数据迭代器"""
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, labels), batch_size)
这里我们使用iter构造Python迭代器,并使用next从迭代器中获取第一项。
next(iter(data_iter))
定义模型
# keras是TensorFlow的高级API
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))
定义损失函数
loss = tf.keras.losses.MeanSquaredError()
定义优化算法
trainer = tf.keras.optimizers.SGD(learning_rate=0.03)
训练
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), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
效果评估
w = net.get_weights()[0]
print('w的估计误差:', true_w - tf.reshape(w, true_w.shape))
b = net.get_weights()[1]
print('b的估计误差:', true_b - b)
小结
- 我们可以使用TensorFlow的高级API更简洁地实现模型。
- 在TensorFlow中,
data
模块提供了数据处理工具,keras
模块定义了大量神经网络层和常见损耗函数。 - TensorFlow的
initializers
模块提供了多种模型参数初始化方法。 - 维度和存储可以自动推断,但注意不要在初始化参数之前尝试访问参数。