脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

2023-03-21 14:16虚心求知的熊 Python

hub 模块是调用别人训练好的网络架构以及训练好的权重参数,使得自己的一行代码就可以解决问题,方便大家进行调用,这篇文章主要介绍了PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测,需要的朋友可以参考下

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

 

一、强大的 hub 模块

  • hub 模块是调用别人训练好的网络架构以及训练好的权重参数,使得自己的一行代码就可以解决问题,方便大家进行调用。
  • hub 模块的 GITHUB 地址是 https://github.com/pytorch/hub
  • hub 模块的模型 网址是 https://pytorch.org/hub/research-models。

 

1. hub 模块的使用

首先,我们进入网址。会出现如下的界面(这其中就是别人训练好的模型,我们通过一行代码就可以实现调用)。

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

然后,我们随便点开一个模型,会出现如下界面。

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

其中,第一个按钮是对应的 GITHUB 代码,第二个是使用谷歌配置好的实验环境,第三个进行模型演示。

 

2. hub 模块的代码演示

首先,我们进行基本的导入。

?
1
2
3
import torch
model = torch.hub.load('pytorch/vision:v0.4.2', 'deeplabv3_resnet101', pretrained=True)
model.eval()

我们可以使用 hub.list() 查看对应 pytorch 版本的模型信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
torch.hub.list('pytorch/vision:v0.4.2')
#Using cache found in C:UsersAdministrator/.cache orchhubpytorch_vision_v0.4.2
#['alexnet',
# 'deeplabv3_resnet101',
# 'densenet121',
# 'densenet161',
# 'densenet169',
# 'densenet201',
# 'fcn_resnet101',
# 'googlenet',
# 'inception_v3',
# 'mobilenet_v2',
# 'resnet101',
# 'resnet152',
# 'resnet18',
# 'resnet34',
# 'resnet50',
# 'resnext101_32x8d',
# 'resnext50_32x4d',
# 'shufflenet_v2_x0_5',
# 'shufflenet_v2_x1_0',
# 'squeezenet1_0',
# 'squeezenet1_1',
# 'vgg11',
# 'vgg11_bn',
# 'vgg13',
# 'vgg13_bn',
# 'vgg16',
# 'vgg16_bn',
# 'vgg19',
# 'vgg19_bn',
# 'wide_resnet101_2',
# 'wide_resnet50_2']

我们可以从 pytorch 的网站上下载一个实例。

?
1
2
3
4
5
# Download an example image from the pytorch website
import urllib
url, filename = ("https://github.com/pytorch/hub/raw/master/dog.jpg", "dog.jpg")
try: urllib.URLopener().retrieve(url, filename)
except: urllib.request.urlretrieve(url, filename)

我们执行样本,这里需要注意的是 torchvision。

?
1
2
3
4
5
6
7
8
9
10
11
# sample execution (requires torchvision)
from PIL import Image
from torchvision import transforms
input_image = Image.open(filename)
preprocess = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model

我们需要将输入和模型移动到GPU以获得速度(如果可用)。

?
1
2
3
4
5
6
7
8
# move the input and model to GPU for speed if available
if torch.cuda.is_available():
    input_batch = input_batch.to('cuda')
    model.to('cuda')
with torch.no_grad():
    output = model(input_batch)['out'][0]
output_predictions = output.argmax(0)

我们可以创建一个调色板,为每个类选择一种颜色。

?
1
2
3
4
# create a color pallette, selecting a color for each class
palette = torch.tensor([2 ** 25 - 1, 2 ** 15 - 1, 2 ** 21 - 1])
colors = torch.as_tensor([i for i in range(21)])[:, None] * palette
colors = (colors % 255).numpy().astype("uint8")

我们可以使用 hub 模块中的模型绘制每种颜色 21 个类别的语义分割预测。​

?
1
2
3
4
5
6
7
# plot the semantic segmentation predictions of 21 classes in each color
r = Image.fromarray(output_predictions.byte().cpu().numpy()).resize(input_image.size)
r.putpalette(colors)
import matplotlib.pyplot as plt
plt.imshow(r)
plt.show()

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

 

二、搭建神经网络进行气温预测

 

1. 数据信息处理 在最开始,我们需要导入必备的库。

?
1
2
3
4
5
6
7
8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.optim as optim
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline

我们需要观察一下自己的数据都有哪些信息,在此之前,我们需要进行数据的读入,并打印数据的前五行进行观察。

