数据操作
首先,我们导入torch。请注意,虽然它被称为Pytorch,但我们应该导入torch而不是 Pytorch。
张量表示一个数值组成的数组,这个数组可能有多个维度。
我们可以通过张量的shape属性来访间问张量的形状和张量中元素的总数
通过shape可以查看张量的形状(维度),numel()(即number of elements的缩写)可以查看张量有多少元素
要改变一个张量的形状而不改变元素数量和元素值,我们可以调用 reshape函数。
使用全0、全1、其他常量或者从特定分布中随机采样的数字
通过提供包含数值的 Python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
或者再加一个括号制作三维张量
常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算
列表中某一个数字用浮点数,则都为浮点数
按按元素方式应用更多的计算
我们也可以把多个张量连结在一起
dim=0为按行合并,dim=1为按列合并
通过逻辑运算符构建二维张量
对张量中的所有元素进行求和会产生一个只有一个元素的张量。
即使形状不同,我们仍然可以通过调用广播机制( broadcasting mechanism)来执行按元素操作
可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素(从0开始)
除读取外,我们还可以通过指定索引来将元素写入矩阵。
为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。
上图为第0行到第1行的所有列赋值为12
运行一些操作可能会导致为新结果分配内存
id获得类似于C语言指针的东西,是Python中的唯一标识号
执行原地操作
如果在后续计算中没有重复使用X,我们也可以使用X[:]=X+Y或X+=Y来减少操作的内存开销
转换为NumPy张量
将大小为1的张量转换为Python标量
数据预处理
创建一个人工数据集,并存储在csv(逗号分隔值)文件
makedirs创建一个文件夹,os.path.join合并字符串构建一个路径,NA表示未知
从创建的csv文件中加载原始数据集
如果不用print,则会以html的形式输出
这里有一些数据是缺失的,对于数据科学家来说最重要的是怎么处理缺失的数据,或者说整个机器学习就是处理缺失的数据,要预测未来,未来的数据是不知道的,这就是缺失的数据。
为了处理缺失的数据,典型的方法包括括值和删除,这里,我们将考虑插值
fillna对所有NA的域填一个值,这里填写的是输入的平均数,而Alley这一列是没有均值的,所以不做改变
这里因为data是pandas读取的数据,所以不能直接用索引,当行列名字复杂时,可以用iloc来进行索引取值。
对于inputs中的类别值或离散值,我们将"NaN"视为一个类别。
缺失值也是数值,所以我们把缺失值变为一个数值,因为字符串不好处理,get_dummies使数据以one-hot(独热编码)格式编码,dummy_na为是否对NA进行编码。
现在 Inputs和 outputs中的所有条目都是数值类型,它们可以转換为张量格式。
注意这里是float64,传统的Python默认浮点数为64位,64位浮点数计算较慢,对于深度学习来讲,一般用32位浮点数。
QA
-
reshape和view的区别
相同之处
- 都可以用来重新调整 tensor 的形状。
不同之处
-
reshape() 可以torch.reshape(), 还可以torch.Tensor.reshape;
view()只能torch.Tensor.view()
-
view 函数只能用于 contiguous 后的 tensor 上,也就是只能用于内存中连续存储的 tensor。如果对 tensor 调用过 transpose, permute 等操作的话会使该 tensor 在内存中变得不再连续,此时就不能再调用 view 函数。因此,需要先使用 contiguous 来返回一个 contiguous copy。
-
reshape 则不需要依赖目标 tensor 是否在内存中是连续的。
对于一个将要被view的Tensor,新的size必须与原来的size和stride兼容。否则,在view之前必须调用contiguous()方法。
会发现a.stride() != b.stride(),总之在使用view()方法时候报错上图所示,就先使用一下contiguous()方法。
- 将数据reshape后,地址并没有改变
这里对b进行了改变,a也发生了变化