机器学习入门作业及注释
·
#题目3:批量线性模型
import numpy as np
X = np.array([[1, 2], [2, 3], [3, 4]])
W = np.array([[2, 1]])
b = np.array([0.5])
#因为W的权重矩阵无法适应三个样本(1,2)的shape,所以要转置
Y = X@W.T + b
print("所有样本的输出:", Y)
#题目7:拟合直线 y = 2x + 1
import tensorflow as tf
import numpy as np
# 生成数据
sample_num = 50
x = np.linspace(-1, 1, 50)
y_true = 2 * x + 1 + np.random.randn(*x.shape) * 0.2
# 定义模型参数
#初始化变量为标量
w = tf.Variable(0.0)
b = tf.Variable(0.0)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1)
# 训练
for epoch in range(100):
with tf.GradientTape() as tape:
y_pred = w * x + b
loss = tf.reduce_mean((y_pred - y_true)**2)
# 2. 反向传播:计算损失对 w 和 b 的梯度
gradients = tape.gradient(loss, [w, b])
# 3. 参数更新:使用优化器应用梯度
# 将梯度 (gradients) 和对应的变量 ([w, b]) 打包成 (梯度, 变量) 对
optimizer.apply_gradients(zip(gradients, [w, b]))
# optimizer.apply_gradients([...])
print("拟合结果:w =", w.numpy(), ", b =", b.numpy())
import tensorflow as tf
import numpy as np
# 生成样本
X_np = np.random.rand(100, 2)
# === 关键修正 1: 将 NumPy 数据 X 转换为 tf.float32 的 Tensor ===
X = tf.constant(X_np, dtype=tf.float32)
#X_np[:,0]是所有行第0列
y_true_np = 4 * X_np[:, 0] + 3 * X_np[:, 1] + np.random.randn(100) * 0.1
# === 关键修正 2: 将 y_true 也转换为 tf.float32 的 Tensor ===
y_true = tf.constant(y_true_np, dtype=tf.float32)
# W 和 b 默认为 tf.float32,无需修改
W = tf.Variable(tf.random.normal([2, 1]))
#创建一个两行一列的标准正态分布变量
#创建一个只包含一个0的一维tensor
b = tf.Variable(tf.zeros([1]))
#调用我们学过的随机梯度下降算法和学习率
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1)
# ... (后续训练代码,并修正了变量名错误:w -> W, gradients -> grads)
for epoch in range(200):
with tf.GradientTape() as tape:
# X (float32) @ W (float32) 现在可以正常计算
#这里是一个矩阵乘法(在这一步,就把估计的表达式传进去了
y_pred = tf.matmul(X, W) + b
# 使用 tf.squeeze() 替代[:, 0] 是更规范的做法
#tf.squeeze()是把矩阵展开为n行一列的一维向量
#reduce_mean是指将原始数据降维并返回均值
loss = tf.reduce_mean((tf.squeeze(y_pred) - y_true) ** 2)
#向着最小化loss的方向,对W和b计算梯度
grads = tape.gradient(loss, [W, b])
#根据梯度迈一步
optimizer.apply_gradients(zip(grads, [W, b]))
#.flatten把多维数组展平为一维数组..numpy()把tf转换成numpy对象
print("训练结果:W =", W.numpy().flatten(), "b =", b.numpy())
更多推荐
所有评论(0)