如何使用tensorflow实现坐标下降?

2024-04-20 09:24:48 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,对于一个简单的线性模型y=wx+b,其中xy分别是输入和输出,wb是训练参数,我想知道,在每个时代,我如何首先更新b,然后更新w


Tags: 模型参数线性wx时代
2条回答

不太可能。TF的backprop基于向前prop时其他变量的值计算所有变量的梯度。如果你想在训练w和b之间交替,你将解冻w和冻结b(设置为trainable=False)、前进道具和后退道具,然后冻结w和解冻b,以及前进道具和后退道具。我不认为这会运行得很快,因为TF并不是真正设计为在每个小批量上切换可训练标志

Tensorflow可能不是最好的工具。您只需使用python就可以做到这一点

如果需要使用更复杂的函数进行回归scikit-learn可能是更合适的库

无论使用哪种工具,都可以执行Batch Gradient Descent or Stochastic Gradient Descent

但是首先你需要定义一个“成本函数”,这个函数基本上告诉你离真实值有多远,例如最小均方误差(LMS),这类函数从你的模型和真实值中获取预测值,并对训练参数进行调整

这是BGD或SGD在培训过程中优化的功能

这是一个我用来理解正在发生的事情的例子,它不是最佳解决方案,但它会让你了解正在发生的事情

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")

alpha = 0.00005
thetas = np.array([1.,1.])

def h(thetas, x):
    #print(f'theta 0: {thetas[0]}')
    #print(f'theta 1: {thetas[1]}')
    #print(f'h=m:{thetas[0] + (thetas[1]*x[1])}')
    return thetas[0] + (thetas[1]*x[1])

for i in zip(tips.total_bill, tips.tip):
    x = np.array([1, i[0]])
    y = i[1]
    for index, theta in enumerate(thetas):
        #print(f'theta in: {thetas[index]}')
        #print(f'error: {thetas[index] + alpha*(y - h(thetas, x))*x[index]}')
        thetas[index] = thetas[index] + alpha*(y - h(thetas, x))*x[index]
        #print(f'theta out: {thetas[index]}')
    #print(thetas)
print(thetas)
xplot = np.linspace(min(tips.total_bill), max(tips.total_bill), 100, endpoint=True)
xp = [[1,x] for x in xplot]
yp = [h(thetas, xi) for xi in xp]

plt.scatter(tips.total_bill,tips.tip)
plt.plot(xplot, yp, 'o', color= 'orange')
plt.show()

相关问题 更多 >