如何理解深度学习中的tensor(涉及numpy的二维,三维以及四维数据的理解)numpy-axis和keepdims

https://www.cnblogs.com/douzujun/p/10289560.html

https://blog.csdn.net/fangjian1204/article/details/53055219 


转载自:

https://blog.csdn.net/holmes_mx/article/details/82813865

 

如何理解深度学习中的tensor(涉及numpy的二维,三维以及四维数据的理解)

作者:

holmes_MX


自己加的一些理解:

 

import numpy as np
c = [ [[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2]],
[[0.11, 0.21, 0.31], [0.41, 0.51, 0.61], [0.71, 0.81, 0.91], [1.01, 1.11, 1.21]] ],
      [[[0.12, 0.22, 0.32], [0.42, 0.52, 0.62], [0.72, 0.82, 0.92], [1.02, 1.12, 1.22]],
       [[0.112, 0.212, 0.312], [0.412, 0.512, 0.612], [0.712, 0.812, 0.912], [1.012, 1.112, 1.212]]]
      ]
c_array = np.array( c )

print(  c_array )
print( c_array.shape )

c_array_1 = c_array.transpose(0,2,3,1)
print(  c_array_1 )
print( c_array_1.shape )

N,H,W,C = c_array_1.shape 
c_array_2 = c_array_1.reshape(N*H*W,C)
print(  c_array_2 )
print( c_array_2.shape )

 

[[[[0.1   0.2   0.3  ]
   [0.4   0.5   0.6  ]
   [0.7   0.8   0.9  ]
   [1.    1.1   1.2  ]]

  [[0.11  0.21  0.31 ]
   [0.41  0.51  0.61 ]
   [0.71  0.81  0.91 ]
   [1.01  1.11  1.21 ]]]


 [[[0.12  0.22  0.32 ]
   [0.42  0.52  0.62 ]
   [0.72  0.82  0.92 ]
   [1.02  1.12  1.22 ]]

  [[0.112 0.212 0.312]
   [0.412 0.512 0.612]
   [0.712 0.812 0.912]
   [1.012 1.112 1.212]]]]
(2, 2, 4, 3)
[[[[0.1   0.11 ]
   [0.2   0.21 ]
   [0.3   0.31 ]]

  [[0.4   0.41 ]
   [0.5   0.51 ]
   [0.6   0.61 ]]

  [[0.7   0.71 ]
   [0.8   0.81 ]
   [0.9   0.91 ]]

  [[1.    1.01 ]
   [1.1   1.11 ]
   [1.2   1.21 ]]]


 [[[0.12  0.112]
   [0.22  0.212]
   [0.32  0.312]]

  [[0.42  0.412]
   [0.52  0.512]
   [0.62  0.612]]

  [[0.72  0.712]
   [0.82  0.812]
   [0.92  0.912]]

  [[1.02  1.012]
   [1.12  1.112]
   [1.22  1.212]]]]
(2, 4, 3, 2)
[[0.1   0.11 ]
 [0.2   0.21 ]
 [0.3   0.31 ]
 [0.4   0.41 ]
 [0.5   0.51 ]
 [0.6   0.61 ]
 [0.7   0.71 ]
 [0.8   0.81 ]
 [0.9   0.91 ]
 [1.    1.01 ]
 [1.1   1.11 ]
 [1.2   1.21 ]
 [0.12  0.112]
 [0.22  0.212]
 [0.32  0.312]
 [0.42  0.412]
 [0.52  0.512]
 [0.62  0.612]
 [0.72  0.712]
 [0.82  0.812]
 [0.92  0.912]
 [1.02  1.012]
 [1.12  1.112]
 [1.22  1.212]]
(24, 2)

1. 二维数据的理解

 理解为:只有(Height, Width),而且理解的是对于每一【 】从后向前看。即第一个[0.1, 0.2, 0.3]是width维度的。

b = [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]
b_array = np.array( b )
 
print(b_array)
print(b_array.shape)
print( b_array[1,2] )
 
