?简介
?????? 一元线性回归是机器学习算法中最简单、直观的算法,对于学习深度学习,虽然简单但必学,是学习深度学习的 “hello word”,本节通过Libtorch来实现这个算法,所参考的Pytorch例子为书上的案例。至于一些基本的理论知识在博客中不会提到。一是因为网上有许多大佬的帖子或博客写的很好。二是本人目的想通过C++实现深度学习(目前主要是复现pytorch案例),兴趣于此。所以基本上都是直接给代码。希望能给大家带来一点参考的价值。
1.神经网络的创建:
class LinearRegression : public torch::nn::Module
{
public:
//线性回归网络层,即网络构造函数
LinearRegression() {
linear = register_module("linear", torch::nn::Linear(torch::nn::LinearOptions(1, 1)));
}
// 向前传播,即平差中的误差方程的构建
torch::Tensor forward(torch::Tensor x) {
x = linear(x);
return x;
}
private:
torch::nn::Linear linear{ nullptr };
};
2.训练数据的创建
Y与X符合下面的公式,b带有偶然误差。
//创建数据
torch::Tensor x = torch::unsqueeze(torch::linspace(0, 19, 20), 1);
auto y = 5 * x + torch::randint(1, 20,x.sizes());
3.训练,模型的生成
// 新建模型、误差函数、优化器
auto model = std::make_shared<LinearRegression>();
torch::optim::SGD optimizer(model->parameters(), 0.001);
torch::nn::MSELoss criterion;
//开始训练
int num_epoches = 10;
for (int i = 0; i < num_epoches; i++)
{
auto out = model->forward(x);
auto loss = criterion(out, y);
optimizer.zero_grad();
loss.backward();
optimizer.step();
std::cout << "Epche: " << i + 1 << "/" << num_epoches << "\tloss: " << loss.item<float>() << std::endl;
if ((i + 1) % 2 == 0)
{
QVector<torch::Tensor > Ys;
Ys.append(out);
Ys.append(y);
QString winTile = "Epche: " + QString::number(i + 1) + "\tloss: " + QString::number(loss.item<float>());
drawChart(x, Ys,winTile);
}
}
4.拟合结果(打印的loss与拟合线)
?总结: 上面只给出了模型的创建与训练生成,至于模型的保存与使用方法在上一篇博客已经给出。另外画拟合线的工具仍然用的Qt的QCustomplot库,上文中我自己写的drawChart()函数如果有需要的可以通过下面链接自己下载,虽然是一个画图函数,但里面也包括了tensor与其他类型变量的转换。下一篇写Libtorch之多项式拟合.......。
《使用QCustomplot画拟合线代码》
?
|