#题目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())

更多推荐