文章目录
前言
案例代码:github:https://github.com/2012Netsky/pytorch_cnn/blob/main/2_named_tensors.ipynb
一、创建特定tensor
#!/usr/bin/env python
# coding: utf-8
# In[5]:
import torch
_ = torch.tensor([0.2126, 0.7152, 0.0722], names=['c'])
# In[6]:
img_t = torch.randn(3, 5, 5) # shape [channels, rows, columns]
weights = torch.tensor([0.2126, 0.7152, 0.0722])
# In[7]:
batch_t = torch.randn(2, 3, 5, 5) # shape [batch, channels, rows, columns]
二、计算tensor均值
# In[8]:
img_gray_naive = img_t.mean(-3) #在倒数第三个维度上取均值
batch_gray_naive = batch_t.mean(-3) #在倒数第三个维度上取均值
img_gray_naive.shape, batch_gray_naive.shape
# In[19]:
print(img_gray_naive)
三、tensor维度编辑及tensor乘法
# In[10]:
weights.size()
# In[11]:
weights.shape
# In[12]:
weights
# In[13]:
weights.unsqueeze(-1)
# In[14]:
weights.unsqueeze(-1).unsqueeze_(-1)
# In[15]:
img_t
# In[16]:
img_t * weights.unsqueeze(-1).unsqueeze_(-1)
# In[18]:
print(img_t.shape)
print((weights.unsqueeze(-1)).shape)
print((weights.unsqueeze(-1).unsqueeze_(-1)).shape)
print((img_t * weights.unsqueeze(-1).unsqueeze_(-1)).shape)
# unsqueeze_(-1)在tensor最后一个维度上再增加一个维度
# 高维矩阵相乘 保证前面维度相同 后面两个维度的矩阵相乘相当于二维矩阵相乘
# In[21]:
unsqueezed_weights = weights.unsqueeze(-1).unsqueeze_(-1)
img_weights = (img_t * unsqueezed_weights)
print(img_t.shape)
print(unsqueezed_weights.shape)
print((img_t * unsqueezed_weights).shape)
batch_weights = (batch_t * unsqueezed_weights)
print(batch_t.shape)
print(unsqueezed_weights.shape)
print((batch_t * unsqueezed_weights).shape)
四、tensor维度合并
img_gray_weighted = img_weights.sum(-3)
print(img_gray_weighted ) #一张图片
batch_gray_weighted = batch_weights.sum(-3)
print(batch_gray_weighted) # 两张图片
batch_weights.shape, batch_t.shape, unsqueezed_weights.shape
# In[25]:
img_gray_weighted_fancy = torch.einsum('...chw,c->...hw', img_t, weights)
batch_gray_weighted_fancy = torch.einsum('...chw,c->...hw', batch_t, weights)
img_gray_weighted_fancy.shape ,batch_gray_weighted_fancy.shape
# In[26]:
weights_named = torch.tensor([0.2126, 0.7152, 0.0722], names=['channels'])
weights_named
五、添加名称 又不改变现有名称
# In[27]:
# 添加名称 又不改变现有名称
img_named = img_t.refine_names(..., 'channels', 'rows', 'columns')
batch_named = batch_t.refine_names(..., 'channels', 'rows', 'columns')
print("img named:", img_named.shape, img_named.names)
print("batch named:", batch_named.shape, batch_named.names)
六、自动维度对其功能 返回张量 补全缺失的维度
# In[28]:
# 自动维度对其功能 返回张量 补全缺失的维度
weights_aligned = weights_named.align_as(img_named)
weights_aligned.shape, weights_aligned.names
七、接受维度参数函数 按照指定维度拿出tensor
# In[29]:
# 接受维度参数函数 按照指定维度拿出tensor
gray_named = (img_named * weights_aligned).sum('channels')
gray_named.shape, gray_named.names
八、使用不同名称组合维度
# In[30]:
# 使用不同名称组合维度
try:
gray_named = (img_named[..., :3] * weights_named).sum('channels')
except Exception as e:
print(e)
# In[31]:
# 删除名称
gray_plain = gray_named.rename(None)
gray_plain.shape, gray_plain.names