1 Star 0 Fork 0

che.melsm/DeepLearning Project

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
bike1.py 7.55 KB
一键复制 编辑 原始数据 按行查看 历史
che.melsm 提交于 2024-03-09 14:41 +08:00 . update bike1.py.
#导入需要使用的库
import numpy as np
import pandas as pd #读取csv文件的库
import matplotlib.pyplot as plt #绘图
import torch
import torch.optim as optim
#读取数据到内存中,rides为一个dataframe对象
data_path = 'Documents/hour.csv' #文件路径
rides = pd.read_csv(data_path)
rides.head()
#我们取出最后一列的前50条记录来进行预测
counts = rides['cnt'][:50]
#获得变量x,它是1,2,……,50
x = np.arange(len(counts))
# 将counts转成预测变量(标签):y
y = np.array(counts)
# 绘制一个图形,展示曲线长的样子
plt.figure(figsize = (10, 7)) #设定绘图窗口大小
plt.plot(x, y, 'o-') # 绘制原始数据
plt.xlabel('X') #更改坐标轴标注
plt.ylabel('Y') #更改坐标轴标注
plt.show()
#版本1
#取出数据库中的最后一列的前50条记录来进行预测
counts = rides['cnt'][:50]
#创建变量x,它是1,2,……,50
x = torch.tensor(np.arange(len(counts), dtype = float), requires_grad = True)
# 将counts转成预测变量(标签):y
y = torch.tensor(np.array(counts, dtype = float), requires_grad = True)
# 设置隐含层神经元的数量
sz = 10
# 初始化所有神经网络的权重(weights)和阈值(biases)
weights = torch.randn((1, sz), dtype = torch.double, requires_grad = True) #1*10的输入到隐含层的权重矩阵
biases = torch.randn(sz, dtype = torch.double, requires_grad = True) #尺度为10的隐含层节点偏置向量
weights2 = torch.randn((sz, 1), dtype = torch.double, requires_grad = True) #10*1的隐含到输出层权重矩阵
learning_rate = 0.001 #设置学习率
losses = []
# 将 x 转换为(50,1)的维度,以便与维度为(1,10)的weights矩阵相乘
x = x.view(50, -1)
# 将 y 转换为(50,1)的维度
y = y.view(50, -1)
for i in range(100000):
# 从输入层到隐含层的计算
hidden = x * weights + biases
# 将sigmoid函数作用在隐含层的每一个神经元上
hidden = torch.sigmoid(hidden)
#print(hidden.size())
# 隐含层输出到输出层,计算得到最终预测
predictions = hidden.mm(weights2)#
#print(predictions.size())
# 通过与标签数据y比较,计算均方误差
loss = torch.mean((predictions - y) ** 2)
#print(loss.size())
losses.append(loss.data.numpy())
# 每隔10000个周期打印一下损失函数数值
if i % 10000 == 0:
print('loss:', loss)
#对损失函数进行梯度反传
loss.backward()
#利用上一步计算中得到的weights,biases等梯度信息更新weights或biases中的data数值
weights.data.add_(- learning_rate * weights.grad.data)
biases.data.add_(- learning_rate * biases.grad.data)
weights2.data.add_(- learning_rate * weights2.grad.data)
# 清空所有变量的梯度值。
# 因为pytorch中backward一次梯度信息会自动累加到各个变量上,因此需要清空,否则下一次迭代会累加,造成很大的偏差
weights.grad.data.zero_()
biases.grad.data.zero_()
weights2.grad.data.zero_()
# 打印误差曲线
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
x_data = x.data.numpy() # 获得x包裹的数据
plt.figure(figsize = (10, 7)) #设定绘图窗口大小
xplot, = plt.plot(x_data, y.data.numpy(), 'o') # 绘制原始数据
yplot, = plt.plot(x_data, predictions.data.numpy()) #绘制拟合数据
plt.xlabel('X') #更改坐标轴标注
plt.ylabel('Y') #更改坐标轴标注
plt.legend([xplot, yplot],['Data', 'Prediction under 1000000 epochs']) #绘制图例
plt.show()
#版本2
#取出最后一列的前50条记录来进行预测
counts = rides['cnt'][:50]
#创建归一化的变量x,它的取值是0.02,0.04,...,1
x = torch.tensor(np.arange(len(counts), dtype = float) / len(counts), requires_grad = True)
# 创建归一化的预测变量y,它的取值范围是0~1
y = torch.tensor(np.array(counts, dtype = float), requires_grad = True)
# 设置隐含层神经元的数量
sz = 10
# 初始化所有神经网络的权重(weights)和阈值(biases)
weights = torch.randn((1, sz), dtype = torch.double, requires_grad = True) #1*10的输入到隐含层的权重矩阵
biases = torch.randn(sz, dtype = torch.double, requires_grad = True) #尺度为10的隐含层节点偏置向量
weights2 = torch.randn((sz, 1), dtype = torch.double, requires_grad = True) #10*1的隐含到输出层权重矩阵
learning_rate = 0.001 #设置学习率
losses = []
# 将 x 转换为(50,1)的维度,以便与维度为(1,10)的weights矩阵相乘
x = x.view(50, -1)
# 将 y 转换为(50,1)的维度
y = y.view(50, -1)
for i in range(100000):
# 从输入层到隐含层的计算
hidden = x * weights + biases
# 将sigmoid函数作用在隐含层的每一个神经元上
hidden = torch.sigmoid(hidden)
# 隐含层输出到输出层,计算得到最终预测
predictions = hidden.mm(weights2)# + biases2.expand_as(y)
# 通过与标签数据y比较,计算均方误差
loss = torch.mean((predictions - y) ** 2)
losses.append(loss.data.numpy())
# 每隔10000个周期打印一下损失函数数值
if i % 10000 == 0:
print('loss:', loss)
#对损失函数进行梯度反传
loss.backward()
#利用上一步计算中得到的weights,biases等梯度信息更新weights或biases中的data数值
weights.data.add_(- learning_rate * weights.grad.data)
biases.data.add_(- learning_rate * biases.grad.data)
weights2.data.add_(- learning_rate * weights2.grad.data)
# 清空所有变量的梯度值。
# 因为pytorch中backward一次梯度信息会自动累加到各个变量上,因此需要清空,否则下一次迭代会累加,造成很大的偏差
weights.grad.data.zero_()
biases.grad.data.zero_()
weights2.grad.data.zero_()
plt.semilogy(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
x_data = x.data.numpy() # 获得x包裹的数据
plt.figure(figsize = (10, 7)) #设定绘图窗口大小
xplot, = plt.plot(x_data, y.data.numpy(), 'o') # 绘制原始数据
yplot, = plt.plot(x_data, predictions.data.numpy()) #绘制拟合数据
plt.xlabel('X') #更改坐标轴标注
plt.ylabel('Y') #更改坐标轴标注
plt.legend([xplot, yplot],['Data', 'Prediction']) #绘制图例
plt.show()
#测试50组数据
counts_predict = rides['cnt'][50:100] #读取待预测的接下来的50个数据点
#首先对接下来的50个数据点进行选取,注意x应该取51,52,……,100,然后再归一化
x = torch.tensor((np.arange(50, 100, dtype = float) / len(counts))
, requires_grad = True)
#读取下50个点的y数值,不需要做归一化
y = torch.tensor(np.array(counts_predict, dtype = float), requires_grad = True)
x = x.view(50, -1)
y = y.view(50, -1)
# 从输入层到隐含层的计算
hidden = x * weights + biases
# 将sigmoid函数作用在隐含层的每一个神经元上
hidden = torch.sigmoid(hidden)
# 隐含层输出到输出层,计算得到最终预测
predictions = hidden.mm(weights2)
# 计算预测数据上的损失函数
loss = torch.mean((predictions - y) ** 2)
print(loss)
x_data = x.data.numpy() # 获得x包裹的数据
plt.figure(figsize = (10, 7)) #设定绘图窗口大小
xplot, = plt.plot(x_data, y.data.numpy(), 'o') # 绘制原始数据
yplot, = plt.plot(x_data, predictions.data.numpy()) #绘制拟合数据
plt.xlabel('X') #更改坐标轴标注
plt.ylabel('Y') #更改坐标轴标注
plt.legend([xplot, yplot],['Data', 'Prediction']) #绘制图例
plt.show()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/che-melsm/deep-learning-project.git
git@gitee.com:che-melsm/deep-learning-project.git
che-melsm
deep-learning-project
DeepLearning Project
master

搜索帮助