神经网络 pytorch 分类二维矩阵图像和一维向量的方法

13 篇文章 0 订阅
6 篇文章 3 订阅

在网上找资料的过程中,发现并没有特别细致的讲解分类图像和分类一维向量的做法,导致我捅咕了有几天才弄明白,可能使我比较菜吧......现在在这里记录一下。

首先需要明确,前文我们已经讲解了包装数据集的方法,但是注意,无论是图像还是向量数据,都是有固定格式的,因为我们在做卷积的时候有数据格式要求。使用的时候我们必须将自己的数据变换为指定的格式,而变换的方法无非numpy.array torch.from_numpy 香江列表转换为矩阵,再从矩阵转换为tensor,这其中的操作就是矩阵的操作,在上一篇中简单有一个例子,简单了解一下就可以,注意以下问题

  • 矩阵维度必须满足卷积的输入
  • label是有数据类型要求的,tensor可以直接使用.int()  .long()等方法就行转换类型
  • 变换时,可以使用矩阵的赋值和循环操作结合,完成指定格式的数据构建 具体看前一篇(神经网络 pytorch 数据集读取(自动读取数据集,手动读取自己的数据))

 

基础

数据分为两部分:原始数据,数据标签

图像数据要求的格式为【样本序号,维度,尺寸w,尺寸h】、

向量要求是【样本序号,维度,长度】

这里的维度代表的是。。。。举个例子一张彩色图像可以分为三个RGB通道

所以一张图像读取进来的数据是【维度,尺寸w,尺寸h】,在加上组成数据集的样本维度,就变为了【样本序号,维度,尺寸w,尺寸h】。

 

而对于一维向量来说,由于没有宽高,只有长度,所以就变为了

【样本序号,维度,长度】

 

实验

首先是图像的二维数据测试

conv1 = nn.Conv2d(3, 6, 5)
conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5)
这是二维卷积函数,可以看到输入要求3维度 输出6图 核大小5维

在卷积中使用的是batch分组进行处理的,所以在图像的基础上,我们还需要再有一个维度

【batch,维度,尺寸w,尺寸h】,注意如果使用数据集的话,batch是不需要我们管的

我们创建数据
conv1 = nn.Conv2d(3, 6, 5)
input = torch.randn((3,15,15)) #这是一个图像的三维 尺寸
conv1(input)
# Expected 4-dimensional input for 4-dimensional weight [6, 3, 5, 5], but got input of size [3, 15, 15] instead
# 要求输入为四维 我们手动创建一个样本集
input = torch.randn((5,3,15,15))  # 五张图像 三维 尺寸
conv1(input)
tensor([[[[-0.3294, -0.4139, -0.2850,  ...,  1.3533, -0.6759,  0.1333],
          [ 0.3084,  0.1447, -0.1788,  ...,  0.9002,  0.2388,  0.9239],
          [ 0.0672,  0.2839,  1.3691,  ..., -0.1531, -1.0619, -1.0429],
          ...,
          [-0.2464,  0.4404,  0.6528,  ...,  0.4497, -0.2516, -0.1859],
          [-0.3036,  0.1986,  0.6850,  ..., -0.1474, -0.3568, -0.1044],
          [ 0.0053,  0.4006, -0.2252,  ..., -0.0466,  0.0872,  0.0611]],
         [[ 1.2968, -0.4136, -0.2831,  ..., -0.1858, -0.9087,  0.5293],
          [ 0.4907,  0.6914,  0.3149,  ...,  0.3644,  0.5656, -0.8398],
          [ 0.1517, -0.1849, -0.0562,  ..., -0.5456, -0.4508, -0.6404],
          ..., 省略了
          ...,
          [-0.0307,  0.5376, -0.8060,  ..., -0.1753, -0.7272, -0.8466],
          [-0.2170, -0.2148, -0.5993,  ...,  0.0340,  0.3307,  0.0338],
          [ 0.3770,  0.5640,  0.0672,  ..., -0.1321, -0.7813,  0.2787]]]],
       grad_fn=<ThnnConv2DBackward>)

对于一维的学习来说,输入是三维的,【样本序号,维度,长度】,继续试验一下

conv1 = nn.Conv1d(in_channels=2, out_channels=5, kernel_size=3)
# 要求输入为二通道
input = torch.randn((4,2,12))
# 四个样本 二通道 长度12
conv1(input)

tensor([[[ 0.5587,  0.6236, -0.9632,  0.3872, -0.0721,  0.3657, -0.1207,
          -0.0946,  0.3658, -0.3244],
         [ 0.2307, -0.2126, -1.2743, -0.4488, -0.2530, -0.0273, -0.7402,
           0.0616, -0.9748, -0.6859],
         [-0.7817, -0.3664, -1.1842, -0.7359,  0.4219,  0.6737, -0.1494,
          -0.0247, -0.2200, -0.1169],
         [ 0.4604, -0.6700,  0.3021,  0.6606,  2.2227,  0.3312,  0.5341,
           0.8271, -0.7024,  0.7300],
         [ 0.0626, -0.4945,  0.9787,  0.0997,  0.4146, -0.6470,  0.6352,
          -0.0103, -0.0971,  0.6143]],
         ............. 省略
        [[-0.0005,  0.6630,  0.2095,  0.4185,  0.0364,  0.8880,  0.1139,
           0.3172, -0.1049,  0.1099],
         [-0.2716,  0.0824, -0.5943,  0.0037, -0.6148,  0.3952, -0.1688,
          -0.3591, -0.6956, -0.5202],
         [-0.7579, -1.2024, -1.1410, -0.3624, -1.0320, -0.2396, -0.5218,
          -0.7605, -0.4535, -0.6400],
         [ 0.0183, -0.9959,  0.3437, -0.0709,  0.3040,  0.4322,  0.0317,
           0.1266, -0.0621,  0.7542],
         [ 0.3895, -0.4234,  0.6149, -0.4937,  0.5438, -0.4094, -0.0073,
           0.1984,  0.0270,  0.5017]]], grad_fn=<SqueezeBackward1>)

