当前位置:网站首页>Tensorflow2.0 自定义训练的方式求解函数系数

Tensorflow2.0 自定义训练的方式求解函数系数

2022-07-06 11:32:00 赫凯

做曲线拟合逼近的时候,如果知道拟合的大致方程,如何求出方程的系数呢?
其实在numpy中已经有函数去求多项式系数了,如下

# x和y对应的就是坐标轴上x和y。
z = np.polyfit(x, y, 3) #用3次多项式拟合,输出系数从高到0
# p就是所求方程
p = np.poly1d(z) #使用次数合成多项式

但是有时候曲线不只是多项式,而是指数函数、幂函数,这就需要我们自己写了,其实就和之前求线性函数的系数一样,只不过换了一个方程式

# 这里定义自变量和因变量x,y。
x = tf.constant([1, 2, 3, 4, 5, 6],dtype=tf.float64)
y = tf.constant([11, 23, 45, 46, 48, 59],dtype=tf.float64)

# 这里定义反传时需要更新的参数,也就是我们要求的参数
w_a = tf.Variable(-0.0, dtype=tf.float64,name='a')
w_b = tf.Variable(0.1, dtype=tf.float64,name='b')
w_c = tf.Variable(-0.0, dtype=tf.float64,name='c')
w_d = tf.Variable(2.1, dtype=tf.float64,name='d')
# 把我们的系数放在一个数组里,方便后面反传
variables=[w_a, w_b, w_c, w_d]

# 定义循环次数
epoch = 1000
# 定义优化器
optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3)

# 循环
for e in range(epoch):
    with tf.GradientTape() as tape:
        # 预测函数
        y_pred=w_a*tf.exp(w_b*x)+w_c*x+w_d
        # 损失函数
        loss=tf.reduce_sum(tf.square(y_pred-y))
        
    # 对变量求导
    grads=tape.gradient(loss, variables)
    # 调整参数
    optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
    
    # 打印结果
    if e%100==0:
            print(f"step: {
      e}, loss: {
      loss}, a: {
      w_a.numpy()}, b: {
      w_b.numpy()}, c: {
      w_c.numpy()}, d: {
      w_d.numpy()}")
# 输出参数
print(variables)

就酱

原网站

版权声明
本文为[赫凯]所创,转载请带上原文链接,感谢
https://hekai.blog.csdn.net/article/details/125593480