torch.Storage() とは何ですか? torch.Tensor() はどう違いますか?

目次

1. はじめに

2. 実データはストレージに存在します

3. ストレージは連続した 1 次元配列です

4. 各 Tensor には対応するストレージがあります。


1. はじめに

        torch.Tensor() は誰もがよく知っており、torch で操作されるデータ型はすべて Tensor です。Storage は実際に使うことはほとんどありませんが、Tensor の実データは Storage に格納されるため非常に重要です。 

       公式ドキュメント:パッケージリファレンス - torch.Storage - 「PyTorch 中国語ドキュメント」

        保存場所: torch.Storage()

        公式説明:

1 つは、torch.Storage単一のデータ型の連続した 1 次元配列です。

それぞれに、torch.Tensor同じデータ型の対応するストアがあります。

2. 実データはストレージに存在します

        torch.Tensor() を使用して新しい Tensor を作成し、その形状を指定できます。Tensor はヘッダ情報領域と記憶領域 (Storage) に分かれます。情報領域には主にテンソルの形状(サイズ)、ストライド(stride)、データ型(dtype)などの情報が格納されます。実データは記憶領域に記憶される。

        コードは以下のように表示されます。

import torch

data1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
tensor_data1 = torch.Tensor(data1)
print("tensor_data1.size():", tensor_data1.size())
print("tensor_data1.dtype:", tensor_data1.dtype)
print("tensor_data1.storage():", tensor_data1.storage())

# 输出如下:
# tensor_data1.size(): torch.Size([3, 3])
# tensor_data1.dtype: torch.float32
# tensor_data1.storage():  1.0
#  2.0
#  3.0
#  4.0
#  5.0
#  6.0
#  7.0
#  8.0
#  9.0

        Tensor にはサイズや型などの属性があり、実際のデータは Storage に格納されていることがわかります。

3. ストレージは連続した 1 次元配列です

        Tensor の形状に関係なく、torch.Storage は単一のデータ型の連続 1 次元配列です。Storage オブジェクトを直接作成できますが、勾配の計算、逆伝播、順伝播などの操作を実行したい場合は、Storage を Tensor に変換する必要があります。

        コードは以下のように表示されます。

import torch

data1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
storage_date1 = torch.Storage(data1)
# Storage转Tensor
tensor_data1 = torch.Tensor(storage_date1)
print("storage_date1:", storage_date1)

# storage_date1:  1.0
#  2.0
#  3.0
#  4.0
#  5.0
#  6.0
#  7.0
#  8.0
#  9.0
# [torch.storage._TypedStorage(dtype=torch.float32, device=cpu) of size 9]

4. 各 Tensor には対応するストレージがあります

        Tensor には次のデータ型があります。

class DoubleTensor(Tensor): ...
class FloatTensor(Tensor): ...
class LongTensor(Tensor): ...
class IntTensor(Tensor): ...
class ShortTensor(Tensor): ...
class HalfTensor(Tensor): ...
class CharTensor(Tensor): ...
class ByteTensor(Tensor): ...
class BoolTensor(Tensor): ...

        各 Tensor には対応するタイプの Storage があり、torch.Tensor() を使用して新しい Tensor を作成する場合、デフォルトは FloatTensor です。

import torch

data1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
tensor_data1 = torch.Tensor(data1)
tensor_data331 = tensor_data1.view(3, 3, 1)
print("id(tensor_data1) == id(tensor_data331):", id(tensor_data1) == id(tensor_data331))
print("id(tensor_data1.storage()) == id(tensor_data331.storage()):", id(tensor_data1.storage()) == id(tensor_data331.storage()))

# id(tensor_data1) == id(tensor_data331): False
# id(tensor_data1.storage()) == id(tensor_data331.storage()): True

        tensor_data1 の形状を変更して別の変数に代入したにもかかわらず、データの内容は変化せず、2 つの変数は同じデータ ストレージを参照していることがわかります。

        そして、興味深いことに気づきました。Tensor が作成されると、その Storage 値は変更されません。データ型を変更しても実際の値は変わりません。たとえば、次の例では、float のデータ型を int に変更してから float に戻しても、小数点は失われず、メモリ アドレスも変更されません。

import torch

data1 = [[1.1, 2.1, 3.1], [4.1, 5.1, 6.1], [7.1, 8.1, 9.1]]
tensor_data1 = torch.Tensor(data1)
tensor_data_int = tensor_data1.int()
tensor_data_f = tensor_data1.float()
print("tensor_data1:", tensor_data1.storage())
print("tensor_data_int:", tensor_data_int.storage())
print("tensor_data_f:", tensor_data_f.storage())
# 两个Tensor内存地址肯定不一样,因为是两个对象
print("id(tensor_data_int) == id(tensor_data_f):", id(tensor_data_int) == id(tensor_data_f))
# 虽然数据类型不一样,但是两个Storage内存地址一样,因为类型其实是跟着Tensor走的
print("id(tensor_data_int.storage()) == id(tensor_data_f.storage()):", id(tensor_data_int.storage()) == id(tensor_data_f.storage()))

# tensor_data1:  1.100000023841858
#  2.0999999046325684
#  3.0999999046325684
#  4.099999904632568
#  5.099999904632568
#  6.099999904632568
#  7.099999904632568
#  8.100000381469727
#  9.100000381469727
# [torch.storage._TypedStorage(dtype=torch.float32, device=cpu) of size 9]
# tensor_data_int:  1
#  2
#  3
#  4
#  5
#  6
#  7
#  8
#  9
# [torch.storage._TypedStorage(dtype=torch.int32, device=cpu) of size 9]
# tensor_data_f:  1.100000023841858
#  2.0999999046325684
#  3.0999999046325684
#  4.099999904632568
#  5.099999904632568
#  6.099999904632568
#  7.099999904632568
#  8.100000381469727
#  9.100000381469727
# [torch.storage._TypedStorage(dtype=torch.float32, device=cpu) of size 9]
# id(tensor_data_int) == id(tensor_data_f): False
# tensor_data_int.storage().type(): torch.int32 torch.float32
# id(tensor_data_int.storage()) == id(tensor_data_f.storage()): True

        torch.Storage()の簡単な紹介です、迷わないように注意してください(*^▽^*)

おすすめ

転載: blog.csdn.net/xian0710830114/article/details/132891920