# Tensor Attributes

*   [torch.dtype](#torch-dtype)
*   [torch.device](#torch-device)
*   [torch.layout](#torch-layout)

每个`torch.Tensor`都有`torch.dtype`, `torch.device`,和`torch.layout`。

### torch.dtype

`torch.dtype`是表示`torch.Tensor`的数据类型的对象。`PyTorch`有八种不同的数据类型：

|  | Data type | dtype | Tensor types |
| --- | --- | --- | --- |
| 32-bit floating point | torch.float32 or torch.float | torch.*.FloatTensor |
| 64-bit floating point | torch.float64 or torch.double | torch.*.DoubleTensor |
| 16-bit floating point | torch.float16 or torch.half | torch.*.HalfTensor |
| 8-bit integer (unsigned) | torch.uint8 | torch.*.ByteTensor |
| 8-bit integer (signed) | torch.int8 | torch.*.CharTensor |
| 16-bit integer (signed) | torch.int16 or torch.short | torch.*.ShortTensor |
| 32-bit integer (signed) | torch.int32 or torch.int | torch.*.IntTensor |
| 64-bit integer (signed) | torch.int64 or torch.long | torch.*.LongTensor |

使用方法：

```py
>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> print x.type()
torch.FloatTensor 
```

### torch.device

`torch.device`代表将`torch.Tensor`分配到的设备的对象。

`torch.device`包含一个设备类型（`'cpu'`或`'cuda'`设备类型）和可选的设备的序号。如果设备序号不存在，则为当前设备; 例如，`torch.Tensor`用设备构建`'cuda'`的结果等同于`'cuda:X'`,其中`X`是`torch.cuda.current_device()`的结果。

`torch.Tensor`的设备可以通过`Tensor.device`访问属性。

构造`torch.device`可以通过字符串/字符串和设备编号。

通过一个字符串：

```py
>>> torch.device('cuda:0')
device(type='cuda', index=0)

>>> torch.device('cpu')
device(type='cpu')

>>> torch.device('cuda')  # current cuda device
device(type='cuda') 
```

通过字符串和设备序号：

```py
>>> torch.device('cuda', 0)
device(type='cuda', index=0)

>>> torch.device('cpu', 0)
device(type='cpu', index=0) 
```

> **注意** `torch.device`函数中的参数通常可以用一个字符串替代。这允许使用代码快速构建原型。
> 
> ```py
> &gt;&gt; # Example of a function that takes in a torch.device
> &gt;&gt; cuda1 = torch.device('cuda:1')
> &gt;&gt; torch.randn((2,3), device=cuda1) 
> ```
> 
> ```py
> &gt;&gt; # You can substitute the torch.device with a string
> &gt;&gt; torch.randn((2,3), 'cuda:1') 
> ```

* * *

> **注意** 出于传统原因，可以通过单个设备序号构建设备，将其视为`cuda`设备。这匹配`Tensor.get_device()`，它为`cuda`张量返回一个序数，并且不支持`cpu`张量。
> 
> ```py
> &gt;&gt; torch.device(1)
> device(type='cuda', index=1) 
> ```

* * *

> **注意** 指定设备的方法可以使用（properly formatted）字符串或（legacy）整数型设备序数，即以下示例均等效：
> 
> ```py
> &gt;&gt; torch.randn((2,3), device=torch.device('cuda:1'))
> &gt;&gt; torch.randn((2,3), device='cuda:1')
> &gt;&gt; torch.randn((2,3), device=1)  # legacy 
> ```

### torch.layout

`torch.layout`表示`torch.Tensor`内存布局的对象。目前，我们支持`torch.strided(dense Tensors)`并为`torch.sparse_coo(sparse COO Tensors)`提供实验支持。

`torch.strided`代表密集张量，是最常用的内存布局。每个`strided`张量都会关联 一个`torch.Storage`，它保存着它的数据。这些张力提供了多维度， 存储的`strided`视图。`Strides`是一个整数型列表：`k-th stride`表示在张量的第 k 维从一个元素跳转到下一个元素所需的内存。这个概念使得可以有效地执行多张量。

例：

```py
>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)

>>> x.t().stride()
(1, 5) 
```

关于`torch.sparse_coo`张量的更多信息,请参阅[torch.sparse](https://ptorch.com/docs/8/torch-sparse)。

### 译者署名

| 用户名 | 头像 | 职能 | 签名 |
| --- | --- | --- | --- |
| [Song](https://ptorch.com) | ![](img/2018033000352689884.jpeg) | 翻译 | 人生总要追求点什么 |