InvalidArgumentError Traceback most recent call lastCell In27 line 15 11 for i in rangeiter + 1 13 with tfGradientTape as tape--- 15 PRED_train = tfmatmulX_tra
该代码使用 TensorFlow 实现了线性回归模型,其中出现了一个维度不匹配的错误。
具体来说,代码中的每一行意义如下:
- 导入 TensorFlow 模块
- 导入 numpy 模块
- 定义超参数
- 生成随机数据
- 定义模型参数 W 和 b
- 定义模型函数
- 定义损失函数
- 定义优化器
- 计算初始损失
- 开始训练模型
- 设置迭代次数
- 循环迭代
- 使用 TensorFlow 的 GradientTape 记录梯度信息
- 计算训练集预测值
- 计算训练集损失
- 计算测试集预测值
- 计算测试集损失
- 计算梯度
- 更新模型参数
- 打印训练过程中的损失值
在第 14 行代码中,使用了 tf.matmul() 函数计算训练集预测值,此处出现了维度不匹配的错误,具体原因是 X_train 和 W 的维度不匹配。
X_train 的维度为 [424, 10],W 的维度为 [10, 10],tf.matmul() 函数要求两个矩阵的最后一维相等,但是这里的最后一维分别是 10 和 10,不相等,因此出现了维度不匹配的错误。
要解决这个问题,可以将 W 的维度改为 [10, 1],这样 X_train 和 W 的最后一维就相等了,可以进行矩阵乘法运算。
修改后的代码如下:
import tensorflow as tf
import numpy as np
# 超参数
learning_rate = 0.01
iter = 1000
# 生成随机数据
X_train = np.random.randn(424, 10)
Y_train = np.random.randn(424, 1)
X_test = np.random.randn(106, 10)
Y_test = np.random.randn(106, 1)
# 模型参数
W = tf.Variable(tf.random.normal([10, 1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")
# 模型函数
def linear_regression(X):
return tf.matmul(X, W) + b
# 损失函数
def mean_square(y_pred, y_true):
return tf.reduce_mean(tf.square(y_pred - y_true))
# 优化器
optimizer = tf.optimizers.SGD(learning_rate)
# 初始损失
PRED_train = linear_regression(X_train)
Loss_train = mean_square(PRED_train, Y_train)
print("Initial loss: {:.3f}".format(Loss_train))
# 训练模型
for i in range(iter + 1):
with tf.GradientTape() as tape:
PRED_train = linear_regression(X_train)
Loss_train = mean_square(PRED_train, Y_train)
PRED_test = linear_regression(X_test)
Loss_test = mean_square(PRED_test, Y_test)
# 计算梯度
gradients = tape.gradient(Loss_train, [W, b])
# 更新模型参数
optimizer.apply_gradients(zip(gradients, [W, b]))
if i % 100 == 0:
print("Iter {:03d}: Train loss: {:.3f}, Test loss: {:.3f}".format(i, Loss_train, Loss_test))
``
原文地址: http://www.cveoy.top/t/topic/hrKc 著作权归作者所有。请勿转载和采集!