【Youcans Deep Learning 06】PyTorch 入門チュートリアル: Tensor の基本操作

続々更新中の「youcansの深層学習」シリーズに是非ご注目ください…
【youcansの深層学習01】インストール環境のMiniconda
【youcansの深層学習02】PyTorch CPU版のインストールと環境設定
【深層学習】 youcansの学習03】PyTorch CPUバージョンのインストールと環境設定
【youcansディープラーニング04】PyTorch入門チュートリアル:基礎知識
【youcansディープラーニング05】PyTorch入門チュートリアル:クイックスタート
【youcansディープラーニング06】PyTorch入門チュートリアル:テンソルの基本操作



1. テンソルとそのデータ構造

「Tensor」は PyTorch の基本的なデータ構造です。

PyTorch では、テンソルは主にデータの保存と変換に使用されます。tensor のデータ構造と演算は Numpy 多次元配列 ndarray に似ていますが、GPU で使用して計算を高速化することができ、深層学習により適しています。

テンソルは、スカラー、ベクトル、行列を高次元に拡張した多次元配列です。スカラーは 0 次元のテンソル、ベクトルは 1 次元のテンソル、行列は 2 次元のテンソルです。


ここに画像の説明を挿入


ndimでテンソルの次元をチェックしshapeまたはでテンソルsize()の形状をチェックし、 でデータ型をチェックし、でテンソルの要素数をチェックできます。dtypenumel()

# 导入PyTorch
import pytorch

# (1) 通过数据直接创建Tensor
x = torch.tensor([[1.0, 2.0, 3.6], [0.0, 4.0, 7.0]])
print(x)

# (2) 查看张量的维数,形状和类型
print("x.ndim:", x.ndim)  # 张量的维数
print("x.shape:", x.shape)  # 张量的形状
print("x.size:", x.size())  # 张量的形状
print("x.numel:", x.numel())  # 张量的元素个数
print("x.dtype:", x.dtype)  # 张量的数据类型

出力は次のとおりです。

tensor([[1.0000, 2.0000, 3.6000],
[0.0000, 4.0000, 7.0000]])
x.ndim: 2
x.shape: torch.Size([2, 3])
x.size: torch.Size([2, 3])
x.numel: 6
x.dtype: torch.float32

説明:torch.Sizeこれは基本的にタプル (タイプル) であり、タプルに対するさまざまな操作をサポートします。


0 次元のテンソルには要素が 1 つしかありませんが、それは数値ではないことに注意してください。

# (3) 0 维张量只有一个元素,但不是数值类型
x = torch.tensor([2009])
print("x = ", x)  # x 是张量
print("x.ndim:", x.ndim)  # 张量的维数
print("x.shape:", x.shape)  # 张量的形状
print("x.type:", x.type())  # x 的类型是张量

n = 2009
print("n = ", n)  # n 是标量,不是张量,没有维数、形状
print("type(n):", type(n))  # n 的类型是整型数值

出力結果:

x = tensor([2009])
x.ndim: 1
x.shape: torch.Size([1])
x.type: torch.LongTensor
n = 2009
type(n): <class 'int'>


標準の Python データ構造は、データとメタデータを保持する単一レベルのメモリ オブジェクトです。

PyTorch のデータ構造は階層的に設計され、そのフレームワークは相互運用性をサポートし、カーネルの計算集約的な部分は ATen と Caffe2 を介して C/C++ バックエンドに移行されます。

PyTorch の主要なユーザー向けデータ構造は THTensor オブジェクトであり、次元、オフセット、ステップなどに関する情報を保持し、THStorage オブジェクトへのポインターも格納します。


2. テンソルの作成

2.1 torch.empty() は初期化されていないテンソルを作成します

ndimテンソルの次元をチェックするために使用し、shapeテンソルの形状をチェックするために使用します。

# (4) 创建一个未初始化的张量
x = torch.empty(2, 3)  # x=torch.empty(size=(2, 3)
print(x)
print("x.ndim:", x.ndim)
print("x.shape:", x.shape)

出力は次のとおりです。

tensor([[6.8943e+34, 1.6212e-19, 1.4585e-19],
[7.7179e+28, 1.6217e-19, 1.4586e-19]])
x.ndim: 2
x.shape: torch.Size ([2, 3])