?
1
2
3
4
5
6
7
8
features = pd.read_csv('temps.csv')
features.head()
#year   month   day week    temp_2  temp_1  average actual  friend
#0  2016    1   1   Fri 45  45  45.6    45  29
#1  2016    1   2   Sat 44  45  45.7    44  61
#2  2016    1   3   Sun 45  44  45.8    41  56
#3  2016    1   4   Mon 44  41  45.9    40  53
#4  2016    1   5   Tues    41  40  46.0    44  41
  • 在我们的数据表中,包含如下数据信息:
  • (1) year 表示年数时间信息。
  • (2) month 表示月数时间信息。
  • (3) day 表示天数时间信息。
  • (4) week 表示周数时间信息。
  • (5) temp_2 表示前天的最高温度值。
  • (6) temp_1 表示昨天的最高温度值。
  • (7) average 表示在历史中,每年这一天的平均最高温度值。
  • (8) actual 表示这就是我们的标签值了,当天的真实最高温度。
  • (9) friend 表示这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好了。
  • 在获悉每一个数据的信息之后,我们需要知道一共有多少个数据。

?
1
2
print('数据维度:', features.shape)
#数据维度: (348, 9)
  • (348, 9) 表示一共有 348 天,每一天有 9 个数据特征。
  • 对于这么多的数据,直接进行行和列的操作可能会不太容易,因此,我们可以导入时间数据模块,将其转换为标准的时间信息。
?
1
2
3
4
5
6
7
8
9
10
11
# 处理时间数据
import datetime
# 分别得到年,月,日
years = features['year']
months = features['month']
days = features['day']
# datetime格式
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]

我们可以读取新列 dates 中的部分数据。

?
1
2
3
4
5
6
dates[:5]
#[datetime.datetime(2016, 1, 1, 0, 0),
# datetime.datetime(2016, 1, 2, 0, 0),
# datetime.datetime(2016, 1, 3, 0, 0),
# datetime.datetime(2016, 1, 4, 0, 0),
# datetime.datetime(2016, 1, 5, 0, 0)]

 

2. 数据图画绘制

在基本数据处理完成后,我们就开始图画的绘制,在最开始,需要指定为默认的风格。

?
1
plt.style.use('fivethirtyeight')

设置布局信息。

?
1
2
3
# 设置布局
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize = (10,10))
fig.autofmt_xdate(rotation = 45)

设置标签值信息。

?
1
2
3
#标签值
ax1.plot(dates, features['actual'])
ax1.set_xlabel(''); ax1.set_ylabel('Temperature'); ax1.set_title('Max Temp')

绘制昨天也就是 temp_1 的数据图画。​

?
1
2
3
# 昨天
ax2.plot(dates, features['temp_1'])
ax2.set_xlabel(''); ax2.set_ylabel('Temperature'); ax2.set_title('Previous Max Temp')

绘制前天也就是 temp_2 的数据图画。​

?
1
2
3
# 前天
ax3.plot(dates, features['temp_2'])
ax3.set_xlabel('Date'); ax3.set_ylabel('Temperature'); ax3.set_title('Two Days Prior Max Temp')

绘制朋友也就是 friend 的数据图画。

?
1
2
3
# 我的逗逼朋友
ax4.plot(dates, features['friend'])
ax4.set_xlabel('Date'); ax4.set_ylabel('Temperature'); ax4.set_title('Friend Estimate')

在上述信息设置完成后,开始图画的绘制。

?
1
plt.tight_layout(pad=2)

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

对原始数据中的信息进行编码,这里主要是指周数信息。

?
1
2
3
4
5
6
7
8
9
# 独热编码
features = pd.get_dummies(features)
features.head(5)
#year   month   day temp_2  temp_1  average actual  friend  week_Fri    week_Mon    week_Sat    week_Sun    week_Thurs  week_Tues   week_Wed
#0  2016    1   1   45  45  45.6    45  29  1   0   0   0   0   0   0
#1  2016    1   2   44  45  45.7    44  61  0   0   1   0   0   0   0
#2  2016    1   3   45  44  45.8    41  56  0   0   0   1   0   0   0
#3  2016    1   4   44  41  45.9    40  53  0   1   0   0   0   0   0
#4  2016    1   5   41  40  46.0    44  41  0   0   0   0   0   1   0

在周数信息编码完成后,我们将准确值进行标签操作,在特征数据中去掉标签数据,并将此时数据特征中的标签信息保存一下,并将其转换成合适的格式。

?
1
2
3
4
5
6
7
8
9
10
11
# 标签
labels = np.array(features['actual'])
# 在特征中去掉标签
features= features.drop('actual', axis = 1)
# 名字单独保存一下,以备后患
feature_list = list(features.columns)
# 转换成合适的格式
features = np.array(features)

我们可以查看此时特征数据的具体数量。

?
1
2
features.shape
#(348, 14)
  • (348, 14) 表示我们的特征数据当中一共有 348 个,每一个有 14 个特征。
  • 我们可以查看第一个的具体数据。
