日期
check-box
check-box
访问元素
- 一个元素:
[ 1 , 2 ]
- 一行:
[ 1 , : ]
- 一列:
[ : , 1 ]
- 子区域:
[ 1 : 3 , 1 : ]
- 子区域:
[ :: 3 , :: 2 ]
(三个一跳)
x = torch.arange(12)
:生成一个0到11的张量;
x.shape
可以访问张量的形状;
x.numel()
可以求这个张量所有元素的个数(注意要加括号)
- 要改变一个张量的形状而不改变元素数量和元素值,可以调用
reshape
函数,如:x.reshape(3,4)
可以将x
reshape为一个 的张量
- 创建全0的矩阵:
torch.zeros((2,3,4))
- 创建全1的矩阵:
torch.ones((2,3,4))
- 从正太分布取样:
torch.normal( E, Var, size)
- 通过提供包含数值的Python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值,如:
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
几个中括号就是几维数组
- 当tensor中有至少一个浮点数时,就会创建一个浮点张量,否则就是整数;
- 常见的标准算数运算符(
+
,-
,*
,/
和**
(幂运算))都可以被升级为按元素运算
- 按元素方式应用更多计算,如指数:
torch.exp(x)
- 我们也可以把多个张量连结在一起:
dtype = torch.float32
:指定张量中元素类型是浮点型;- 对于二维张量:
dim = 0
:沿着行堆叠;dim = 1
:沿着列堆叠; - 对于三维张量:
dim = 0
表示沿着一个 batch 堆叠;dim = 1
表示沿着行堆叠;dim = 2
表示沿着列堆叠
- 可以通过逻辑运算符构建二元张量:
- 这样会按位判断元素是否相等,并返回一个 bool 张量
- 对张量中所有元素求和并产生一个只有一个元素的张量:
x.sum()
- 注意区分,
x.sum()
是求所有元素和,结果是一个张量;而x.numel()
是求所有元素个数,结果是一个数字;
- 即使形状不同,仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作:
x[-1]
访问最后一行元素;x[:,-1]
访问最后一列元素;x[-1, -1]
访问最后一个元素;x[1:3]
选择第二行到第三行元素(冒号是左闭右开)
- 除读取外,还可以通过指定索引将元素写入矩阵;如:
x[1,2] = 9
- 为多个元素赋相同的值,我们只需要索引所有元素,然后为它们赋值:
- 运行一些操作可能会导致为新结果分配内存:
- 这里
y
的地址发生改变的原因是,x+y
相当于创建了一个新的张量,返回一个新张量,y = x+y
是一个赋值操作,将新张量赋值给y
,从而导致y
的地址发生变化
- 原地操作:
- 注意,这样不会分配新的内存的原因是,相当于将
x+y
的结果赋值给z
中的每一个元素,所以z
的地址没有改变;
- 因此,如果后续计算中没有重复使用
x
,我们可以使用x[:] = x + y
或者x += y
来减少内存操作的开销
- 转换为 NumPy 张量:
x.numpy()
- 将大小为1的张量转换为 Python 标量:
x.item()
(将x
中这个元素取出来),float(x)
将x
中这个元素取出来并变成浮点数,int(x)
将x
中这个元素取出来并变成整数 - 比如,上面用
x.sum()
求得张量中所有元素的和,是一个大小为1的张量,那么x.sum().item()
就可以得到这个张量中所有元素的和,并且是一个标量
数据预处理
- 创建一个人工数据集,并存储在
csv
文件(逗号分割值)文件
- 从创建的 csv 文件中加载原始数据集:
data = pd.read_csv(filename)
- 为了处理缺失的数据,典型的方法包括插值和删除,这里我们考虑插值:
- 对于数值域的NA,可以采用如下方法:
inputs.fillna(inputs.mean(numeric_only = True))
表示将NA用这列数据的平均值替换,注意numeric_only = True
!- 对于
inputs
中的类别值或离散值,我们将NaN
视为一个类别 - 如果不加
dtype = int
或者dtype = float
,操作完后得到的都是True
和False
,在后续操作过程中可能会报错;为了将其转化为1和0,我们加上最后这个参数。
- 现在,
inputs
和outputs
中所有条目都是数值类型,它们可以转换为张量格式 - 注意,括号中要用
.values
的原因是,inputs
和outputs
原本都是Dataframe
格式,如果不加.values
会报错,无法转化为tensor格式