python size(0)_对x.view(x.size(0), -1)的一些理解

一般地,在CNN等网络中,都是通过卷积过滤器对目标进行计算,然而这些计算都是建立在高维数据。

最后,项目需要对数据进行分类或者识别,就需要全连接层Linear,这时候就需要将高维数据平铺变为低位数据。

Lenet 例子

class Lenet(nn.Module):

def __init__(self):

super(Lenet, self).__init__()

‘’‘卷积、池化处理’‘’

self.conv = nn.Sequential(

nn.Conv2d(1, 6, 3, stride=1, padding=1),

nn.MaxPool2d(2, 2),

nn.Conv2d(6, 16, 5, stride=1, padding=0),

nn.MaxPool2d(2, 2)

)

‘’‘全连接层’‘’

self.fc = nn.Sequential(

nn.Linear(400, 120),

nn.Linear(120, 84),

nn.Linear(84, 10)

)

def forward(self, x):

out = self.conv(x) #卷积网络(高维数据)

out = out.view(out.size(0), -1)#高维数据 ‘压’成 低维数据

out = self.fc(out)#全连接层(低维数据)

return out

lenet = Lenet()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

例子

import torch as t

a = t.arange(24)

a = a.reshape(4, 3, 2)

x = a.view(a.size(0), -1)

y = a.view(a.size(1), -1)

‘’‘输出对比’‘’

a = tensor([[[ 0, 1],

[ 2, 3],

[ 4, 5]],

[[ 6, 7],

[ 8, 9],

[10, 11]],

[[12, 13],

[14, 15],

[16, 17]],

[[18, 19],

[20, 21],

[22, 23]]])

a.size is torch.Size([4, 3, 2])

x = tensor([[ 0, 1, 2, 3, 4, 5],

[ 6, 7, 8, 9, 10, 11],

[12, 13, 14, 15, 16, 17],

[18, 19, 20, 21, 22, 23]])

x.size is torch.Size([4, 6])

y = tensor([[ 0, 1, 2, 3, 4, 5, 6, 7],

[ 8, 9, 10, 11, 12, 13, 14, 15],

[16, 17, 18, 19, 20, 21, 22, 23]])

y.size is torch.Size([3, 8])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

ps:

x = a.view(a.size(0), -1)

等价于

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

2

3

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码的错误在于使用了错误的语法和变量命名。以下是需要修正的错误: 1. 函数 `u()` 的定义,应该将 `train size` 改为 `train_size`。同样的,`batch_ size` 改为 `batch_size`。 2. 在 `u()` 函数,`int(num_ data 1 batch_ size)` 的语法是错误的,应该改为 `int(num_data / batch_size)`。 3. 在 `u()` 函数,`self.leftover flag` 的语法也是错误的,应该改为 `self.leftover_flag`。 4. 在 `u()` 函数,`long( )self.leftover flag = True` 的语法是错误的,应该将其分成两行,并且添加缺少的冒号。 5. 在 `def_ iter_a()` 函数,`rand_ num = torch.randperm(self .num_ per_ batch) .view(-1, 1) * self .batch size` 的语法是错误的,应该将 `self .batch size` 改为 `self.batch_size`。 6. 在 `def_ iter_a()` 函数,`self .rand num_view = self .rand_ num. view(-1)` 的语法是错误的,应该将 `self .rand num_view = self .rand_ num. view(-1)` 改为 `self.rand_num_view = self.rand_num.view(-1)`。 7. 在 `def_ iter_a()` 函数,`if self.leftover_ flag:` 的语法是错误的,应该将其改为 `if self.leftover_flag:`。 8. 在 `def_ iter_a()` 函数,`self .rand_ num_ view = torch.cat((self.rand_ num_ view, self.leftover), 0` 的语法是错误的,应该将其改为 `self.rand_num_view = torch.cat((self.rand_num_view, self.leftover), 0)`。 9. 在 `def Len_()` 函数,`return num_ data` 的语法是错误的,应该将其改为 `return num_data`。 修正以上错误后的代码如下: ```python class Sampler: def u(self, train_size, batch_size): num_data = train_size self.num_per_batch = int(num_data / batch_size) self.batch_size = batch_size self.range = torch.arange(0, batch_size).view(1, batch_size).long() self.leftover_flag = False if num_data % batch_size: self.leftover = torch.arange(self.num_per_batch * batch_size, num_data).long() self.leftover_flag = True def iter_a(self): rand_num = torch.randperm(self.num_per_batch).view(-1, 1) * self.batch_size self.rand_num = rand_num.expand(self.num_per_batch, self.batch_size) + self.range self.rand_num_view = self.rand_num.view(-1) if self.leftover_flag: self.rand_num_view = torch.cat((self.rand_num_view, self.leftover), 0) return iter(self.rand_num_view) def Len(self): return num_data ``` 以上是修正后的代码。修正后代码的变量命名和语法都是正确的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值