2.2 torch.rand() は乱数テンソルを作成します

機械学習モデルは通常、乱数のテンソルから始まり、例から学習してこれらの乱数値を調整および更新します。

  • 使用すると、一様分布に従う乱数テンソルを作成torch.rand()でき、間隔は [0,1) です。
  • torch.randint()一様分布に従うランダムな整数テンソルを作成するために使用し、間隔は [low, high)
  • torch.randn()平均 0、分散 1 の標準正規分布に従う乱数のテンソルを作成するために使用します。

torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
torch.randint(low=0, high, size, generator=None, out=None) , dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) →テンソル

パラメータの説明:

  • size: テンソル、整数シーケンス リストまたはタプル タプルの形状を定義します
  • dtype: オプション、返されるテンソルのデータ型を指定します
  • layout: オプション、torch.Tensor のメモリ レイアウトを表すオブジェクト
  • device: オプション、テンソルによって格納されたデバイス
# (5) 创建随机数张量
x1 = torch.rand(2, 3)  # 均匀分布随机数,[0,1) 区间
print(x1)
print("x1.shape:", x1.shape)
x2 = torch.randn(2, 3)  # 正态分布随机数,均值为 0 方差为1
print(x2)
print("x2.shape:", x2.shape)
x3 = torch.randint(low=0, high=10, size=(2,3))  # 均匀分布随机整数,[low,high) 区间
print(x3)
print("x3.shape:", x3.shape)

出力は次のとおりです。

tensor([[0.5007, 0.1634, 0.4525],
[0.1331, 0.5705, 0.0439]])
x1.shape: torch.Size([2, 3])
tensor([[ 0.5210, 1.8041, -0.5655],
[-2.0804, 0.3897, 0.4336]])
x2.shape: torch.Size([2, 3])
テンソル([[5, 0, 6],
[1, 8, 2]])
x3.shape: torch.Size([2 、3])


2.3 全 0 行列 / 全 1 行列 / 恒等行列 / 対角行列などの特別なテンソルを作成する

torch.zeros()すべて 0 のテンソルを作成するために使用し、torch.ones()すべて 1 のテンソルを作成するために使用し、単位行列テンソルを作成するtorch.eye()ために。

対角行列テンソルはを使用して作成torch.diag()できますが、1 次元テンソルで作成する必要があります。

# (6) 创建全0矩阵/全1矩阵/单位矩阵/对角矩阵等特殊张量
xZeros = torch.zeros(3, 5)  # 全0矩阵
print(xZeros)
xOnes = torch.ones(3, 5)  # 全1矩阵
print(xOnes)
xEye = torch.eye(3)  # 单位矩阵
print(xEye)
x1 = torch.tensor([1.2, 2.5])  # 一维张量
xDiag = torch.diag(x1)  # 对角矩阵
print(xDiag)

出力は次のとおりです。

tensor([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
tensor([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1 ., 1., 1.]])
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
tensor([ [1.2000、0.0000]、
[0.0000、2.5000]])


2.4 データから直接テンソルを作成する

独自のデータからテンソルを直接作成することもでき、データ形式はリスト、タプル、または Numpy 配列にすることができます。

# (7) 通过数据直接创建Tensor
# 通过列表创建
x1 = torch.tensor([[1, 2, 3],
               [4, 5, 6]])
print(x1)
# 通过元组创建
x2 = torch.tensor(((1, 2, 3), (4, 5, 6)))
print(x2)
# 通过Numpy创建
xnp = np.array([[1, 2, 3], [4, 5, 6]])
x3 = torch.tensor(xnp)
print(x3)

出力は次のとおりです。

tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[1, 2, 3],
[4, 5, 6]])
tensor([[1, 2, 3] 、
[4、5、6]]、dtype=torch.int32)


2.5 既存のテンソルの形状から新しいテンソルを作成する

既存のテンソルの形状から新しいテンソルを作成することも可能で、作成されたテンソルは既存のテンソルと同じ形状になります。

指定されたオブジェクトの形状に従って数値の塗りつぶしを実行するには、上記の関数の後に追加_likeするtorch.*_like()このメソッドは、データ型など、入力テンソルの一部の属性をデフォルトで再利用しますが、データ型をカスタマイズすることもできます。

