人工智能的三个层面:
机器学习的定义:
机器学习与专家系统的不同:
区别:是否是有意义的问题·、问题是否有解析解?
模型:主要的分类方式
数据标记:
深度学习应用研究:视觉+语言
第一次了解到python的这个库,pytorch提供了GPU加速的张量计算和构建在反向自动求导系统上的深度神经网络这两个高级功能。下面是一些demo的代码练习和记录下的一些问题:
import torch
x = torch.tensor(666)
m = torch.Tensor([[2, 5, 3, 7],[4, 2, 1, 9]])
v=torch.arange(1,5)
torch.linspace(3, 8, 20)
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])
print( torch.cat((a,b), 0))
import torch
x = torch.tensor(666)
m = torch.Tensor([[2, 5, 3, 7],[4, 2, 1, 9]])
v=torch.arange(1,5)
torch.linspace(3, 8, 20)
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])
print( torch.cat((a,b), 1))
3. 是生成 1000 个随机数,并按照 100 个 bin 统计直方图
import torch
x = torch.tensor(666)
m = torch.Tensor([[2, 5, 3, 7],[4, 2, 1, 9]])
v=torch.arange(1,5)
torch.linspace(3, 8, 20)
from matplotlib import pyplot as plt
plt.hist(torch.randn(1000).numpy(), 100);
我们可以改变随机数的值,发现10^9次方个随机数更接近正态分布
小结:在进行pytorch的基础语法的学习时,运行矩阵点积代码出现了报错:
import torch
m = torch.Tensor([[2,5,3,7], [4,2,1,9]])
v = torch.arange(1, 5)
print(m @ v)
RuntimeError: expected scalar type Float but found Long
查阅资料发现 @ 不能直接运算,因为tensor的数据类型不匹配。
torch.Tensor()是Python类,是默认张量类型torch.FloatTensor()的别名,生成单精度浮点类型的张量。
而torch.tensor()仅仅是Python的函数,根据原始数据类型生成相应的torch.LongTensor
所以在运算前,需要使用dtype进行类型的统一设置。
初始化参数
!!!注意的是在 python 中,在调用 zeros 类似的函数中的第一个参数是 y方向的,即矩阵的行;第二个参数是 才是x方向的,即矩阵的列。
增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
增加了 检查列表 功能。
代码如下:
learning_rate = 1e-3
lambda_l2 = 1e-5
model = nn.Sequential(
nn.Linear(D, H),
nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)
for t in range(1000):
y_pred = model(X)
loss = criterion(y_pred, Y)
score, predicted = torch.max(y_pred, 1)
acc = (Y == predicted).sum().float() / len(Y)
print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
display.clear_output(wait=True)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(y_pred.shape)
print(y_pred[10, :])
print(score[10])
print(predicted[10])
print(model)
plot_model(X, Y, model)
其中的nn.Sequential是一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数。
打印出的model如下,可以看到分类是线性的,而且效果很不好。一个复杂的数据分布,用线性模型难以实现准确分类,准确率也只有50%
在原先的线性模型中进行一些改动,主要是在model中加入一个激活函数ReLU,使其变成一个两层的神经网络
learning_rate = 1e-3
lambda_l2 = 1e-5
# 这里可以看到,和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数
model = nn.Sequential(
nn.Linear(D, H),
nn.ReLU(),
nn.Linear(H, C)
)
model.to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in L2
for t in range(1000):
y_pred = model(X)
loss = criterion(y_pred, Y)
score, predicted = torch.max(y_pred, 1)
acc = ((Y == predicted).sum().float() / len(Y))
print("[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f" % (t, loss.item(), acc))
display.clear_output(wait=True)
# zero the gradients before running the backward pass.
optimizer.zero_grad()
# Backward pass to compute the gradient
loss.backward()
# Update params
optimizer.step()
print(model)
plot_model(X, Y, model)