本节学习了数字大脑中信息的表示、存储和运算方式,就像大脑中神经元群体如何通过放电模式编码信息。
1. 张量-神经群体编码
离散的数字类似于单个神经元放出的电,只是单个电难以产生什么实际功能,但以特定形式组织起来可能产生神奇的效果。
张量类似于大脑中某个神经群体的放电率分布,是一种神经群体的编码,能够表示各种神经冲动的实时活动状态。
数字生物的一生,就是张量在神经网络中不断流动、变换、运算的过程—— 就像人类的一生,就是神经冲动在大脑中不断流动、传递、整合的过程。
区别:
• 张量是离散的数字编码,精度有限,只能表示有限的数值;神经编码是连续的电化学编码,精度极高,且具有极强的可塑性。
• 张量的运算速度由硬件决定,可以无限加速;神经编码的速度受限于神经冲动的传导速度,但能耗极低。
• 张量的维度是人工设计的,固定不变;神经编码的维度是自然演化的,可以通过学习不断重塑。
2. 张量的维度
维度:
标量、1d、2d、3d、4d、5d
信息:
文、文(语义)、图、图(RGB)、视频、批量视频
3. 张量的存储和操作
a.存储表示
import torch # 召唤工具箱pytorch
x = torch.arange(12) # 默认存储在cpu内存中,从0开始的12个整数,一维向量。
x.shape为torch.Size([12]) # 即一维向量,形状为12个标量。如果是torch.Size([12,1]),即二维向量,形状为12个一维向量,每一维向量的形状是1个张量。
x.numel() 为12 # 即张量中元素的总个数。
X = x.reshape(3, 4) # 将x的形状指定变换为二维向量(3个一维向量组成,每个一维向量有4个张量)也可通过`x.reshape(-1,4)`或`x.reshape(3,-1)`自动计算维度,达到此形状。
torch.zeros((2, 3, 4)) # 指定形状的数值全为0的张量
torch.ones((2, 3, 4)) # 指定形状的数值全为1的张量
torch.randn(3, 4) # 形状为(3,4)的张量,其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
torch.tensor([[2, 1, 4], [1, 2, 3], [4, 3, 2]]) # 自定义形状和元素值的张量。
b.运算(形状相同的两个张量)
• `+、-、*、/、**`:不同张量按对应元素进行加减乘除求幂
• `torch.exp(x)`:按元素求幂
• `torch.cat((X,Y),dim=0)`:将两个张量沿轴-0上拼接
• `X == Y`:对于每个位置,如果X和Y在该位置相等,则新张量中相应项的值为1。这意味着逻辑语句X == Y在该位置处为真,否则该位置为0。
• `X.sum()`:对张量中的所有元素进行求和,会产生一个单元素张量
c.广播机制(形状不同的张量,但必须各自有一轴长度为1)
a=torch.arange(3).reshape((3,1))b=torch.arange(2).reshape((1,2))a+b # a的轴-1长度为1,则轴-1可通过复制广播得到长度为2b的轴-0长度为1,可轴-0通过复制广播得到长度为3a,b均广播为形状(3,2),按元素相加得(3,2)形状
d.索引和切片
• `X[-1], X[1:3]`:`[-1]`选择最后一个元素,可以用`[1:3]`选择第二个和第三个元素。左闭右开,数字为下标。
• `X[1, 2] = 9`:通过指定索引来将元素写入矩阵
• `X[0:2, :] = 12`:为多个元素赋值相同的值。`[0:2, :]`访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素
e.节省内存
• `Y=Y+X`:开辟了新的Y的地址,原来的Y占的内存并没有被覆盖
• `Y+=X`:Y的内容被覆盖,地址没变,没有产生新的Y
f.转换为其他Python对象
A = X.numpy()B = torch.tensor(A)type(A), type(B) # (numpy.ndarray, torch.Tensor)# 两种类型可互转.X和A任一修改影响对方,B不受影响。a=torch.tensor([3.5])a,a.item(),float(a),int(a) # (tensor([3.5000]), 3.5, 3.5, 3)# 将大小为1的张量转换为Python标量
4. 数据预处理 - 感官预处理系统(眼、耳)
对原始输入数据进行清洗、归一化、标准化,就像眼睛、耳朵等感官会先对原始刺激进行过滤和转换,再传给大脑
a.读取数据集
# 创建当前目录/data/name.csv文件,将数据集按行写到csv文件中。import osos.makedirs(os.path.join('..', 'data'), exist_ok=True)data_file = os.path.join('..', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA,Pave,127500\n') # 每行表示一个数据样本f.write('2,NA,106000\n')f.write('4,NA,178100\n')f.write('NA,NA,140000\n')# 从数据集的文件加载数据集,使用工具箱pandas# 如果没有安装pandas,只需取消对以下行的注释来安装pandas# !pip install pandasimport pandas as pddata = pd.read_csv(data_file)print(data)
b.处理缺失值
csv文件中某些列的NaN表示缺失值。可以使用插值法或删除法处理NaN。其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。(这里,我们将考虑插值法)。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # 用iloc取前两列为inputs,最后一列为outputsinputs = inputs.fillna(inputs.mean()) # mean()计算inputs第二列的均值,fillna()用均值替换NaN项print(inputs)
对于inputs中的类别值或离散值,我们将"NaN"视为一个类别。由于"巷子类型"("Alley")列只接受两种类型的类别值"Pave"和"NaN",pandas可以自动将此列转换为两列"Alley_Pave"和"Alley_nan"。巷子类型为"Pave"的行会将"Alley_Pave"的值设置为1,"Alley_nan"的值设置为0。缺少巷子类型的行会将"Alley_Pave"和"Alley_nan"分别设置为0和1。
inputs = pd.get_dummies(inputs, dummy_na=True)print(inputs)
c. 转换为张量格式
上述读写的文件中的数据都是数值类型,我们需要将其转换为张量类型,从而能够使用张量的存储和操作函数。
import torchX = torch.tensor(inputs.to_numpy(dtype=float))y = torch.tensor(outputs.to_numpy(dtype=float))
注:pandas工具箱不仅可以在数值类型使用,也与张量兼容。
学习pandas:https://www.runoob.com/pandas/pandas-tutorial.html
留言
学习AI的道路就像搭建一座数字大脑,从基础的数据操作开始,一步一步构建起智能的大厦。
关注小鱼,一起游历AI世界