torch.zeros_like(input, *, dtype=None, layout=None, device=None) → Tensor
torch.ones_like(input, *, dtype=None, layout=None, device=None) → Tensor
torch.randn_like(input, *, dtype =None) *, dtype=None, layout=None, device=None) → テンソル

# (8) 通过已有张量的形状创建新的张量
x = torch.ones((2, 3), dtype=torch.float32)  # 均匀分布随机数
print(x)
print("x:", x.shape, x.type(), x.device)
# 返回的张量默认具有相同的 dtype
y1 = torch.rand_like(x)  # 默认具有相同的数据类型
y2 = torch.zeros_like(x, dtype=torch.int)  # 用户指定新的数据类型
print("y1:", y1.shape, y1.type(), y1.device)
print("y2:", y2.shape, y2.type(), y2.device)

出力は次のとおりです。

tensor([[1., 1., 1.],
[1., 1., 1.]])
x: torch.Size([2, 3]) torch.FloatTensor cpu
y1: torch.Size([2 , 3]) torch.FloatTensor cpu
y2: torch.Size([2, 3]) torch.IntTensor cpu


2.6 Numpy 配列からテンソルを作成する

torch.from_numpy(ndarray)

torch.from_numpy関数はnumpy配列をテンソルに変換します

# (9) 将 numpy 数组转换为张量
x_NP = np.random.rand(2, 3)
x = torch.from_numpy(x_NP)
print(x_NP)
print(x)

出力は次のとおりです。

