继续创造,加快生长!这是我参加「日新计划 6 月更文应战」的第28天,点击检查活动概况
l1 = np.zeros((784,128),dtype=np.float32)
l2 = np.zeros((128,10),dtype=np.float32)
这儿注意一下默许情梯度下降法况下,numpy 创立一个数组类型为 np.float64
所以需求手动指定一下类型为 np.float32
,然后
l1[:] = model.l1.weight.detach().numpy().transpose()
l2[:] = model.l2.weight.detach().numpy().transpose()
用 n数组和链表的区别umpy数组指针 完成前向传播
def forward(x):
x = x.dot(l1)
x = np.maximum(x,0)
x = x.dot(l2)
return x
y_test_pred = np.argmax(forward(X_test.reshape((-1,28*28))),axis=1)
(y_test_pred==Y_test).mean()
运用 numpy 进行训练
首要咱们完成一下穿插熵
y_test_pred_out[sample,Y_test[sample]]
sample = 1
-Y_test_pred_out[sample,Y_test[sample]] + np.log(np.exp(Y_test_pred_out[sample]).sum())
这儿要做便是咱们核数组和链表的区别算一切样本穿插熵损失函数
ret = -Y_test_pred_out[range(Y_test_pred_out.shape[0]),Y_test] + np.log(np.exp(Y_test_pred_out[sample]).sum())
imshow(X_test[np.argmax(ret)])
不难看出这个便是模型给出判别差错最大的一张图画,的确欠好分辩,即便对于咱们人类来说也是一张比较难于分辩的图画。
sorted(list(zip(ret,range(ret.shape[0]))),reverse=True)
grid = sorted(list(zip(ret,range(ret.shape[0]))),reverse=True)[0:16]
hard_classification_img = X_test[[x[1] for x in grid]]
#hard_classification_img.reshape(4,28*4,28).shape
hard_classification_img.shape
imshow(np.concatenate(hard_classification_img.reshape((4,28*4,28)),axis=1))
首要grid
是一个 li梯度的几何意义st 其间每一个元素是一个 tuple 类型,例如 (30.3423数组初始化94, 2607),
其间一个值 loss测试仪 值,另一个对应图画需求,咱们需求依据图画需求拿到对应的图画,hard_classification_img梯度下降的三种形式
的 shape 为 (162828)(16 time梯度公式s 28 times 28)
np.concatenate(hard_classification_img.reshape((4,28*4,28)),axis=1)
关键是看代码是怎样把 16 个 282828 times 28 图画拼接为 444 times 4 排列图画
写一个训练过程
out = model(torch.tensor(X_test[0:1].reshape((-1,28*28))).float())
loss = loss_fun(out,torch.tensor(Y_test[0:1]).long())
loss.backward()
从测试会集拿到样本输入到模型中,模型给出猜测结果,再将猜测结数组排序果和标签输入 lo梯度下降法原理ss 函数,然后对 loss 进行反向传播回传梯度,用梯度来数组去重方法更新模型参数
model.zero_grad()
out = model(torch.tensor(X_test[0:1].reshape((-1,28*28))).float())
loss = loss_fun(out,torch.tensor(Y_test[0:1]).long())
loss.backward()
figsize(16,16)
imshow(model.l1.weight.grad)
将梯度以图画形式输出便于调查,从测试抑郁程度的问卷图上来看大部分梯度都是 0。
figure()
imshow(model.l2.weight.grad)
model.zero_grad()
out = model(torch.tensor(X_test[0:1].reshape((-1,28*28))).float())
loss = loss_fun(out,torch.tensor(Y_test[0:1]).long())
print(loss)
loss.retain_grad()
loss.backward()
figsize(16,16)
imshow(model.l1.weight.grad)
figure()
imshow(model.l2.weight.grad)
这儿retain_grad()
能够保存非叶子结点以外中心结点的梯度,默许情况下为了节约内存空间是不会保存中心结点非叶子结点的梯度的。
#理解梯度下降
model.zero_grad()
out = model(torch.tensor(X_test[0:1].reshape((-1,28*28))).float())
out.retain_grad()
loss = loss_fun(out,torch.tensor(Y_test[0:1]).long())
# print(loss)
loss.retain_grad()
loss.backward()
figsize(16,16)
imshow(model.l1.weight.grad)
figure()
imshow(model.l2.weight.grad)
out.grad,loss.grad
输出变量的定义 out
和 loss
的梯度,ret梯度下降法的目标是ain_grad
表明中心变量
(tensor([[ 8.8083e-11, 7.9277e-13, 4.0970e-04, 4.5061e-05, 1.6520e-12, 4.4796e-08, 9.0004e-15, -4.5484e-04, 1.1185e-10, 3.0328e-08]]), tensor(1.))
...
loss_fun = nn.CrossEntropyLoss(reduction='none')
...
for i in tbar:
...
loss = loss_fun(out,Y)
print(loss.shape)
# print(loss.mean())
loss = loss.mean()
loss.backward()
optim.step()
# print(loss)
这儿将 red测试你的自卑程度uction
设置为 none
在每次迭代时,不会对 loss
进行求均值或许求和,所以需求手动los数组去重方法s.mea测试你的自卑程度n()
进行求均值。
将 CrossEntropy测试工程师Loss
拆分为梯度公式 LogSoftmax
和 NLLLoss
。
class ANet(torch.nn.Module):
def __init__(self):
...
self.sm = nn.LogSoftmax(dim=1)
def forward(self,x):
...
x = self.sm(x)
return x
model = ANet()
loss_fun = nn.NLLLoss(reduction='none')