机器学习就是从数据中提取信息。所以你可能想知道,我们可以从合成数据中学到什么?虽然我们本质上可能并不关心我们自己融入人工数据生成模型的模式,但此类数据集仍然可用于教学目的,帮助我们评估学习算法的属性并确认我们的实现是否按预期工作。例如,如果我们创建的数据的正确参数是先验已知的,那么我们可以验证我们的模型实际上可以恢复它们。
No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
3.3.1. 生成数据集
对于这个例子,我们将使用低维来简洁。以下代码片段生成 1000 个示例,这些示例具有从标准正态分布中提取的二维特征。生成的设计矩阵X属于R1000×2. 我们通过应用地面真值线性函数生成每个标签,通过加性噪声破坏它们ϵ,为每个示例独立且相同地绘制:
为了方便起见,我们假设ϵ取自均值为正态分布μ=0和标准差 σ=0.01. 请注意,对于面向对象的设计,我们将代码添加到__init__
子类的方法中d2l.DataModule
(在3.2.3 节中介绍)。允许设置任何额外的超参数是一种很好的做法。我们用 save_hyperparameters()
. batch_size
稍后将确定。
class SyntheticRegressionData(d2l.DataModule): #@save
"""Synthetic data for linear regression."""
def __init__(self, w, b, noise=0.01, num_train=1000, num_val=1000,
batch_size=32):
super().__init__()
self.save_hyperparameters()
n = num_train + num_val
self.X = torch.randn(n, len(w))
noise = torch.randn(n, 1) * noise
self.y = torch.matmul(self.X, w.reshape((-1, 1))) + b + noise
class SyntheticRegressionData(d2l.DataModule): #@save
"""Synthetic data for linear regression."""
def __init__(self, w, b, noise=0.01, num_train=1000, num_val=1000,
batch_size=32):
super().__init__()
self.save_hyperparameters()
n = num_train + num_val
self.X = np.random.randn(n, len(w))
noise = np.random.randn(n, 1) * noise
self.y = np.dot(self.X, w.reshape((-1, 1))) + b + noise
class SyntheticRegressionData(d2l.DataModule): #@save
"""Synthetic data for linear regression."""
def __init__(self, w, b, noise=0.01, num_train=1000, num_val=1000,
batch_size=32):
super().__init__()
self.save_hyperparameters()
n = num_train + num_val
key = jax.random.PRNGKey(0)
key1, key2 = jax.random.split(key)
self.X = jax.random.normal(key1, (n, w.shape[0]))
noise = jax.random.normal(key2, (n, 1)) * noise
self.y = jnp.matmul(self.X, w.reshape((-1, 1))) + b + noise
class SyntheticRegressionData(d2l.DataModule): #@save
"""Synthetic data for linear regression."""
def __init__(self, w, b, noise=0.01, num_train=1000, num_val=1000,
batch_size=32):
super().__init__()
self.save_hyperparameters()
n = num_train + num_val
self.X = tf.random.normal((n, w.shape[0]))
noise = tf.random.normal((n, 1)) * noise
self.y = tf.matmul(self.X, tf.reshape(w, (-1, 1))) + b + noise
下面,我们将真实参数设置为w=[2,−3.4]⊤ 和b=4.2. 稍后,我们可以根据这些真实值检查我们估计的参数。
每行由features
一个向量组成R2 每一行labels
都是一个标量。让我们看一下第一个条目。