【动手学深度学习】线性回归简洁实现

线性回归简洁实现

    • 生成数据集
    • 读取数据集
    • 定义模型
        • keras中dense的API解释:
    • 初始化模型参数
        • keras中的initializer
    • 定义损失函数
    • 定义优化算法
    • 训练



生成数据集

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会自动推断每个层输入的形状。


keras中dense的API解释:

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

  • input_shape是指输入张量的shape
  • input_dim是指的张量的维度

张量[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))

keras中的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)
  • mean: 一个 Python 标量或者一个标量张量。要生成的随机值的平均数。
  • stddev: 一个 Python 标量或者一个标量张量。要生成的随机值的标准差。
  • seed: 一个 Python 整数。用于设置随机数种子。

第一次尝试通过网络传递数据时才会进行真正的初始化。此时,因为参数还没有初始化,所以不能访问或操作它们。

定义损失函数

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}')

学习、摘抄于动手学深度学习。

你可能感兴趣的:(线性回归,tensorflow,深度学习)