二维学习中,主要使用的是

self.conv1 = nn.Conv2d(in_channels=1, out_channels=5, kernel_size=7, stride=2, padding=1)

self.fc1 = nn.Linear(2432,512)

F.max_pool2d(self.conv1(x), 2)

 

一维

self.conv1 = nn.Conv1d(in_channels=1, out_channels=5, kernel_size=7, stride=2, padding=1)

self.fc1 = nn.Linear(2432,512)

F.max_pool1d(self.conv1(x), 2)

 

附录

下面的就是一些常用的可能的部分,每个都有很多种选择,但前提可定是需要知道它有......

其中激活函数包括多种,用于处理输出形式,规范等

torch.nn.functional.threshold(input, threshold, value, inplace=False)
torch.nn.functional.relu(input, inplace=False)
torch.nn.functional.hardtanh(input, min_val=-1.0, max_val=1.0, inplace=False)
torch.nn.functional.relu6(input, inplace=False)
torch.nn.functional.elu(input, alpha=1.0, inplace=False)
torch.nn.functional.leaky_relu(input, negative_slope=0.01, inplace=False)
torch.nn.functional.prelu(input, weight)
torch.nn.functional.rrelu(input, lower=0.125, upper=0.3333333333333333, training=False, inplace=False)
torch.nn.functional.logsigmoid(input)
torch.nn.functional.hardshrink(input, lambd=0.5)
torch.nn.functional.tanhshrink(input)
torch.nn.functional.softsign(input)
torch.nn.functional.softplus(input, beta=1, threshold=20)
torch.nn.functional.softmin(input)
torch.nn.functional.softmax(input)
torch.nn.functional.softshrink(input, lambd=0.5)
torch.nn.functional.log_softmax(input)
torch.nn.functional.tanh(input)
torch.nn.functional.sigmoid(input)

常用的就是relu什么的,实际上种类很多,还有各种改进,具体的看这位大佬的吧

https://www.jianshu.com/p/68bd249327ce,列举了几种样式

优化器的话也是有上十种,基于基类 Optimizer

随机梯度下降算法 SGD算法 
torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)

平均随机梯度下降算法 ASGD算法
torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

AdaGrad算法
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

自适应学习率调整 Adadelta算法
torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

RMSprop算法
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

自适应矩估计 Adam算法
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

 Adamax算法(Adamd的无穷范数变种)
torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

SparseAdam算法
torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)

L-BFGS算法
torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)

弹性反向传播算法 Rprop算法
torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))

大佬的很详细
https://blog.csdn.net/shanglianlm/article/details/85019633

池化方法也有好几种

# https://blog.csdn.net/HowardWood/article/details/79508805
torch.nn.functional.avg_pool1d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
torch.nn.functional.avg_pool2d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
torch.nn.functional.max_pool1d(input, kernel_size, stride=None, padding=0, dilation=1, ceil_mode=False, return_indices=False)
torch.nn.functional.max_pool2d(input, kernel_size, stride=None, padding=0, dilation=1, ceil_mode=False, return_indices=False)
torch.nn.functional.max_unpool1d(input, indices, kernel_size, stride=None, padding=0, output_size=None)
torch.nn.functional.max_unpool2d(input, indices, kernel_size, stride=None, padding=0, output_size=None)
torch.nn.functional.lp_pool2d(input, norm_type, kernel_size, stride=None, ceil_mode=False)
torch.nn.functional.adaptive_max_pool1d(input, output_size, return_indices=False)
torch.nn.functional.adaptive_max_pool2d(input, output_size, return_indices=False)
torch.nn.functional.adaptive_avg_pool1d(input, output_size)
torch.nn.functional.adaptive_avg_pool2d(input, output_size)

 

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您使用PyTorch中的卷积操作来实现将二维矩阵从800×77变为400×128的操作。下面是一个简单的示例代码: ```python import torch import torch.nn as nn # 定义神经网络模型 class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=2, padding=1) self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=2, padding=1) self.fc = nn.Linear(400*32, 128) def forward(self, x): x = torch.unsqueeze(x, 1) # 在通道维度上增加一个维度,使其变为[batch_size, 1, height, width] x = self.conv1(x) x = self.conv2(x) x = x.view(x.size(0), -1) # 展平成一维向量 x = self.fc(x) return x # 创建模型实例 model = ConvNet() # 创建输入数据(假设为800×77的矩阵) input_data = torch.randn(1, 800, 77) # 使用模型进行前向传播 output_data = model(input_data) # 打印输出数据的大小 print(output_data.size()) # 输出: torch.Size([1, 128]) ``` 在这个示例中,我们定义了一个简单的卷积神经网络模型 `ConvNet`,其中包含两个卷积层和一个全连接层。输入数据经过卷积操作后,最终被展平为一维向量,并通过全连接层输出大小为128的向量。您可以根据实际需求修改模型的结构和参数。 注意,上述代码中的输入数据是800×77的矩阵,但由于卷积操作会改变输入的大小,因此需要根据实际情况调整模型的参数和层数。这只是一个示例,您可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值