JittorMirror/python/jittor/notebook/60分钟快速入门Jittor/计图入门教程 1 --- 基本概念.ipynb

1019 lines
28 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"正文开始:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. 第一章 - 基本概念: Var"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"目录:\n",
"* 1.1 Var 的基本介绍\n",
"* 1.2 如何生成 Var\n",
"* 1.3 Var 的常见属性\n",
"* 1.4 Var 的常见操作\n",
"* 1.5 Var 的运算\n",
"* 1.6 与 NumPy 的相互转化"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.1 Var 的基本介绍"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Var计图的基本数据类型\n",
"\n",
"在计图 (Jittor) - 开源深度学习框架中Var 类型是最基本的数据类型。计图的所有操作,都将基于 Var 进行。所以,学习并掌握 Var 是使用计图的第一步。请不要感到畏难,我们之所以引入 Var 类型,是为了优化深度学习的计算能力与效率,目的是方便您更加高效地进行开发,请您尽情享受。 \n",
"\n",
"简单来说Var 是一种特殊的数据结构,它与数组和矩阵非常相似。您可简单理解为,一维 Var 即是数组,二维 Var 即是矩阵。在计图中,我们使用 Var 来编码模型的输入和输出,以及模型的参数。\n",
"\n",
"**计图的 Var 与 NumPy 的 ndarray 极其相似**,但 Var 可以在 GPU 或其他专用硬件上运行,以加速计算。如果您熟悉 ndarray您就会十分熟悉 Var 的相关操作。如果没有,请按照本教程,对 Var 类型进行快速演练。本教程已覆盖 Var 的基础操作,可以基本满足您的开发需求。如您想要更加深入了解并灵活使用 Var,敬请查阅我们的 [API 文档](https://cg.cs.tsinghua.edu.cn/jittor/assets/docs/index.html)。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.2 如何生成 Var"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"首先,我们在 Python 中导入计图:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[38;5;2m[i 0202 22:49:45.609290 80 compiler.py:847] Jittor(1.2.2.23) src: /home/llt/.local/lib/python3.7/site-packages/jittor\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.611377 80 compiler.py:848] g++ at /usr/bin/g++\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.612691 80 compiler.py:849] cache_path: /home/llt/.cache/jittor/default/g++\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.626682 80 __init__.py:257] Found /usr/local/cuda/bin/nvcc(10.2.89) at /usr/local/cuda/bin/nvcc.\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.697894 80 __init__.py:257] Found gdb(8.1.0) at /usr/bin/gdb.\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.715477 80 __init__.py:257] Found addr2line(2.30) at /usr/bin/addr2line.\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.768340 80 compiler.py:889] pybind_include: -I/usr/include/python3.7m -I/usr/local/lib/python3.7/dist-packages/pybind11/include\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.792263 80 compiler.py:891] extension_suffix: .cpython-37m-x86_64-linux-gnu.so\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:45.974687 80 __init__.py:169] Total mem: 62.78GB, using 16 procs for compiling.\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.131834 80 jit_compiler.cc:21] Load cc_path: /usr/bin/g++\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.304843 80 init.cc:54] Found cuda archs: [75,]\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.491697 80 __init__.py:257] Found mpicc(2.1.1) at /usr/bin/mpicc.\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.549639 80 compiler.py:654] handle pyjt_include/home/llt/.local/lib/python3.7/site-packages/jittor/extern/mpi/inc/mpi_warper.h\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.596179 80 compile_extern.py:287] Downloading nccl...\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.683976 80 compile_extern.py:16] found /usr/local/cuda/include/cublas.h\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:46.686093 80 compile_extern.py:16] found /usr/lib/x86_64-linux-gnu/libcublas.so\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:47.293398 80 compile_extern.py:16] found /usr/local/cuda/include/cudnn.h\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:47.294725 80 compile_extern.py:16] found /usr/local/cuda/lib64/libcudnn.so\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:47.332204 80 compiler.py:654] handle pyjt_include/home/llt/.local/lib/python3.7/site-packages/jittor/extern/cuda/cudnn/inc/cudnn_warper.h\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:49.192471 80 compile_extern.py:16] found /usr/local/cuda/include/curand.h\u001b[m\n",
"\u001b[38;5;2m[i 0202 22:49:49.193815 80 compile_extern.py:16] found /usr/local/cuda/lib64/libcurand.so\u001b[m\n"
]
}
],
"source": [
"import jittor as jt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**从 “普通数据” 导入生成 Var**"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"data: \n",
" [[1, 2], [3, 4], [5, 6]]\n",
"var_data: \n",
" jt.Var([[1 2]\n",
" [3 4]\n",
" [5 6]], dtype=int32)\n",
"var_data的类型是: <class 'jittor.jittor_core.Var'>\n"
]
}
],
"source": [
"data = [[1, 2],[3, 4],[5, 6]] # 生成一个普通的列表\n",
"print(\"data: \\n\", data)\n",
"\n",
"var_data = jt.array(data) # 通过列表生成 Var\n",
"print(\"var_data: \\n\", var_data)\n",
"\n",
"print(\"var_data的类型是:\", type(var_data)) # 打印类型可以发现生成的是jittor.Var\n",
"var_data = jt.Var(data) # 当然jittor.Var也可以直接使用"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**从 “NumPy 数组” 导入生成 Var**"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"np_array: \n",
" [[1 2]\n",
" [3 4]\n",
" [5 6]]\n",
"var_np_array: \n",
" jt.Var([[1 2]\n",
" [3 4]\n",
" [5 6]], dtype=int64)\n"
]
}
],
"source": [
"import numpy as np\n",
"np_array = np.array([[1, 2],[3, 4],[5, 6]]) # 生成一个 NumPy 的数组\n",
"print(\"np_array: \\n\", np_array)\n",
"\n",
"var_np_array=jt.array(np_array) # 通过 NumPy 的数组生成 Var\n",
"print(\"var_np_array: \\n\", var_np_array)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**从 “其他 Var 数据” 导入生成新的 Var**"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Zeros Var: \n",
" jt.Var([[0 0]\n",
" [0 0]\n",
" [0 0]], dtype=int32)\n",
"Ones Var: \n",
" jt.Var([[1 1]\n",
" [1 1]\n",
" [1 1]], dtype=int32)\n",
"full Var: \n",
" jt.Var([[5 5]\n",
" [5 5]\n",
" [5 5]], dtype=int32)\n",
"Random Var: \n",
" jt.Var([[0.27817145 0.22768587]\n",
" [0.71629596 0.78609395]\n",
" [0.8813336 0.5737404 ]], dtype=float32)\n"
]
}
],
"source": [
"# 准备一个原始的 Var\n",
"var_data = jt.Var([[1, 2],[3, 4],[5, 6]])\n",
"\n",
"# 生成一个形状相同,元素全为 0 的 Var\n",
"var_zeros = jt.zeros_like(var_data) \n",
"print(\"Zeros Var: \\n\", var_zeros)\n",
"\n",
"# 生成一个形状相同,元素全为 1 的 Var\n",
"var_ones = jt.ones_like(var_data) \n",
"print(\"Ones Var: \\n\", var_ones)\n",
"\n",
"# 生成一个形状相同,并指定元素值的 Var\n",
"var_full = jt.full_like(var_data, 5)\n",
"print(\"full Var: \\n\", var_full)\n",
"\n",
"# 生成一个形状相同,元素为随机数的 Var\n",
"var_rand = jt.rand(var_data.shape, dtype=jt.float) # 重写元素数据类型\n",
"print(\"Random Var: \\n\", var_rand)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**生成一些特定的 Var**"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Random Var: \n",
" jt.Var([[0.8556649 0.16008338 0.5214482 0.98024756]\n",
" [0.02092005 0.6033252 0.08662996 0.9897186 ]\n",
" [0.20087309 0.07411052 0.57556623 0.54145 ]], dtype=float32)\n",
"Ones Var: \n",
" jt.Var([[1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]], dtype=float32)\n",
"Zeros Var: \n",
" jt.Var([[0. 0. 0. 0.]\n",
" [0. 0. 0. 0.]\n",
" [0. 0. 0. 0.]], dtype=float32)\n",
"Arange Var 1: \n",
" jt.Var([0 1 2 3 4 5 6 7 8], dtype=int32)\n",
"Arange Var 2: \n",
" jt.Var([0 2 4 6 8], dtype=int32)\n"
]
}
],
"source": [
"shape = (3,4,) # 指定将要生成 Var 的形状\n",
"rand_var = jt.rand(shape) # 生成元素为随机数的 Var\n",
"ones_var = jt.ones(shape) # 生成元素全为 1 的 Var\n",
"zeros_var = jt.zeros(shape) # 生成元素全为 0 的 Var\n",
"\n",
"print(\"Random Var: \\n\", rand_var)\n",
"print(\"Ones Var: \\n\", ones_var)\n",
"print(\"Zeros Var: \\n\", zeros_var)\n",
"\n",
"arange_var1 = jt.arange(9) # 生成元素为等差数组的一维 Var (只指定一个结束参数)\n",
"arange_var2 = jt.arange(0, 9, 2) # 生成元素为等差数组的一维 Var (指定起始、结束、步长)\n",
"print(\"Arange Var 1: \\n\", arange_var1)\n",
"print(\"Arange Var 2: \\n\", arange_var2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.3 Var 的常见属性"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Var 的形状:** 通过 var.shape 查看"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Var: \n",
" jt.Var([[ 1 2 3 4]\n",
" [ 5 6 7 8]\n",
" [ 9 10 11 12]], dtype=int32)\n",
"Shape of Var: \n",
" [3,4,]\n"
]
}
],
"source": [
"var = jt.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])\n",
"print(\"Var: \\n\", var)\n",
"print(\"Shape of Var: \\n\", var.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Var 的数据类型:** 通过 var.dtype 查看"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Var: \n",
" jt.Var([[1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]\n",
" [1. 1. 1. 1.]], dtype=float32)\n",
"Datatype of Var: \n",
" float32\n"
]
}
],
"source": [
"var = jt.ones((3,4))\n",
"print(\"Var: \\n\", var)\n",
"print(\"Datatype of Var: \\n\", var.dtype)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.4 Var 的常见操作"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**重塑形状 Reshape**"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Var1: \n",
" jt.Var([ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n",
" 24 25 26], dtype=int32)\n",
"Shape of Var1: \n",
" [27,]\n",
"Var2: \n",
" jt.Var([[[ 0 1 2]\n",
" [ 3 4 5]\n",
" [ 6 7 8]]\n",
"\n",
" [[ 9 10 11]\n",
" [12 13 14]\n",
" [15 16 17]]\n",
"\n",
" [[18 19 20]\n",
" [21 22 23]\n",
" [24 25 26]]], dtype=int32)\n",
"Shape of Var2: \n",
" [3,3,3,]\n",
"Var3: \n",
" jt.Var([[ 0 1 2 3 4 5 6 7 8]\n",
" [ 9 10 11 12 13 14 15 16 17]\n",
" [18 19 20 21 22 23 24 25 26]], dtype=int32)\n",
"Shape of Var3: \n",
" [3,9,]\n"
]
}
],
"source": [
"var1 = jt.arange(27) # 创建一个元素为 0-26 的一维 Var1\n",
"print(\"Var1: \\n\", var1)\n",
"print(\"Shape of Var1: \\n\", var1.shape)\n",
"\n",
"var2 = var1.reshape(3,3,3) # 将 Var1 重塑形状为 3*3*3 的 Var2\n",
"print(\"Var2: \\n\", var2)\n",
"print(\"Shape of Var2: \\n\", var2.shape)\n",
"\n",
"var3 = var2.reshape(3,-1) # 参数值为 -1代表将根据其他形状参数自动计算出合适的值再进行重塑形状\n",
"print(\"Var3: \\n\", var3)\n",
"print(\"Shape of Var3: \\n\", var3.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**转置 Transpose**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 矩阵转置"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Var1: \n",
" jt.Var([[ 0 1 2]\n",
" [ 3 4 5]\n",
" [ 6 7 8]\n",
" [ 9 10 11]], dtype=int32)\n",
"Shape of Var1: \n",
" [4,3,]\n",
"Var1 Transpose: \n",
" jt.Var([[ 0 3 6 9]\n",
" [ 1 4 7 10]\n",
" [ 2 5 8 11]], dtype=int32)\n",
"Shape of Var1 Transpose: \n",
" [3,4,]\n"
]
}
],
"source": [
"# (提示:这里我们用 arange 初始化一个 0 到 11 的一维 Var然后通过 reshape 将其转化为 4*3 的 Var1。\n",
"var1 = jt.arange(12).reshape(4,3) # 创建一个 4*3 的二维矩阵 Var1\n",
"print(\"Var1: \\n\", var1)\n",
"print(\"Shape of Var1: \\n\", var1.shape)\n",
"\n",
"var1_t = var1.transpose() # 矩阵转置成 3*4 的二维矩阵 Var1 Transpose\n",
"print(\"Var1 Transpose: \\n\", var1_t)\n",
"print(\"Shape of Var1 Transpose: \\n\", var1_t.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* 指定轴转置(较难)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Var1: \n",
" jt.Var([[[ 0 1 2 3]\n",
" [ 4 5 6 7]\n",
" [ 8 9 10 11]]\n",
"\n",
" [[12 13 14 15]\n",
" [16 17 18 19]\n",
" [20 21 22 23]]], dtype=int32)\n",
"Shape of Var1: \n",
" [2,3,4,]\n",
"Var1 Transpose: \n",
" jt.Var([[[ 0 4 8]\n",
" [ 1 5 9]\n",
" [ 2 6 10]\n",
" [ 3 7 11]]\n",
"\n",
" [[12 16 20]\n",
" [13 17 21]\n",
" [14 18 22]\n",
" [15 19 23]]], dtype=int32)\n",
"Shape of Var1 Transpose: \n",
" [2,4,3,]\n"
]
}
],
"source": [
"var1 = jt.arange(24).reshape(2,3,4) # 创建一个 2*3*4 的三维 Var1\n",
"print(\"Var1: \\n\", var1) # 其含义为,第一个轴上 2 个元素;第二个轴上 3 个元素;第三个轴上 4 个元素。\n",
"print(\"Shape of Var1: \\n\", var1.shape)\n",
"\n",
"var1_t = var1.transpose(0,2,1) # 根据轴索引转置。三维轴索引为 012调整索引顺序即代表对应轴调整顺序。\n",
"print(\"Var1 Transpose: \\n\", var1_t) # 从默认的“012”调整为“021”即代表后两轴进行互换。\n",
"print(\"Shape of Var1 Transpose: \\n\", var1_t.shape) # 互换后,第一个轴上 2 个元素;第二个轴上 4 个元素;第三个轴上 3 个元素。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**切片和索引**"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 Var: \n",
" jt.Var([[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]], dtype=int32)\n",
"2 Var: \n",
" jt.Var([[0 0 2]\n",
" [3 0 5]\n",
" [6 0 8]], dtype=int32)\n",
"3 Line 2 in Var: \n",
" jt.Var([3 0 5], dtype=int32)\n"
]
}
],
"source": [
"var = jt.arange(9).reshape(3,3) # 初始化一个 3*3 的 Var\n",
"print(1, \"Var: \\n\", var)\n",
"\n",
"var[:,1] = 0 # 利用切片,将任意行的第二个元素(即第二列)重置为 0\n",
"print(2, \"Var: \\n\", var)\n",
"\n",
"line_2 = var[1] # 利用索引,拿到第二行元素\n",
"print(3, \"Line 2 in Var: \\n\", line_2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**原地操作** \n",
"在计图中,我们使用 assign() 函数实现在原变量上直接操作。"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 Var0: \n",
" jt.Var([[0 1 2]\n",
" [3 4 5]], dtype=int32)\n",
"1 Var1: \n",
" jt.Var([[1 2 3]\n",
" [4 5 6]], dtype=int32)\n",
"1 Var0: \n",
" jt.Var([[0 1 2]\n",
" [3 4 5]], dtype=int32)\n",
"2 Var2: \n",
" jt.Var([[1 2 3]\n",
" [4 5 6]], dtype=int32)\n",
"2 Var0: \n",
" jt.Var([[1 2 3]\n",
" [4 5 6]], dtype=int32)\n",
"3 Var3: \n",
" jt.Var([[1 4]\n",
" [2 5]\n",
" [3 6]], dtype=int32)\n",
"3 Var0: \n",
" jt.Var([[1 2 3]\n",
" [4 5 6]], dtype=int32)\n",
"4 Var4: \n",
" jt.Var([[1 4]\n",
" [2 5]\n",
" [3 6]], dtype=int32)\n",
"4 Var0: \n",
" jt.Var([[1 4]\n",
" [2 5]\n",
" [3 6]], dtype=int32)\n"
]
}
],
"source": [
"var0 = jt.arange(6).reshape(2,3) # 初始化一个 2*3 的 Var0\n",
"print(0, \"Var0: \\n\", var0) # 打印查看 Var0\n",
"\n",
"var1 = var0.add(1) # 使 Var1 等于 Var0 上每个元素加 1\n",
"print(1, \"Var1: \\n\", var1) # 打印发现 Var1 赋值成功\n",
"print(1, \"Var0: \\n\", var0) # 但 Var0 并没有发生变化\n",
"\n",
"var2 = var0.assign(var0.add(1)) # 利用 assign() 函数,使 Var2 等于 Var0 上每个元素加 1\n",
"print(2, \"Var2: \\n\", var2) # 打印发现 Var2 赋值成功\n",
"print(2, \"Var0: \\n\", var0) # 同时 Var0 也发生了改变\n",
"\n",
"var3 = var0.transpose() # 使 Var3 等于 Var0 的转置\n",
"print(3, \"Var3: \\n\", var3) # 打印发现 Var3 赋值成功\n",
"print(3, \"Var0: \\n\", var0) # 但 Var0 并没有发生变化\n",
"\n",
"var4 = var0.assign(var0.transpose()) # 利用 assign() 函数,使 Var4 等于 Var0 的转置\n",
"print(4, \"Var4: \\n\", var4) # 打印发现 Var4 赋值成功\n",
"print(4, \"Var0: \\n\", var0) # 同时 Var0 也发生了改变"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.5 Var 的运算"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**开启 GPU 加速** \n",
"在计图中,开启 GPU 加速的方式非常简单。我们使用 jt.flags.use_cuda 表示是否使用 GPU 训练。\n",
"\n",
" \n",
"* 如果 jt.flags.use_cuda = 0表示使用 CPU 训练;\n",
"* 如果 jt.flags.use_cuda = 1表示使用 GPU 训练。"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[38;5;2m[i 0130 19:00:46.379159 88 cuda_flags.cc:26] CUDA enabled.\u001b[m\n"
]
}
],
"source": [
"jt.flags.use_cuda = 1 # 使用 GPU 训练 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Var 的加法和连接**"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var1: \n",
" jt.Var([[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]], dtype=int32)\n",
"var2: \n",
" jt.Var([[1. 1. 1.]\n",
" [1. 1. 1.]\n",
" [1. 1. 1.]], dtype=float32)\n"
]
}
],
"source": [
"# 初始化两个Var\n",
"var1 = jt.arange(9).reshape(3,3)\n",
"var2 = jt.ones((3,3))\n",
"print(\"var1: \\n\", var1)\n",
"print(\"var2: \\n\", var2)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var3: \n",
" jt.Var([[ 3 4 5]\n",
" [ 6 7 8]\n",
" [ 9 10 11]], dtype=int32)\n",
"var4: \n",
" jt.Var([[1. 2. 3.]\n",
" [4. 5. 6.]\n",
" [7. 8. 9.]], dtype=float32)\n",
"var5: \n",
" jt.Var([[0. 1. 2. 1. 1. 1.]\n",
" [3. 4. 5. 1. 1. 1.]\n",
" [6. 7. 8. 1. 1. 1.]], dtype=float32)\n"
]
}
],
"source": [
"# Var 与实数相加\n",
"var3 = var1 + 3\n",
"print(\"var3: \\n\", var3)\n",
"\n",
"# 两个 Var 相加\n",
"var4 = var1 + var2\n",
"print(\"var4: \\n\", var4)\n",
"\n",
"# 连接两个 Var \n",
"var5 = jt.concat([var1, var2], dim=1)\n",
"print(\"var5: \\n\", var5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Var 的乘法:标量相乘 / 矩阵相乘**"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var1: \n",
" jt.Var([[0 1 2]\n",
" [3 4 5]\n",
" [6 7 8]], dtype=int32)\n",
"var2: \n",
" jt.Var([[1. 1. 1.]\n",
" [1. 1. 1.]\n",
" [1. 1. 1.]], dtype=float32)\n"
]
}
],
"source": [
"# 初始化两个Var\n",
"var1 = jt.arange(9).reshape(3,3)\n",
"var2 = jt.ones((3,3))\n",
"print(\"var1: \\n\", var1)\n",
"print(\"var2: \\n\", var2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* **Var 与实数相乘:**"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var3: \n",
" jt.Var([[ 0 3 6]\n",
" [ 9 12 15]\n",
" [18 21 24]], dtype=int32)\n"
]
}
],
"source": [
"# Var 与实数相乘\n",
"var3 = var1 * 3\n",
"print(\"var3: \\n\", var3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* **两个 Var 标量相乘:**"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var4: \n",
" jt.Var([[0. 1. 2.]\n",
" [3. 4. 5.]\n",
" [6. 7. 8.]], dtype=float32)\n",
"var5: \n",
" jt.Var([[0. 1. 2.]\n",
" [3. 4. 5.]\n",
" [6. 7. 8.]], dtype=float32)\n",
"var6: \n",
" jt.Var([[0. 1. 2.]\n",
" [3. 4. 5.]\n",
" [6. 7. 8.]], dtype=float32)\n"
]
}
],
"source": [
"# 标量相乘 方式一\n",
"var4 = var1 * var2\n",
"print(\"var4: \\n\", var4)\n",
"\n",
"# 标量相乘 方式二\n",
"var5 = var1.multiply(var2)\n",
"print(\"var5: \\n\", var5)\n",
"\n",
"# 标量相乘 方式三\n",
"var6 = jt.multiply(var1, var2)\n",
"print(\"var6: \\n\", var6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* **两个 Var 矩阵相乘:**"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var7: \n",
" jt.Var([[ 3. 3. 3.]\n",
" [12. 12. 12.]\n",
" [21. 21. 21.]], dtype=float32)\n",
"var8: \n",
" jt.Var([[ 3. 3. 3.]\n",
" [12. 12. 12.]\n",
" [21. 21. 21.]], dtype=float32)\n",
"var9: \n",
" jt.Var([[ 3. 3. 3.]\n",
" [12. 12. 12.]\n",
" [21. 21. 21.]], dtype=float32)\n"
]
}
],
"source": [
"# 矩阵相乘 方式一\n",
"var7 = var1 @ var2\n",
"print(\"var7: \\n\", var7)\n",
"\n",
"# 矩阵相乘 方式二\n",
"var8 = var1.matmul(var2)\n",
"print(\"var8: \\n\", var8)\n",
"\n",
"# 矩阵相乘 方式三\n",
"var9 = jt.matmul(var1, var2)\n",
"print(\"var9: \\n\", var9)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.6 与 NumPy 的相互转化"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**从 Var 转化成 NumPy 数组**"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"var: \n",
" jt.Var([[1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]], dtype=float32)\n",
"type(var): <class 'jittor.jittor_core.Var'>\n",
"ndarray: \n",
" [[1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]]\n",
"type(ndarray): <class 'numpy.ndarray'>\n"
]
}
],
"source": [
"# 新建一个 Var\n",
"var = jt.ones((4,5))\n",
"print(\"var: \\n\", var)\n",
"print(\"type(var):\", type(var))\n",
"\n",
"# 将其转化为 NumPy 数组\n",
"ndarray = var.numpy()\n",
"print(\"ndarray: \\n\", ndarray)\n",
"print(\"type(ndarray):\", type(ndarray))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**从 NumPy 数组转化成 Var**"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ndarray: \n",
" [[1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]]\n",
"type(ndarray): <class 'numpy.ndarray'>\n",
"var: \n",
" jt.Var([[1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1.]], dtype=float64)\n",
"type(var): <class 'jittor.jittor_core.Var'>\n"
]
}
],
"source": [
"# 新建一个 NumPy 数组\n",
"ndarray = np.ones((4,5))\n",
"print(\"ndarray: \\n\", ndarray)\n",
"print(\"type(ndarray):\", type(ndarray))\n",
"\n",
"# 将其转化为 Var 类型\n",
"var = jt.array(ndarray)\n",
"print(\"var: \\n\", var)\n",
"print(\"type(var):\", type(var))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 📣\n",
"至此,第一章 - 基本概念: Var - 结束!\n",
"\n",
"恭喜您!已成功解锁了 Jittor (计图) 最核心、最基本的数据类型 - Var 类型的基本使用。 \n",
"\n",
"在掌握了 Var 类型的基本操作之后,您只需要进一步熟悉神经网络训练的一般模式,便可以利用 Jittor 解决更高阶、更实战的问题。 \n",
"请不要停下脚步,只差一点点,你就可以轻松地用 Jittor 来进行神经网络的训练啦!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}