pytorch 基础 迪哥

Github链接:https://github.com/tangyudi/Ai-learn (包括全部课程资料与学习路线图)

该课程共16章所有代码和数据集

1-basic-operate

1.basic.py

# author : 'wangzhong';
# date: 03/12/2020 20:41

import torch
import numpy as np

# 创建一个未初始化矩阵
empty = torch.empty(5, 3)
# 创建一个空矩阵
zeros = torch.zeros(5, 4)
# 创建指定范围整形矩阵
randInt = torch.randint(1, 10, (5, 4))
# 创建随机矩阵
rand = torch.rand(5, 4)
# 转为tensor类型
x = torch.tensor([5, 5, 3])
# 转为1矩阵
x = x.new_ones((5, 3))
# 生成形状形同,均值为0,方差为1的标准正态分布随机数
x = torch.randn_like(x, dtype=torch.float)
print(x)
# 查看维度
print(x.size())
# 同numpy的reshape
print(x.view(15))
# 从torch转为numpy,内存共享,改变一个,另一个同时改变
a = torch.ones(5, 3)
b = a.numpy()
b[0][0] = 100
print(a)
# 从numpy转为torch,内存共享,改变一个,另一个同时改变
a = np.ones((5, 3))
b = torch.from_numpy(a)
b[0][0] = 100
print(a)
# 查看gpu版是否安装成功
print(torch.cuda.is_available())

2.autoGrad.py

# date: 09/12/2020 02:41

import torch

# 简单的torch自动求导尝试,这里的t = x + b
x = torch.randn(3, 4, requires_grad=True)
# print(x)
b = torch.randn(3, 4, requires_grad=True)
# print(b)
t = x + b
# print(t)
y = t.sum()
# print(y)
y.backward()
# print(x.grad)

x = torch.rand(1)
b = torch.rand(1, requires_grad=True)
w = torch.rand(1, requires_grad=True)
y = w * x
z = y + b
w2 = torch.rand(1, requires_grad=True)
b2 = torch.rand(1, requires_grad=True)
res = w2*z + b2
# 判断是否是leaf节点,显然这个最简单的公式里,y不是
print(y.is_leaf)

# retain_graph=True:保留z-y-x的计算图
z.backward(retain_graph=True)
print(w.grad)
# 非叶子节点,grad直接省略
# 如果需要非叶子节点的grad,需要这个函数
y.retain_grad()
print(y.grad)

res.backward()
print(w2.grad)
print(b2.grad)
print(w.grad)

3.lineardemo.py

# date: 13/12/2020 13:56

"""
基于pytorch的线性回归demo练习
"""
import numpy as np
import torch
import torch.nn as nn


# 继承nn.module,实现前向传播,线性回归即是全连接层
class LinearRegressionModel(nn.Module):
    def __init__(self, input_dim, output_dim):
        super().__init__()
        self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        out = self.linear(x)
        return out


if __name__ == '__main__':
    # torch里要求必须是float
    x = np.arange(1, 12, dtype=np.float32).reshape(-1, 1)
    y = 2 * x + 1

    model = LinearRegressionModel(1, 1)
    # 可以通过to()或者cuda()使用GPU进行模型的训练,需要将模型和数据都转换到GPU上,也可以指定具体的GPU,如.cuda(1)
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model.to(device)
    epochs = 1000
    learning_rate = 0.01
    # 优化迭代
    optimizer = torch.optim.SGD(model.parameters(), learning_rate)
    # 评估指标,均方误差
    criterion = nn.MSELoss()

    for epoch in range(epochs):
        inputs = torch.from_numpy(x).to(device)
        labels = torch.from_numpy(y).to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        # 进行权重更新
        optimizer.step()

        if epoch % 50 == 0:
            print("epoch:", epoch, "loss:", loss.item())

    predict = model(torch.from_numpy(x).requires_grad_()).data.numpy()
    # torch.save(model.state_dict(), "model.pk1")
    result = model.load_state_dict(torch.load("model.pk1"))

model.pkl地址: https://github.com/PlayPurEo/ML-and-DL/blob/master/pytorch/1-basic-operate/model.pk1

4.tensorPractice.py

# author : 'wangzhong';
# date: 22/12/2020 20:06

"""
练习下常见的tensor格式
"""
from torch import tensor

# 这是一个标量,就是一个值
scalar = tensor(55)
# 正常的数值操作
scalar *= 2
# 0维
print(scalar.dim())
# 可以查看矩阵的维度,如torch.size([2,3,4])代表三维,且每个维度的大小分别是2,3,4
print(scalar.shape)
# -------------------------------------------

v = tensor([1, 2, 3])
# 一维向量
print(v.dim())
# size方法和属性shape一样
print(v.size())
# -------------------------------------------

