深度学习第二章学习笔记

虚拟环境的存储地址:pytorch               *  C:\Users\huhuhu\MiniConda3\envs\pytorch

推出当前虚拟环境:

conda deactivate

检查是否退出:

如果你成功退出了虚拟环境,你会看到一个星号(*)标记在 base 环境旁边,表示当前你在 base 环境中:

# conda environments:
#
base                  *  /Users/<YourUsername>/anaconda3
pytorch                 /Users/<YourUsername>/anaconda3/envs/pytorch

2.1:数据操作

1、创建行向量:

张量:表示一个由数值组成的数组

创建一个含n个元素的行向量:

x = torch.arrange(n)
x

2、访问张量形状

x.shape

3、获取张量元素总数

x.numel()

4、改变张量形状

X = x.reshape(3, 4)
X

可以通过-1来自动计算出形状:

X = x.reshape(-1, 4)
X
X = x.reshape(3, -1)
X

5、创建只包含特定元素的张量

(1)创建全为0的张量:

torch.zeros((2, 3, 4))

创建了一个两层三行四列的全为0的张量

(2)创建全为1的张量:

torch.ones((2, 3, 4))

6、获取特定的形状的服从高斯分布的随机元素张量(均值为0,标准差为1)

标准差(Standard Deviation, 简称SD)是一种用于量化数据集中每个值相对于平均值(均值)的分散程度的统计指标。它反映了数据的离散程度,即数据点与均值的偏离程度。标准差越小,表示数据点越接近均值;标准差越大,表示数据点分布得越广。

torch.randn(3, 4)

7、为所需张量每个值进行赋值:

tensor:张量

torch.tensor([[2, 1, 3, 4], [1, 2, 3, 4], [4, 3, 2, 1]])

8、运算符:

求e的x次方:

x = torch.tensor([1, 2, 3, 4])
tensor.exp(x)

 9、连接两个张量:

torch.cat((X, Y), dim=0)

按0轴(行)连接两个张量。

10、对张量中所有元素求和

X.sum()

11、广播机制

进行广播的前提:

  • 维度大小一致或其中一个维度为 1

    • 对于每一个维度,两个张量的维度大小必须相等,或者其中一个维度的大小为 1。
  • 从末尾维度开始比较

    • 广播是从末尾的维度开始逐一比较的。也就是说,两个张量的末尾维度(最后一个维度)必须相等或其中一个为 1,然后逐步向前比较。

两个张量的形状不一致不能够进行运算会进行广播,多数情况下我们会对数组中长度为1的轴进行广播:

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2),reshape((1, 2))
a, b
a + b

矩阵将a复制列,矩阵b将复制行,然后元素相加

12、索引和切片

索引:

X[-1]

 切片:

X[1, 3]

取区间[1 ,3)左闭右开

可以根据指定索引将数据写入张量

X[1, 2] = 9

修改多行元素:

X[0:2, :] = 12
X

修改多列元素:

X[:, 0:2]
X

13、节省内存

通常我们在对一个张量进行运算过后,新的张量会存储在新的内存中:

before = id(y) // 获取y的内存地址
Y = Y + X
id(Y) == before

这是不可取的:

(1)我们不想总是不必要的分配内存,我们希望原地执行这些更新

(2)如果不原地更新,其他引用依然会指向就得内存位置,这样我们的某些代码会引用旧的数据

也可以使用X += Y,不能使用X = X + Y

14、转换为其他python对象

A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

 将大小为1的张量转换为python标量:

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

2.2:数据预处理:

1、处理缺失值:

pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
  • data:要转换的数据,可以是 Pandas 的 Series、DataFrame 或者包含 Series 的字典。
  • prefix:哑变量列名的前缀,可以是字符串或字符串列表。
  • prefix_sep:前缀与原始列名之间的分隔符,默认是 '_'
  • dummy_na:是否为 NaN 值创建哑变量列,默认为 False,即不创建。
  • columns:要进行转换的列名列表。如果指定了 columns,只有这些列会被转换成哑变量。
  • sparse:是否返回稀疏矩阵,默认为 False
  • drop_first:是否删除每个变量的第一个水平(category),以避免多重共线性,默认为 False
  • dtype:指定生成的哑变量的数据类型。

实例:

import pandas as pd

# 创建一个包含分类变量的 DataFrame
df = pd.DataFrame({'A': ['type1', 'type2', 'type3', 'type1', 'type2']})
print("原始数据:\n", df)

# 将分类变量转换为哑变量
dummy_df = pd.get_dummies(df['A'])
print("\n转换后的哑变量数据:\n", dummy_df)

 输出:

原始数据:
        A
0  type1
1  type2
2  type3
3  type1
4  type2

转换后的哑变量数据:
    type1  type2  type3
0      1      0      0
1      0      1      0
2      0      0      1
3      1      0      0
4      0      1      0

在这个示例中,pd.get_dummies() 将列 'A' 中的分类变量转换为哑变量。每个分类变量的每个水平(category)都会被转换成一个新的二进制列。

示例 2:使用前缀和前缀分隔符

import pandas as pd

# 创建一个包含分类变量的 DataFrame
df = pd.DataFrame({'A': ['type1', 'type2', 'type3', 'type1', 'type2']})