?
1
2
3
4
5
6
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)
input_features[0]
#array([ 0.        , -1.5678393 , -1.65682171, -1.48452388, -1.49443549,
#       -1.3470703 , -1.98891668,  2.44131112, -0.40482045, -0.40961596,
#       -0.40482045, -0.40482045, -0.41913682, -0.40482045])

 

3. 构建网络模型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
x = torch.tensor(input_features, dtype = float)
y = torch.tensor(labels, dtype = float)
# 权重参数初始化
weights = torch.randn((14, 128), dtype = float, requires_grad = True)
biases = torch.randn(128, dtype = float, requires_grad = True)
weights2 = torch.randn((128, 1), dtype = float, requires_grad = True)
biases2 = torch.randn(1, dtype = float, requires_grad = True)
learning_rate = 0.001
losses = []
for i in range(1000):
    # 计算隐层
    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_()
#loss: tensor(8347.9924, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(152.3170, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(145.9625, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(143.9453, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(142.8161, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(142.0664, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(141.5386, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(141.1528, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(140.8618, dtype=torch.float64, grad_fn=<MeanBackward0>)
#loss: tensor(140.6318, dtype=torch.float64, grad_fn=<MeanBackward0>)

我们查看预测数据的具体数量,应该是一共有 348 个,每个只有一个值,也就是 (348,1)。

?
1
2
predictions.shape
#torch.Size([348, 1])

 

4. 更简单的构建网络模型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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)
# 训练网络
losses = []
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 = 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))
#0 3950.7627
#100 37.9201
#200 35.654438
#300 35.278366
#400 35.116814
#500 34.986076
#600 34.868954
#700 34.75414
#800 34.637356
#900 34.516705

我们可以得到如下的预测训练结果,将其用图画的形式展现出来。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
x = torch.tensor(input_features, dtype = torch.float)
predict = my_nn(x).data.numpy()
# 转换日期格式
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})
# 同理,再创建一个来存日期和其对应的模型预测值
months = features[:, feature_list.index('month')]
days = features[:, feature_list.index('day')]
years = features[:, feature_list.index('year')]
test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]
predictions_data = pd.DataFrame(data = {'date': test_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');

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

到此这篇关于PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测的文章就介绍到这了,更多相关PyTorch hub神经网络气温预测内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45891612/article/details/129625581

延伸 · 阅读

精彩推荐
  • Pythonpython中defaultdict的用法详解

    python中defaultdict的用法详解

    这篇文章主要为大家详细介绍了python中defaultdict的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    天堂十八楼6182020-11-15
  • Pythonpython基于selenium爬取斗鱼弹幕

    python基于selenium爬取斗鱼弹幕

    这篇文章主要介绍了python如何基于selenium爬取斗鱼弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...

    Martina_oh4982021-09-07
  • Python经验丰富程序员才知道的15种高级Python小技巧(收藏)

    经验丰富程序员才知道的15种高级Python小技巧(收藏)

    本文将介绍15个简洁的Python技巧,向着简洁更高效,学习易懂出发,具说只有经验丰富程序员才知道的15种高级Python小技巧,喜欢的朋友快来看看吧...

    世上本无鬼6862022-02-19
  • Python老生常谈Python序列化和反序列化

    老生常谈Python序列化和反序列化

    下面小编就为大家带来一篇老生常谈Python序列化和反序列化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    脚本之家10952020-11-21
  • Pythonpython保存两位小数的多种方法汇总

    python保存两位小数的多种方法汇总

    很多小伙伴在学习python的时候可能会遇到对数据进行格式化输出的需求,其中最常见的需求为:保留几位小数,下面这篇文章主要给大家介绍了关于python保存两...

    点亮~黑夜5972022-03-10
  • PythonPython中使用gzip模块压缩文件的简单教程

    Python中使用gzip模块压缩文件的简单教程

    这篇文章主要介绍了Python中使用gzip模块压缩文件的简单教程,本文的例子主要针对类UNIXZ系统,需要的朋友可以参考下 ...

    脚本之家11002020-06-01
  • PythonPython实现破解猜数游戏算法示例

    Python实现破解猜数游戏算法示例

    这篇文章主要介绍了Python实现破解猜数游戏算法,简单描述了猜数游戏的原理,并结合具体实例形式分析了Python破解猜数游戏的相关实现技巧,需要的朋友可以...

    糊糊7142020-12-09
  • Pythonpython 实现数组list 添加、修改、删除的方法

    python 实现数组list 添加、修改、删除的方法

    下面小编就为大家分享一篇python 实现数组list 添加、修改、删除的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    rongxq879810662021-01-28