matrix = tensor([[1, 2, 3], [4, 5, 6]])
# 二维向量
print(matrix.dim())
print(matrix.shape)

# 矩阵乘法
print(matrix.matmul(matrix.T))
# (2,3) * (3,) = (2,)
print(matrix.matmul(tensor([1, 2, 3])))
# (2,) * (2, 3) = (3,)
print(tensor([1, 2]).matmul(matrix))
# 对应位置相乘
print(matrix * matrix)

请添加图片描述

2-regression-practice

temperature.py

# date: 04/01/2021 15:56
"""
pytorch基础气温预测项目
"""

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
from sklearn import preprocessing
import datetime

# 通过python console查看维度
features = pd.read_csv('temps.csv')

# 看看数据长什么样子
# print(features.head())

# 对字符串特征做独热编码
features = pd.get_dummies(features)
print(features.head())

# 标签
labels = np.array(features['actual'])

# 在特征中去掉标签
features = features.drop('actual', axis=1)

# 名字单独保存一下,以备后患
feature_list = list(features.columns)
# 特征标准化处理
input_features = preprocessing.StandardScaler().fit_transform(features)
# 转为tensor格式
x = torch.tensor(input_features, dtype=torch.float)
y = torch.tensor(labels, dtype=torch.float)

# 权重参数初始化,一层hidden layer
weights = torch.randn((14, 128), dtype=torch.float, requires_grad=True)
biases = torch.randn(128, dtype=torch.float, requires_grad=True)
weights2 = torch.randn((128, 1), dtype=torch.float, requires_grad=True)
biases2 = torch.randn(1, dtype=torch.float, requires_grad=True)

learning_rate = 0.001
losses = []

# 简单的手写梯度下降
# for i in range(1000):
#     # 计算隐层,mm为矩阵乘法
#     hidden = x.mm(weights) + biases
#     # 加入激活函数
#     hidden = torch.relu(hidden)
#     # 预测结果
#     predictions = hidden.mm(weights2) + biases2
#     # 代价函数为均方误差
#     loss = torch.mean((predictions - y) ** 2)
#     losses.append(loss.data.numpy())
#
#     # 打印损失值
#     if i % 100 == 0:
#         print('loss:', loss)
#     # 返向传播计算
#     loss.backward()
#
#     # 更新参数
#     weights.data.add_(- learning_rate * weights.grad.data)
#     biases.data.add_(- learning_rate * biases.grad.data)
#     weights2.data.add_(- learning_rate * weights2.grad.data)
#     biases2.data.add_(- learning_rate * biases2.grad.data)
#
#     # 每次迭代都得记得清空
#     weights.grad.data.zero_()
#     biases.grad.data.zero_()
#     weights2.grad.data.zero_()
#     biases2.grad.data.zero_()

# 更简单的,全部用torch内置函数完成的模型训练
input_size = input_features.shape[1]
hidden_size = 128
output_size = 1
batch_size = 16
my_nn = torch.nn.Sequential(
    torch.nn.Linear(input_size, hidden_size),
    torch.nn.Sigmoid(),
    torch.nn.Linear(hidden_size, output_size),
)
cost = torch.nn.MSELoss(reduction='mean')
optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001)

for i in range(1000):
    batch_loss = []
    # MINI-Batch方法来进行训练
    for start in range(0, len(input_features), batch_size):
        end = start + batch_size if start + batch_size < len(input_features) else len(input_features)
        xx = torch.tensor(input_features[start:end], dtype=torch.float, requires_grad=True)
        yy = torch.tensor(labels[start:end], dtype=torch.float, requires_grad=True)
        prediction = my_nn(xx)
        # 降为一维,否则loss会告警
        prediction = prediction.squeeze(-1)
        loss = cost(prediction, yy)
        optimizer.zero_grad()
        loss.backward(retain_graph=True)
        optimizer.step()
        batch_loss.append(loss.data.numpy())

    # 打印损失
    if i % 100 == 0:
        losses.append(np.mean(batch_loss))
        print(i, np.mean(batch_loss))

predict = my_nn(x).data.numpy()


# 分别得到年,月,日
years = features['year']
months = features['month']
days = features['day']
# 转换日期格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]

# 创建一个表格来存日期和其对应的标签数值
true_data = pd.DataFrame(data={'date': dates, 'actual': labels})
predictions_data = pd.DataFrame(data={'date': dates, 'prediction': predict.reshape(-1)})

# 真实值
plt.plot(true_data['date'], true_data['actual'], 'b-', label='actual')

# 预测值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label='prediction')
plt.xticks(rotation='60')
plt.legend()

# 图名
plt.xlabel('Date')
plt.ylabel('Maximum Temperature (F)')
plt.title('Actual and Predicted Values')
plt.show()

懒得复制了。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值