# 使用前缀和前缀分隔符
dummy_df = pd.get_dummies(df['A'], prefix='category', prefix_sep='-')
print(dummy_df)

输出:
 

   category-type1  category-type2  category-type3
0               1               0               0
1               0               1               0
2               0               0               1
3               1               0               0
4               0               1               0

在这个示例中,使用了前缀 'category' 和前缀分隔符 '-',生成了带有前缀的哑变量列。

2、转换为张量格式

X, y = torch.tensor(inputs.value), torch.tensor(output.values)
X, y

2.3:线性代数

1、标量

import torch
x = torch.tensor(n)
y = torch.tensor(n)

x + y, x * y

2、向量

长度和维度和形状及矩阵的转置:

维度即为数组的长度也就是数组内元素的个数:

3、张量算法

(1)两个矩阵按原素乘法:哈达玛积(Hadamard product)

 4、降维

求和:

A.sum(axis=0)

axis=0表示沿着轴0进行降维操作也就是对每一列操作

对特定的行或者列进行操作(三维或以上):

三维张量:

  • 轴0(axis 0):沿着第一个维度(深度方向)。
  • 轴1(axis 1):沿着第二个维度(行方向)。
  • 轴2(axis 2):沿着第三个维度(列方向)。
A.sum(axis=[0, 1])

求均值:

这里注意mean求均值只能对float小数进行使用

三维的张量:

沿着轴0进行操作:沿着深度进行切片,可以想象为对一个正立方体进行切割,在黑夜里沿着深度切片也就是沿着z轴即将每一个长方体内的所有数据进行降维求和:

解释:

沿着轴0和轴1求均值,意味着在第一个和第二个维度上进行降维,即对整个 4×54 \times 54×5 矩阵求均值。具体计算如下:

首先将数组展平并求和:

flattened_array = [
    0,  1,  2,  3,  4,
    5,  6,  7,  8,  9,
   10, 11, 12, 13, 14,
   15, 16, 17, 18, 19,
   20, 21, 22, 23, 24,
   25, 26, 27, 28, 29,
   30, 31, 32, 33, 34,
   35, 36, 37, 38, 39
]

每列的均值计算如下:

mean_col_0 = (0+5+10+15+20+25+30+35) / 8 = 140 / 8 = 17.5
mean_col_1 = (1+6+11+16+21+26+31+36) / 8 = 148 / 8 = 18.5
mean_col_2 = (2+7+12+17+22+27+32+37) / 8 = 156 / 8 = 19.5
mean_col_3 = (3+8+13+18+23+28+33+38) / 8 = 164 / 8 = 20.5
mean_col_4 = (4+9+14+19+24+29+34+39) / 8 = 172 / 8 = 21.5

这块可能有点不好想象,但我们可以一步一步来进行降维:

先沿深度进行降维:

a_mean0 = array_0.mean(axis=0)

再沿着横轴进行降维也就是对每一列进行操作:

这里要注意我们已经将三维降低到了两维,所以我们的轴0也就变为横轴了:

a_mean0.mean(axis=0)

5、非降维求和

保持轴数不变:

sum_A = A.sum(axis=0, keepdims=True)

由于轴数并未改变,所以我们可以通过广播将A除以sum_A

如果我们想沿某个轴计算A的元素的累计总和,可以调用consume函数,该函数不会沿任何轴降低输入张量的维度:

注意这里的求和并不是像sum那样降维操作,这里是针对每一个元素进行沿着特定轴进行求和操作

6、点积

向量是一维数组:

对两个向量进行求点积:可以用dot来求,也可以通过先对两个向量求哈达玛积然后再进行求和运算:

 7、矩阵向量积

这里注意A向量的列维数(沿着轴1的长度)要等于x的长度

8、矩阵乘积

C(m, n) = A(m, i) * B(i, n) + ..... 

9、范数

L0范数是指向量中非0的元素的个数。(L0范数很难优化求解)

L1范数是指向量中各个元素绝对值之和

L2范数是指向量各元素的平方和然后求平方根

L1范数:

弗罗贝尼乌斯范数:是矩阵元素平方和的平方根

 

import torch

# 创建一个形状为 (4, 9) 的全是1的张量
matrix = torch.ones((4, 9))

# 计算 Frobenius 范数
frobenius_norm = torch.norm(matrix, p='fro')
print(frobenius_norm)

 

相关推荐

  1. 学习笔记--第二WebGIS开发基础

    2024-06-18 13:14:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 13:14:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 13:14:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 13:14:02       82 阅读
  4. Python语言-面向对象

    2024-06-18 13:14:02       91 阅读

热门阅读

  1. 热门开源项目推荐

    2024-06-18 13:14:02       31 阅读
  2. Ubuntu服务器的GitLab部署

    2024-06-18 13:14:02       33 阅读
  3. C++ 二叉搜索树【面试】

    2024-06-18 13:14:02       37 阅读
  4. 深入解析PHP函数

    2024-06-18 13:14:02       30 阅读
  5. Python关闭exe文件

    2024-06-18 13:14:02       33 阅读
  6. camx-打开相机预览hal3接口流程

    2024-06-18 13:14:02       37 阅读