Pytorch框架学习笔记-数据处理-菜鸟进阶艰难之路

python学习笔记

    • @[TOC](python学习笔记)
  • 笔记
    • 1.解决的是Matplotlib 绘图时可能出现的中文字符和负号 乱码的问题
    • 2.dataset.values---- 从DataFrame类型转换为Numpy数组
    • 3.使用 Matplotlib 库中的 plot 函数,绘制了一个散点图。
    • 4.if __name__ == "__main__": 用于判断当前脚本是否作为主程序直接运行
    • 5.
  • 总结
    • 以上暂时是我总结的笔记,后续会继续更新


笔记

在学习python的numpy,pandas,matplotlib,sklearn,pytorch,opencv等第三方库时,代码有很多需要理解的地方,故写下此笔记来帮助自己学习,并有助于以后回顾。这可能是比较笨且慢的办法,但对我是有效的。


1.解决的是Matplotlib 绘图时可能出现的中文字符和负号 乱码的问题

mpl.rcParams[u'font.sans-serif'] = ['SimHei']**设置绘图时所使用的字体为宋体**(SimHei)。
mpl.rcParams['axes.unicode_minus'] = False**解决负号显示为方块的问题**

2.dataset.values---- 从DataFrame类型转换为Numpy数组

file_path = "../datasets/Freestyle100m.csv"
dataset = pd.read_csv(file_path)
dataset_tensor = torch.tensor(dataset.values)  # 转换为tensor
x = dataset_tensor[:, :-1]
y = dataset_tensor[:, -1] 

如果你的代码文件位于与数据集文件相同的目录下,只需使用一个点即可表示当前目录。例如:

file_path = "./datasets/Freestyle100m.csv"

如果你的代码文件位于数据集文件的上一级目录下,则可以使用两个点来表示上级目录。例如:

file_path = "../datasets/Freestyle100m.csv"

3.使用 Matplotlib 库中的 plot 函数,绘制了一个散点图。

其中,x 和 y 是两个张量,通过调用 numpy() 方法将它们转换为了 NumPy 数组,以便能够在 Matplotlib 中进行绘图。
具体来说,plot 函数的参数如下:
x:横坐标数据,可以是 NumPy 数组、Python 列表、Pandas Series 对象或其他可迭代对象。
y:纵坐标数据,与 x 对应,必须具有相同的长度。
‘o’:指定绘图所使用的符号类型,这里使用的是散点符号。可以根据需要更改为其他符号类型,例如折线符号 ‘-’ 或者曲线符号 ‘.’ 等等。

plt.plot(x.numpy(),y.numpy(),'o')

4.if name == “main”: 用于判断当前脚本是否作为主程序直接运行

def main():
    # 主要逻辑代码

if __name__ == "__main__":
    main()

5.

import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'

import torch
from matplotlib import pyplot as plt
import pandas as pd
import matplotlib as mpl

# 防止plt汉字乱码
mpl.rcParams[u'font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False


def main():
    # 加载奥运会数据
    file_path = "../datasets/Freestyle100m.csv"
    dataset = pd.read_csv(file_path)
    dataset_tensor = torch.tensor(dataset.values)  # 转换为tensor
    x = dataset_tensor[:, :-1]
    y = dataset_tensor[:, -1]

    # 绘图
    plt.plot(x.numpy(), y.numpy(), 'o')
    plt.xlabel('奥运会(年)')  #设置标签
    plt.ylabel('取胜时间(秒)')
    plt.show()   

if __name__ == "__main__":
    main()
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
import torch
from matplotlib import pyplot as plt
import pandas as pd
import matplotlib as mpl

mpl.rcParams[u'font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

def model(x,w,b):
    return w*x+b

#损失函数
def loss_fn(y_pred,y):
    loss = (y_pred - y)**2
    return loss.mean()

#损失函数求导
def grad_loss_fn(y_pred,y):
    return (y_pred - y) * 2

#梯度函数
def grad_fn(x,y,y_pred):
    grad_w = grad_loss_fn(y_pred,y)*x
    grad_b = grad_loss_fn(y_pred,y)
    return torch.stack([grad_w.mean(),grad_b.mean()])

def model_training(x,y,n_epoches,learning_rate,params,print_params = True):
    for epoch in range(1,n_epoches+1):
        w, b = params

        #前向传播
        y_pred = model(x,w,b)

        #计算损失
        loss = loss_fn(y_pred,y)

        #梯度
        grad = grad_fn(x,y,y_pred)

        #更新参数
        params = params - learning_rate * grad

        if epoch == 1 or epoch % 500 == 1:
            print("轮次:%d,\t损失:%f"%(epoch,float(loss)))
            if print_params:
                print(f"参数:{params.detach().numpy()}")
                print(f"梯度:{grad.detach().numpy()}")
    return params

def main():
    file_path = "../datasets/Freestyle100m.csv"
    dataset = pd.read_csv(file_path)
    dataset_tensor = torch.tensor(dataset.values)
    xx = dataset_tensor[:,0]
    y = dataset_tensor[:,-1]

    x = xx - xx[0]

    w = torch.zeros(1)
    b = torch.zeros(1)

    y_pred = model(x,w,b)
    print("未优化模型的预测结果:",y_pred.detach().numpy())

    loss = loss_fn(y_pred,y)
    print("未优化模型的损失:",loss.detach().numpy())

    params = model_training(
        x = x,
        y = y,
        n_epoches = 50000,
        learning_rate = 0.00017,
        params = torch.tensor([0.0,0.0])
    )
    print("梯度下降找到的w和b:%f %f\n"%(params[0],params[1]))

    y_pred = model(x,*params)
    print(f"优化后的模型预测结果:{y_pred.detach().numpy()}\n")

    #绘图
    plt.plot(xx.numpy(),y_pred.detach().numpy(),label="模型")
    plt.plot(xx.numpy(),y.numpy(),'o',label = "数据")
    plt.xlabel("奥运会(年)")
    plt.ylabel("取胜时间(秒")
    plt.legend()
    plt.show()


if __name__ == "__main__":
    main()

总结

以上暂时是我总结的笔记,后续会继续更新

你可能感兴趣的:(pytorch,学习,笔记)