[[0.02711595 0.35572182 0.67692876]
[0.73672641 0.01211524 0.22966701]]
tensor([[0.0271, 0.3557, 0.6769],
[0.7367, 0.0121, 0.2297ch 型チャンネル 4]).


2.7 逐次一次元テンソルの作成

関数 torch.arange() は 1 次元テンソルを返します。値は区間 [start, end) (左が閉じて右が開いています) にあり、ステップ サイズは step です。
関数 torch.range() は 1 次元のテンソルを返します。値は区間 [start, end) (左閉じと右閉じ) にあり、ステップ サイズは step です。この機能は、後のバージョンで削除されました。関数 torch.linspace() は、区間[ start , end ] [start, end]
に含まれる 1 次元テンソルを返します。[開始, _ _ _ _e n d ]等間隔のステップ データ ポイントの場合、ステップ サイズは自動的に計算されます。
関数 torch.logspace() は、ベースとしてのベースと間隔[ start , end ] [start, end] の[開始, _ _ _ _e n d ]等間隔のステップ データ ポイント。

torch.arange(start=0, end, step=1, *, out=None, dtype=None)
torch.range(start=0, end, step=1, *, out=None, dtype=None) # 新版删除
torch.linspace(start, end, steps, *, out=None, dtype=None)
torch.logspace(start, end, steps, base=10.0, *, out=None, dtype=None)

パラメータの説明:

  • start: 開始値、デフォルト値は 0 です
  • end: 終了値
  • step: ステップ サイズ、デフォルト値は 1
  • ステップ: データ ポイントの数

注: テンソルの最初の要素は必ずしも start ではなく、最後の要素は必ずしも end ではありません。

# (10) 创建顺序的一维张量
x1 = torch.arange(1, 3.6, 0.5)  # 6 个元素,(3.6-1.0)//0.5+1
print(x1)
print("x1:", x1.shape)
x2 = torch.linspace(3, 6, 10)  # 10 个元素,steps=10
print(x2)
print("x2:", x2.shape)
x3 = torch.logspace(3, 6, 10)  # # 10 个元素,steps=10
print(x3)
print("x3:", x3.shape)

出力は次のとおりです。

テンソル([1.0000、1.5000、2.0000、2.5000、3.0000、3.5000])
X1:Torch.Size([6]))
テンソル([3.0000、3.3333、3.6667、4.0000、4.3333、4.6667、5.0000、5.333、5.667、6.0000]
))
x2:torch.size([10])テンソル
([1000.0000、2154.4346、4641.5889、10000.0000、21544.3477、46415.8867、100000.0000、215443.4688、464158.8750、10000.000000
]

テンソルを作成するその他の方法については、[PyTorch 公式ドキュメント] for details を参照してください。


3. テンソルのデータ型

3.1 テンソルの性質

Tensor は PyTorch では torch.Tensor として表され、主なプロパティは次のとおりです。

  • data: 値、値のリスト、Numpy 配列などのテンソル データ。
  • dtype: テンソルのデータ型
  • shape: テンソルの形状と次元
  • device: CPU ('cpu') と GPU ('cuda') をサポートするテンソル ストレージのデバイス タイプ
  • レイアウト: メモリ内のテンソルのレイアウト モード、torch.strided および torch.sparse_coo をサポート
  • grad: データの勾配
  • grad_fn: 自動導出用のテンソルを作成する関数
  • requires_grad: 勾配を計算するかどうか、ブール値
  • is_leaf: 葉ノードかどうか、ブール値

3.2 PyTorch で定義されたテンソル型

テンソルは、単一のデータ型の要素を含む多次元行列です。

最も一般的なテンソル タイプは、「32 ビット浮動小数点」として知られる torch.float32 または torch.float です。しかし、16 ビットの浮動小数点数 (torch.float16 または torch.half) と 64 ビットの浮動小数点数 (torch.float64 または torch.double) もあります。さらに、8 ビット、16 ビット、32 ビット、および 64 ビットの整数型、ブール型、および複合型があります。

PyTorch には文字列型がありませんが、ワンホット エンコーディングまたは Word2vec モデルで表すことができることに注意してください。

特に、PyTorch の一部のテンソル型は CPU 専用ですが、他のものは GPU により適しています。たとえば、torch.cuda のテンソルはすべて GPU に使用されます (Nvidia GPU は CUDA 用の Compute Toolkit と呼ばれます)。

Torch は、CPU および GPU バリアントで 9 つの異なるテンソル型を定義します。デフォルトのデータ型は 32 ビット float ( torch.float32 ) です。

データ・タイプ dtype CPUテンソル GPU テンソル
32 ビット浮動小数点数 torch.float32 torch.FloatTensor torch.cuda.FloatTensor
64 ビット浮動小数点数 torch.float64 torch.DoubleTensor torch.cuda.DoubleTensor
16 ビット浮動小数点数 torch.float16 torch.HalfTensor torch.cuda.HalfTensor
8 ビット整数 (符号なし) torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
8 ビット整数 (符号付き) torch.int8 torch.CharTensor torch.cuda.CharTensor
16 ビット整数 (符号付き) torch.int16 torch.ShortTensor torch.cuda.ShortTensor
32 ビット整数 (符号付き) torch.int32 torch.IntTensor torch.cuda.IntTensor
64 ビット整数 (符号付き) torch.int64 torch.LongTensor torch.cuda.LongTensor
ブール値 torch.bool torch.BoolTensor torch.cuda.BoolTensor

3.3 テンソルのデータ型を確認する

PyTorch は、データ型をチェックおよび判断するためのいくつかの方法を提供します。

  • type(x): テンソル、Numpy 配列、リスト、値などの型に適用可能な変数のデータ型を返します。
  • x.dtype: 変数のデータ型を返します。テンソルと Numpy 配列に適用できますが、リストや値などには適用できません。
  • x.type(): 変数のデータ型を返します。テンソルに適用できますが、Numpy 配列、リスト、値などには適用できません。
  • isinstance(x, torch.FloatTensor): データ型を比較し、True/False を返します
# (11) 张量的数据类型
x_numpy = np.random.rand(2, 3)
x_list = x_numpy.tolist()
x_data = x_numpy[0,0].item()
x_tensor = torch.from_numpy(x_numpy)
print(type(x_numpy))  # <class 'numpy.ndarray'>
print(type(x_list))  # <class 'list'>
print(type(x_data))  # <class 'float'>
print(type(x_tensor))  # <class 'torch.Tensor'>
# 查看张量的数据类型
print(x_tensor.type())  # torch.DoubleTensor
print(x_tensor.dtype)  # torch.float64
# 判断张量的数据类型
print(isinstance(x_tensor, torch.FloatTensor))  # False

知らせ:

(1) テンソル x の場合、x.type() または type(x) を使用してデータ型を表示できますが、戻り値の形式が異なります。x.type() はテンソルの具体的なデータ型を返し、type(x) はデータ型のクラス名を返します。
(2) Numpy 配列、リスト リスト、および値の場合、type(x) を使用してデータ型を確認できますが、x.type() メソッドは使用できません。


3.3 テンソルのデータ型を指定する

テンソルを作成するとき、デフォルトのデータ型は 32 ビット浮動小数点 ( torch.FloatTensor ) です。

ユーザーは、テンソルの作成時にテンソルのデータ型を指定したり、既存のテンソルのデータ型を変更したりできます。

テンソル x のデータ型を変更するには、x.int() を使用して torch.int32 に変更するか、x.type(torch.int32) を使用できます。

# (12) 指定张量的数据类型
# 在创建时指定张量的数据类型
x1 = torch.zeros(3, 3)
x2 = torch.zeros(3, 3, dtype=torch.float64)
x3 = torch.zeros(3, 3, dtype=torch.long)
print("x1.dtype: ", x1.dtype)
print("x2.dtype: ", x2.dtype)
print("x3.dtype: ", x3.dtype)
# 更改张量的数据类型
x1 = x1.long()  # x1=x1.type(torch.int64)
x2 = x2.int()  # x2=x2.type(torch.int32)
x3 = x3.type(torch.float64)
print("x1.long: ", x1.dtype)
print("x2.int: ", x2.dtype)
print("x3.float64: ", x3.dtype)

出力は次のとおりです。

x1.dtype: torch.float32
x2.dtype: torch.float64
x3.dtype: torch.int64

x1.long: torch.int64
x2.int: torch.int32
x3.float64: torch.float64


4. テンソル記憶装置

Tensor は、CPU または GPU デバイスに格納できます。複雑なネットワーク モデルと大規模なデータの場合、GPU は、行列の乗算などの特定の種類の演算で CPU よりもはるかに高速です。

2 つのテンソルは、同じデバイス (CPU または同じ GPU) でのみ操作できることに注意してください。CPU に格納されたデータを GPU に格納されたデータで操作することはできず、異なる GPU にあるデータを直接操作することはできません。

4.1 GPU デバイスの確認

PyTorch では、CPU デバイスtorch.device('cpu')を表し、 torch.device('cuda')GPU デバイスを表すために使用します。

CPU デバイスにはすべての物理 CPU とメモリが含まれます。つまり、PyTorch 計算はすべての CPU コアを使用しようとします。GPU デバイスは、GPU グラフィックス カードと対応するビデオ メモリのみを表します。システムに複数の GPU がある場合は、i 番目の GPU グラフィックス カードtorch.device('cuda:{i}')を表す、cuda:0 は cuda と略すこともできます。

torch.cuda.is_available()システムに GPU デバイスがあるかどうかを確認するために使用します。GPU デバイスがない場合、テンソルは CPU デバイスでのみ保存および操作できます。一般に、ユーザー向け API はデバイスに依存せず、開発者はコードを記述するときに特定のストレージやコンピューティング デバイスに注意を払う必要はなく、コードはデバイスに応じて CPU または GPU (利用可能な場合) で実行されます。

# (13) 检查 GPU 设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("device=", device)

print("CUDA版本: ", torch.version.cuda)
print("Pytorch版本: ", torch.__version__)
print("显卡是否可用: ", "GPU 可用" if(torch.cuda.is_available()) else " GPU 不可用")
print("显卡数量: ", torch.cuda.device_count())
print("是否支持BF16格式: ", "支持 BF16" if (torch.cuda.is_bf16_supported()) else "不支持 BF16")
print("当前显卡的型号: ", torch.cuda.get_device_name())
print("当前显卡的算力: ", torch.cuda.get_device_capability())
print("当前显卡的显存: ", torch.cuda.get_device_properties(0).total_memory/1024/1024/1024,'GB')
print("是否支持TensorCore: ", "支持" if (torch.cuda.get_device_properties(0).major >= 7) else "不支持")
print("当前显卡的使用率: ", torch.cuda.memory_allocated(0)/torch.cuda.get_device_properties(0).total_memory*100, "%")

出力結果:

device= cuda
CUDA バージョン: 11.7
Pytorch バージョン: 1.13.1
グラフィック カードが使用可能かどうか: GPU が使用可能
グラフィック カードの数: 1
BF16 フォーマットをサポートするかどうか: BF16 をサポート現在のグラフィック カード
モデル: NVIDIA GeForce RTX 3060
: (8, 6)
現在のグラフィック カードのビデオ メモリ: 11.99951171875 GB
TensorCore をサポートするかどうか: はい
現在のグラフィック カードの使用率: 0.0 %


4.2 テンソルのストレージ デバイスの指定

テンソルを作成するとき、デフォルトのテンソル ストレージ デバイス。

テンソルとモデルは、to(device) メソッドを介して特定のデバイスに配置できます。

ユーザーは、テンソルの作成時にテンソルのストレージ デバイスを指定するか、既存のテンソルのストレージ デバイスを変更できます。tensor x のストレージ デバイスを変更するには、 x.cuda(0) を使用して GPU に変更するか、 x.to(“cuda:0”) メソッドを使用します。

NumPy は GPU を使用できないため、NumPy を使用してテンソルを操作する場合は、テンソルを CPU に戻す必要があります。

# (14) 指定张量的存储设备
# 在创建时指定张量的存储设备
x1 = torch.rand(3, 3, device="cpu")
x2 = torch.rand(3, 3, device="cuda")
x3 = torch.rand(3, 3, device="cuda:0")
# 获取张量的设备
print("x1: {}\nx2: {}\nx3: {}".format(x1.device, x2.device, x3.device))
# 修改张量的数据类型
x1 = x1.cuda(0)  # 将张量 x1 从 CPU 转移到 0#GPU
x2 = x1.to("cuda:0")  # # 将张量 x1 从 CPU 转移到 GPU
x3 = x3.cpu()  # # 将张量 x2 从 GPU 转移到 CPU
print("x1: {}\nx2: {}\nx3: {}".format(x1.device, x2.device, x3.device))

出力結果:

x1: cpu
x2: cuda:0
x3: cuda:0

x1: cuda:0
x2: cuda:0
x3: cpu


4.3 モデルの GPU 操作

PyTorch モデルは、CPU または GPU に保存することもできます。デフォルトでは、PyTorch はメモリ内にデータを作成し、計算に CPU を使用します。

同様に、モデル パラメータのdeviceプロパティを、モデルが保存されているデバイスを表示し、to()メソッドを使用して指定したデバイスにモデルを転送できます。

# (15) 模型的存储设备
model = torch.nn.Linear(3, 1)  # 线性模型
print("Linear model:\n", list(model.parameters()))
print("device of model: ", list(model.parameters())[0].device)

x = torch.rand(2, 3, device="cuda")  # 输入张量 x 在 GPU 设备
# print(model(x))  # 模型 model 与 输入张量 x 不在同一设备,程序报错

model.cuda()  # 将模型转移到 GPU
print("device of model: ", list(model.parameters())[0].device)
print(model(x))

出力結果:

線形モデル:
[パラメーターを含む:
tensor([[ 0.3656, -0.1920, 0.5609]], requires_grad=True), パラメーターを含む:
tensor([-0.0030], requires_grad=True)]
モデルのデバイス: cpu
モデルのデバイス: cuda :0
tensor([[0.4553],
[0.4906]], device='cuda:0', grad_fn=)

プログラムの説明:

(1) Pytorch モデルは、計算を実行するモデルへの Tensor 入力と同じデバイス上にある必要があります。そうでない場合、エラーが報告されます。

RuntimeError: すべてのテンソルが同じデバイス上にあると予想されましたが、少なくとも 2 つのデバイス cpu と cuda:0 が見つかりました! (wrapper_addmmメソッドで引数mat1の引数を確認する場合)

(2) 入力パラメータは GPU デバイスに保存されるため、モデルが GPU に転送された後にのみ計算を実行できます。


著作権表示: 「Youcans' Deep Learning」シリーズ
へようこそ。再投稿の際は元のテキスト リンクを示してください: [Youcans' Deep Learning 04] PyTorch 入門チュートリアル: Basic Tensor Operations (https://youcans.blog.csdn.net/記事/詳細/130158748) Copyright 2023 youcans, XUPT Crated: 2023-04-12



おすすめ

転載: blog.csdn.net/youcans/article/details/130158748