### result
 
[[0.1 0.2 0.3]
 [0.4 0.5 0.6]]
(2, 3)
0.6

2. 对三维数据的理解

 理解为:只有(Height, Width, Channel),而且理解的是对于每一【 】从后向前看。即第一个[1, 2, 3, 3.5]是Channel维度的。

a = [ [[1, 2, 3, 3.5], [4, 5, 6, 6.5]], 
[[7, 8, 9, 9.5], [10, 11, 12, 12.5]], 
[[13, 14, 15, 15.5], [16, 17, 18, 18.5]]]
 
a_array = np.array( a )
print(a_array)
print( a_array.shape )
print( a_array[0, 1, 3] )
 
 
### result
[[[ 1.   2.   3.   3.5]
  [ 4.   5.   6.   6.5]]
 
 [[ 7.   8.   9.   9.5]
  [10.  11.  12.  12.5]]
 
 [[13.  14.  15.  15.5]
  [16.  17.  18.  18.5]]]
(3, 2, 4)
6.5

可视化上述的三维数据(字迹丑大家见谅,理解原理优先):

3. 对四维数据的理解

 理解为:(Batch_size, Height, Width, Channel),而且理解的是对于每一【 】从后向前看。即第一个[0.1, 0.2, 0.3]是Channel维度的。

c = [ [[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [1.0, 1.1, 1.2]],
[[0.11, 0.21, 0.31], [0.41, 0.51, 0.61], [0.71, 0.81, 0.91], [1.01, 1.11, 1.21]] ],
      [[[0.12, 0.22, 0.32], [0.42, 0.52, 0.62], [0.72, 0.82, 0.92], [1.02, 1.12, 1.22]],
       [[0.112, 0.212, 0.312], [0.412, 0.512, 0.612], [0.712, 0.812, 0.912], [1.012, 1.112, 1.212]]]
      ]
c_array = np.array( c )
print(  c_array )
print( c_array.shape )
print( c_array[1, 0, 3, 1] )
 
 
## result
[[[[0.1   0.2   0.3  ]
   [0.4   0.5   0.6  ]
   [0.7   0.8   0.9  ]
   [1.    1.1   1.2  ]]
 
  [[0.11  0.21  0.31 ]
   [0.41  0.51  0.61 ]
   [0.71  0.81  0.91 ]
   [1.01  1.11  1.21 ]]]
 
 
 [[[0.12  0.22  0.32 ]
   [0.42  0.52  0.62 ]
   [0.72  0.82  0.92 ]
   [1.02  1.12  1.22 ]]
 
  [[0.112 0.212 0.312]
   [0.412 0.512 0.612]
   [0.712 0.812 0.912]
   [1.012 1.112 1.212]]]]
(2, 2, 4, 3)
1.12

4. tensor的简单操作
4.1 numpy 中对tensor的操作


以三维tensor为例:

numpy.sum( tensor, axis ) numpy.mean( tensor, axis)

其中axis = -1是对最里面的一个维度操作。如numpy.sum( tensor, axis = -1 ), 即对第2维度进行操作,即对channel进行相加。

实例为:

import numpy as np
a = [[[1, 2, 3,], [4, 5, 6]], [[1.1, 2.1, 3.1], [4.1, 5.1, 6.1]]]
print( np.sum(a, axis=-1) )
print( np.sum(a, axis=0) )
print( np.sum(a, axis=1) )
print( np.sum(a, axis=2) )
 
 
## output
#axis = -1  ## channel
[[ 6.  15. ]
 [ 6.3 15.3]]
 
# axis = 0  ## height
[[ 2.1  4.1  6.1]
 [ 8.1 10.1 12.1]]
 
# axis = 1   ## width
[[5.  7.  9. ]
 [5.2 7.2 9.2]]
 
# axis = 2  ## channel
[[ 6.  15. ]
 [ 6.3 15.3]]

 

