【学习笔记-语法】 -shape[0]、shape[1]、shape[2]的区别,以及pytorch中的torch.cat()矩阵拼接的用法及理解

一、 -shape[0]、shape[1]、shape[2]的区别

对于图像来说:

    img.shape[0]:图像的垂直尺寸(高度)

    img.shape[1]:图像的水平尺寸(宽度)

    img.shape[2]:图像的通道数

1.1 代码解释

代码如下:

import matplotlib.image as mpimg  # mpimg 用于读取图片
 
if __name__ == '__main__':
    img = mpimg.imread('cat.jpg')  # 读取和代码处于同一目录下的 img.png
    # 此时 img 就已经是一个 np.array 了,可以对它进行任意处理
    print(img.shape)  # (512, 512, 3)
    print(img.shape[0])
    print(img.shape[1])
    print(img.shape[2])

运行结果如下:

(300, 534, 3)
300
534
3

由此证明,上述结果是没有问题的。

而对于矩阵来说:

    shape[0]:表示矩阵的行数

    shape[1]:表示矩阵的列数

1.2 举例如下:

  import numpy as np
 
if __name__ == '__main__':
    w = np.array([[1, 2, 3], [4, 5, 6]])  # 2X3的矩阵
    print(w.shape)
    print(w.shape[0])
    print(w.shape[1])

运行结果如下:

(2, 3)
2
3

1.3 另:

hape[0]、shape[1]、shape[2]分别表示是输入张量的第一、第二、第三维度

二、pytorch中的torch.cat()矩阵拼接的用法及理解

https://blog.csdn.net/flyingluohaipeng/article/details/125038212?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167731387416782429718630%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167731387416782429718630&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-125038212-null-null.142v73control,201v4add_ask,239v2insert_chatgpt&utm_term=torch.cat%EF%BC%88%EF%BC%89&spm=1018.2226.3001.4187

2.1 序言

深度学习模型里的输出的东西。torch.cat()的用处还是蛮大的。
下面直接举例子理解。

2.2 一维拼接

import torch

a = torch.Tensor([1, 2, 3])
b = a * 2
c = torch.cat((a, b), dim=0)  # dim=-1为取最后一维。这里只有一维-10是一样的
print(a.shape)
print(c.shape)
print(c)

2.3 二维拼接

dim就是选择哪一维进行拼接,dim=-1就表示最后一维进行拼接,这个也很好理解,索引-1一般都指最后一个字符

a = torch.Tensor([[1, 2]])
b = a * 2
c1 = torch.cat((a, b), dim=0)
c2 = torch.cat((a, b), dim=1)  # 这里第二维是最后一维,dim=-1和dim=1是一样的
print("a:", a)
print("a.shape:", a.shape)
print("c1:", c1)
print("c1.shape:", c1.shape)
print("c2:", c2)
print("c2.shape:", c2.shape)

当你使用pytorch深度学习模型时,隐藏层不止一层,最好将所有的隐藏层都利用起来,那么就需要进行隐藏层的拼接了。

假设隐藏层h_n.shape为(2,3,4)表示有2个隐藏层,batch_size为3(3个样本一起训练),隐藏层大小为4。由于隐藏层都包含了一定的信息,那么我们都利用起来应该效果比较好(听学长说很多论文都证明过了),那么每个样本对应的隐藏层应该都拼接起来用即2*4的大小。这样就需要用到拼接了。

h_n = torch.randn(2, 3, 4)  # 假设隐藏层
# 下面三种写法是一个意思
feature_map = torch.cat([h_n[i] for i in range(h_n.shape[0])], dim=-1)  # 索引第i个整元素,元素里剩下的维度缺省是全取的意思
feature_map1 = torch.cat([h_n[i, :, :] for i in range(h_n.shape[0])], dim=-1)
feature_map2 = torch.cat([h_n[i] for i in range(h_n.shape[0])], dim=1)
print(feature_map.shape)
print(feature_map1.shape)
print(feature_map2.shape)

隐藏层拼接完之后就可以放进全连接层然后出结果了。

由于LSTM的现在时刻的输出是前一个时刻的隐藏层和现在时刻的输入经过softmax得到的,而现在时刻的隐藏层是 现在时刻的输出*tanh(现在时刻的细胞状态)得到的,现在时刻的隐藏层也是包含了现在输入的信息的,因此直接放入全连接然后出结果就好了,至于模型的输出可以不用,直接用隐藏层也是可以的吧。或者说隐藏层就相当于包含着各自特征信息,输出层也是基于隐藏层来的,因此我们深度学习模型里直接用隐藏层就是在直接用那些特征吧(强行理解一波)

用模型的输出或者模型隐藏层应该都是可以得出结果的,目前对我来说,效果应该都差不多。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊菜来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值