Tensorflow1版本复现代码记录---tensorflow使用tf.gradients()计算梯度值

u_xx = tf.gradients(u_x, x)[0] / self.sigma_x

在复现论文pinn求解pde方程组的解时,遇到这样一巨代码,代码基于tensorflow1版本,许多地方与2版本不一样,1版本写得更详细,但是代码也更长。为了理解每行代码,尝试使用2版本复现,但是可参考的较少,每个人不理解的地方不太一样。希望记录下来,有需求时自查。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()  # 将TensorFlow 1.x和2.x之间所有不同的全局行为切换为预定的1.x行为

t= tf.Variable(2.0,name='t')
x = tf.Variable(1.0,name='x')

z1 = 3 * t + 2 * x
grads1 = tf.gradients(z1, t)[0]
grads1_test=tf.gradients(z1,t)
grads21=tf.gradients(z1,[t,x])
grads21_test=tf.gradients(z1,[t,x])[0]
grads22_test=tf.gradients(z1,[t,x])[1]

with tf.Session() as sess:
    print(sess.run(grads1)) # 输出列表的第一个数值3.0
    print(sess.run(grads1_test)) # 输出列表[3.0]
    print(sess.run(grads21)) # 输出列表 [3.0, 2.0]
    print(sess.run(grads21_test)) # 输出列表的第一个数值3.0
    print(sess.run(grads22_test)) # # 输出列表的第二个数值2.0

中1版本要想打印输出tensorflow的数值形式,需要使用with tf.Session() as sess:结构

尝试发现,将tensorflow转成数值形式时,输出结果默认是列表,需要使用索引[0],[1]等,取出对应位置的梯度值,才能参与后续代码的计算。

参照`lienar_regression-tf2.0.ipynb`中的例子,你可以通过以下步骤使用TensorFlow 2.0进行线性回归并采用梯度下降法: 1. **导入所需的库**:开始时,你需要导入必要的库,包括`tensorflow`、`numpy`和可能的数据读取库(例如`pandas`)。 ```python import tensorflow as tf import numpy as np import pandas as pd ``` 2. **数据准备**:从`train.txt`和`test.txt`中加载数据,可能需要先解析成二维数组。假设数据是CSV格式,每行代表一个样本,第一列是自变量,最后一列是因变量。 ```python data = pd.read_csv('train.txt', delimiter=' ', header=None) X_train = data.iloc[:, :-1].values y_train = data.iloc[:, -1:].values ``` 3. **初始化参数**:创建模型的权重(theta)和偏置(bias),以及学习率(learning_rate)。 ```python n_features = X_train.shape[1] theta = tf.Variable(tf.random.normal([n_features, 1])) bias = tf.Variable(tf.zeros(1)) learning_rate = 0.01 ``` 4. **构建模型和损失函数**:使用线性回归模型,计算预测和均方误差(MSE)。 ```python def linear_model(x): return tf.add(tf.matmul(x, theta), bias) mse = lambda y_true, y_pred: tf.reduce_mean(tf.square(y_true - y_pred)) ``` 5. **梯度下降优化**:在每个训练迭代中,计算梯度并更新参数。 ```python @tf.function def train_step(): with tf.GradientTape() as tape: y_pred = linear_model(X_train) loss = mse(y_train, y_pred) gradients = tape.gradient(loss, [theta, bias]) theta.assign_sub(learning_rate * gradients[0]) bias.assign_sub(learning_rate * gradients[1]) ``` 6. **训练循环**:多次运行`train_step()`函数,直到达到预定的迭代次数或满足收敛条件。 7. **评估**:训练完成后,使用测试集对模型进行评估,计算测试集的标准差。 ```python # 加载测试数据 data_test = pd.read_csv('test.txt', delimiter=' ', header=None) X_test = data_test.iloc[:, :-1].values y_test = data_test.iloc[:, -1:].values # 测试集预测和标准差计算 y_pred_test = linear_model(X_test) std_dev = np.std(y_test - y_pred_test, axis=0) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值