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)
通过数据迭代器指定batch_size。
is_train表示是否希望数据迭代器对象在每个迭代周期内打乱数据
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)
首先定义模型变量net,它是一个Sequential类的实例。 Sequential类将多个层串联在一起。 当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。 这里的线性回归其实只有一个层,先熟悉一下sequential的用法。
#keras是TensorFlow的高级API
net = tf.keras.Sequential() #定义sequential类
net.add(tf.keras.layers.Dense(1)) #添加层
在Keras中,全连接层(fully-connected layer),全连接层的每个输入都会经过矩阵乘法变成一个输出,其在Dense类中定义。
全连接层的本质就是由一个特征空间线性变换到另一个特征空间。因此,dense层的目的是将前面提取的特征,在dense经过非线性变化,提取这些特征之间的关联,最后映射到输出空间上。
由于我们只想得到一个标量输出,所以我们将该数字设置为1。Keras不要求为每个层指定输入形状。 第一次通过模型传递数据时,例如,运行net(X)时, Keras会自动推断每个层输入的形状。
units: #正整数,输出空间维度(神经元个数)。
activation: #激活函数 (详见 activations)。 若不指定,则不使用激活函数。
use_bias: #布尔值,该层是否使用偏置向量。
kernel_initializer: #kernel 权值矩阵的初始化器 (详见 initializers)。
bias_initializer: #偏置向量的初始化器 (see initializers).
kernel_regularizer: #运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。
bias_regularizer: #运用到偏置向的的正则化函数 (详见 regularizer)。
activity_regularizer: #运用到层的输出的正则化函数 (它的 “activation”)。 (详见 regularizer)。
kernel_constraint: #运用到 kernel 权值矩阵的约束函数 (详见 constraints)。
bias_constraint: #运用到偏置向量的约束函数 (详见 constraints)。 引用自此文章
Sequential 模型的第一层,需要指定输入维度input_shape
张量[1,2,3]的shape是(3,),input_dim = 1
二阶的张量[[1,2,3],[4,5,6]]的shape是(2,3),input_dim = 2
三阶的张量[[[1],[2],[3]],[[4],[5],[6]]]的shape是(2,3,1),input_dim = 3 引用自此文章
initializers模块提供了多种模型参数初始化方法。
在创建层时指定kernel_initializer。
重新创建net。
initializer = tf.initializers.RandomNormal(stddev=0.01)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1, kernel_initializer=initializer))
model.add(Dense(64,
kernel_initializer='random_uniform',
bias_initializer='zeros'))
keras.initializers.Initializer() #所有初始化器继承这个类
keras.initializers.Zeros() #将张量初始值设为 0 的初始化器。
keras.initializers.Ones() #将张量初始值设为 1 的初始化器。
keras.initializers.Constant(value=0) #将张量初始值设为一个常数的初始化器。
keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
第一次尝试通过网络传递数据时才会进行真正的初始化。此时,因为参数还没有初始化,所以不能访问或操作它们。
loss = tf.keras.losses.MeanSquaredError()
均方误差MeanSquaredErroo()返回所有样本损失的平均值。
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}')
学习、摘抄于动手学深度学习。