三维重建是计算机视觉领域的一个热门研究方向,它可以从多个视角的图像重建出三维物体的模型。在深度学习的帮助下,三维重建的准确性和效率得到了大幅提升。本文将介绍一个基于深度学习的多视图三维重建代码实现。 首先,我们需要准备训练数据。多视图三维重建需要从多个视角拍摄同一个物体的图像。我们可以使用多个相机或者一个旋转的相机来拍摄不同视角下的图像。假设我们已经拍摄了 $N$ 张图像,并将它们保存在一个文件夹。 接下来,我们需要使用深度学习模型来训练我们的三维重建算法。这里我们选择使用自编码器(Autoencoder)来进行训练。具体来说,我们使用一个编码器将每个图像压缩为一个低向量,然后使用一个解码器将这个低向量重建为图像。我们希望这个自编码器能够学习到每个图像的特征,从而在解码器生成与原始图像相似的三维模型。 下面是一个使用 PyTorch 实现的自编码器模型: ```python import torch import torch.nn as nn class Autoencoder(nn.Module): def __init__(self): super(Autoencoder, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1), nn.ReLU(), nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1), nn.ReLU(), ) self.decoder = nn.Sequential( nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1), nn.ReLU(), nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, output_padding=1), nn.ReLU(), nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1), nn.ReLU(), nn.ConvTranspose2d(32, 16, kernel_size=3, stride=2, padding=1, output_padding=1), nn.ReLU(), nn.ConvTranspose2d(16, 3, kernel_size=3, stride=2, padding=1, output_padding=1), nn.Sigmoid(), ) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x ``` 这个自编码器模型包含一个编码器和一个解码器。编码器使用卷积神经网络将输入图像压缩为一个低向量,解码器则使用反卷积神经网络将这个低向量重建为图像。我们使用 ReLU 激活函数和 Sigmoid 激活函数来激活编码器和解码器的输出。 接下来,我们需要定义训练过程。我们使用均方误差(MSE)作为损失函数,使用随机梯度下降(SGD)算法来更新模型参数。 ```python import torch.optim as optim def train_autoencoder(model, dataloader, num_epochs=10, learning_rate=0.001): criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): for data in dataloader: img, _ = data optimizer.zero_grad() output = model(img) loss = criterion(output, img) loss.backward() optimizer.step() print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) return model ``` 在训练过程,我们使用一个数据加载器(dataloader)来加载训练数据。每个数据批次包含一个图像和一个标签(这里我们不需要标签,所以用下划线替代)。我们将输入图像传入自编码器模型,得到一个输出图像。我们使用均方误差作为损失函数,计算输出图像和原始图像之间的差距,并使用梯度下降算法来更新模型参数。 最后,我们可以使用训练好的自编码器模型来进行三维重建。具体来说,我们可以将多个视角下的图像输入到自编码器模型,得到每个图像的特征向量,然后将这些特征向量合并起来,使用聚类算法或者点云重建算法来生成三维模型。这里我们不再赘述具体的三维重建算法,读者可以根据自己的需求选择合适的方法。 下面是一个使用训练好的自编码器模型进行三维重建的示例代码: ```python import os import numpy as np import cv2 import torch from torchvision import transforms # 加载自编码器模型 model = torch.load('autoencoder.pt') # 加载测试数据 img_folder = 'test_images' img_files = os.listdir(img_folder) img_files.sort() img_list = [] for img_file in img_files: img_path = os.path.join(img_folder, img_file) img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (256, 256)) img = transforms.ToTensor()(img) img_list.append(img) # 生成特征向量 features_list = [] for img in img_list: img = img.unsqueeze(0) with torch.no_grad(): features = model.encoder(img) features = features.squeeze().numpy() features_list.append(features) # 合并特征向量 features = np.concatenate(features_list, axis=0) # 三维重建 # ... ``` 在这个示例代码,我们首先加载训练好的自编码器模型,然后加载测试数据,将每个图像转换为 PyTorch 张量,并将它们输入到自编码器模型得到特征向量。最后,我们将这些特征向量合并起来,使用三维重建算法生成三维模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值