PyTorch基础(三)-----神经网络包nn和优化器optim

  • kernel_size(int or tuple):池化窗口size

  • stride(int or tuple):池化的步长

  • padding(int or tuple):池化的填充,默认为0

  • 案例

pool of square window of size=3, stride=2

m = nn.MaxPool2d(3,stride = 2)

pool of non-square window

m = nn.MaxPool2d((3, 2), stride=(2, 1))

input = torch.randn(20, 16, 50, 32)

output = m(input)

  • nn.AvgPool2d(kernel_size,stride):这里列举了常用的几个参数,其余省略了

  • kernel_size(int or tuple):池化窗口size

  • stride(int or tuple):池化的步长

  • padding(int or tuple):池化的填充,默认为0

  • 案例

pool of square window of size=3, stride=2

m = nn.AvgPool2d(3, stride=2)

pool of non-square window

m = nn.AvgPool2d((3, 2), stride=(2, 1))

input = torch.randn(20, 16, 50, 32)

output = m(input)

  • nn.Linear(in_features, out_features, bias)

  • in_features:输入特征数

  • out_features:输出特征数

  • bias:偏置

  • 案例

m = nn.Linear(20, 30)

input = torch.randn(128, 20)

output = m(input)

print(output.size())

torch.Size([128, 30])

二、案例+相关代码注释

在这之前,首先我们需要了解一下PyTorch中已经给我们准备好的网络模型nn.Module。我们自己定义的网络模型只需要继承nn.Module,并实现它的forward()方法,PyTorch会根据Autograd,自动实现backward()函数,在forward函数中我们可以使用任何Tensor支持的函数,还可以使用if、for、print等Python语法,写法与标准Python写法是一致的。

class Net(nn.Module):

def init(self):

nn.Module子类的函数必须在构造函数中执行父类的构造函数

super(Net, self).init()

卷积层 '1’表示输入图片为单通道, '6’表示输出通道数,'3’表示卷积核为3*3

self.conv1 = nn.Conv2d(1, 6, 3)

#线性层,输入1350个特征,输出10个特征

self.fc1 = nn.Linear(1350, 10) #这里的1350是如何计算的呢?这就要看后面的forward函数

#正向传播

def forward(self, x):

print(x.size()) # 结果:[1, 1, 32, 32]

卷积 -> 激活 -> 池化

x = self.conv1(x) #根据卷积的尺寸计算公式,计算结果是30,具体计算公式后面第二章第四节 卷积神经网络 有详细介绍。

x = F.relu(x)

print(x.size()) # 结果:[1, 6, 30, 30]

x = F.max_pool2d(x, (2, 2)) #我们使用池化层,计算结果是15

x = F.relu(x)

print(x.size()) # 结果:[1, 6, 15, 15]

reshape,‘-1’表示自适应

#这里做的就是压扁的操作 就是把后面的[1, 6, 15, 15]压扁,变为 [1, 1350]

x = x.view(x.size()[0], -1)

print(x.size()) # 这里就是fc1层的的输入1350

x = self.fc1(x)

return x

net = Net()

print(net)

  • 运行结果

Net(

(conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))

(fc1): Linear(in_features=1350, out_features=10, bias=True)

)

  • 网络的可学习参数通过net.parameters()返回

for parameters in net.parameters():

print(parameters)

  • 运行结果

Parameter containing:

tensor([[[[ 0.2745, 0.2594, 0.0171],

[ 0.0429, 0.3013, -0.0208],

[ 0.1459, -0.3223, 0.1797]]],

[[[ 0.1847, 0.0227, -0.1919],

[-0.0210, -0.1336, -0.2176],

[-0.2164, -0.1244, -0.2428]]],

[[[ 0.1042, -0.0055, -0.2171],

[ 0.3306, -0.2808, 0.2058],

[ 0.2492, 0.2971, 0.2277]]],

[[[ 0.2134, -0.0644, -0.3044],

[ 0.0040, 0.0828, -0.2093],

[ 0.0204, 0.1065, 0.1168]]],

[[[ 0.1651, -0.2244, 0.3072],

[-0.2301, 0.2443, -0.2340],

[ 0.0685, 0.1026, 0.1754]]],

[[[ 0.1691, -0.0790, 0.2617],

[ 0.1956, 0.1477, 0.0877],

[ 0.0538, -0.3091, 0.2030]]]], requires_grad=True)

Parameter containing:

tensor([ 0.2355, 0.2949, -0.1283, -0.0848, 0.2027, -0.3331],

requires_grad=True)

Parameter containing:

tensor([[ 2.0555e-02, -2.1445e-02, -1.7981e-02, …, -2.3864e-02,

8.5149e-03, -6.2071e-04],

[-1.1755e-02, 1.0010e-02, 2.1978e-02, …, 1.8433e-02,

7.1362e-03, -4.0951e-03],

[ 1.6187e-02, 2.1623e-02, 1.1840e-02, …, 5.7059e-03,

-2.7165e-02, 1.3463e-03],

…,

[-3.2552e-03, 1.7277e-02, -1.4907e-02, …, 7.4232e-03,

-2.7188e-02, -4.6431e-03],

[-1.9786e-02, -3.7382e-03, 1.2259e-02, …, 3.2471e-03,

-1.2375e-02, -1.6372e-02],

[-8.2350e-03, 4.1301e-03, -1.9192e-03, …, -2.3119e-05,

2.0167e-03, 1.9528e-02]], requires_grad=True)

Parameter containing:

tensor([ 0.0162, -0.0146, -0.0218, 0.0212, -0.0119, -0.0142, -0.0079, 0.0171,

0.0205, 0.0164], requires_grad=True)

  • net.named_parameters可同时返回可学习的参数及名称。

for name,parameters in net.named_parameters():

print(name,‘:’,parameters.size())

  • 我们来简单测试一下:注意forward函数的输入和输出都是Tensor

input = torch.randn(1, 1, 32, 32) # 这里的对应前面fforward的输入是32

out = net(input)

out.size()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了

《Java中高级核心知识全面解析》

小米商场项目实战,别再担心面试没有实战项目:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
alt=“img” style=“zoom: 33%;” />

总结

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了

《Java中高级核心知识全面解析》

[外链图片转存中…(img-KJ8NG7ol-1712184094486)]

小米商场项目实战,别再担心面试没有实战项目:

[外链图片转存中…(img-mE5ErUjx-1712184094486)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,CNN-LSTM神经网络结构通常用于处理时间序列数据,其中CNN用于提取时间序列中的空间特征,LSTM用于处理时间序列中的时间依赖性。 对于多变量回归预测任务,我们可以采用以下步骤来实现CNN-LSTM神经网络: 1. 准备数据集:将多个变量的时间序列数据集合并成一个多维数组,其中每个维度表示一个变量,每个时间步表示一个样本。 2. 数据预处理:对数据进行归一化处理,使得每个变量的数值范围都在 [0,1] 之间。 3. 构建模型:使用PyTorch构建一个CNN-LSTM神经网络模型,其中CNN部分使用卷积层提取空间特征,LSTM部分处理时间序列数据,最后输出多个变量的预测结果。 4. 训练模型:使用训练集对模型进行训练,采用均方误差(MSE)作为损失函数。 5. 测试模型:使用测试集对模型进行测试,计算均方误差和平均绝对误差(MAE)等指标来评估模型性能。 下面是一个简单的CNN-LSTM神经网络实现的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np # 构建CNN-LSTM神经网络模型 class CNNLSTM(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(CNNLSTM, self).__init__() self.hidden_size = hidden_size self.conv1 = nn.Conv2d(1, 32, kernel_size=(3, 3), padding=(1, 1)) self.conv2 = nn.Conv2d(32, 64, kernel_size=(3, 3), padding=(1, 1)) self.pool = nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2)) self.lstm = nn.LSTM(input_size, hidden_size) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.pool(x) x = self.conv2(x) x = nn.functional.relu(x) x = self.pool(x) x = x.permute(3, 0, 1, 2) _, (h, _) = self.lstm(x) h = h.squeeze() out = self.fc(h) return out # 准备数据集 data = np.random.rand(100, 5, 10) # 100个样本,5个变量,每个变量10个时间步 target = np.random.rand(100, 3) # 100个样本,3个变量的预测结果 # 数据预处理 data = (data - np.min(data)) / (np.max(data) - np.min(data)) target = (target - np.min(target)) / (np.max(target) - np.min(target)) # 转换为PyTorch张量 data = torch.from_numpy(data).float() target = torch.from_numpy(target).float() # 定义模型和优化器 model = CNNLSTM(5, 64, 3) optimizer = optim.Adam(model.parameters(), lr=0.001) criterion = nn.MSELoss() # 训练模型 for epoch in range(100): optimizer.zero_grad() output = model(data.unsqueeze(1)) loss = criterion(output.squeeze(), target) loss.backward() optimizer.step() if epoch % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 100, loss.item())) # 测试模型 with torch.no_grad(): test_data = np.random.rand(10, 5, 10) # 10个测试样本 test_data = (test_data - np.min(test_data)) / (np.max(test_data) - np.min(test_data)) test_data = torch.from_numpy(test_data).float() test_output = model(test_data.unsqueeze(1)) print('Test Output: ', test_output.squeeze().numpy()) ``` 在上述代码中,首先定义了一个CNNLSTM类作为CNN-LSTM神经网络模型。模型括两个部分:CNN部分和LSTM部分。CNN部分使用两个卷积层和一个最大池化层提取空间特征,LSTM部分处理时间序列数据。最后,使用一个全连接层输出多个变量的预测结果。 然后,我们准备了一个随机的多变量时间序列数据集,并将其归一化处理。接着,我们定义了一个Adam优化器和一个均方误差损失函数,并使用训练集对模型进行训练。 最后,我们使用测试集对模型进行测试,并计算均方误差和平均绝对误差等指标来评估模型性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值