占坑~
初学习,为了能以后更灵活的为自己所用,而不是想当然的去理解的话,一定要通过debug切实的看一看:1、程序运行的逻辑
2、单步执行时各变量的内容,变化 等等,我个人认为这是一种积累,一定会有帮助的。加油!~
完整程序及相关原理见第九节 实践篇 手写数字图像多分类
1、 inputs和target
def train(epoch):
running_loss = 0.0
for batch_idx, data in enumerate(train_loader, 0):
# 获得一个批次的数据和标签
inputs, target = data

可以看出data是一个列表,里面有两个值。
inputs:data的第一个值,将被inputs引用

其中,data的第一维向量的data仍然是tensor,size(data(0).data)=4, 即W H C Batch.size, (shape( data(0).data ) ,是单通道图像28*28大小的图片。

target:是 1维tensor,也就是只有batch_size个标签。
如
tensor([6, 9, 7, 2, 1, 7, 2, 5, 0, 2, 5, 3, 5, 3, 0, 5, 1, 2, 4, 3, 5, 1, 4, 2, 5, 4, 4, 5, 7, 8, 2, 6, 9, 6, 5, 9, 3, 2, 2, 6, 3, 3, 5, 9, 9, 6, 0, 6, 0, 9, 6, 8, 0, 8, 1, 6, 4, 4, 1, 5, 4, 2, 0, 9]) 64个数
2、 Net 自定义网络模型中 init函数和 forward函数 中几个变量
当程序运行到model时,单步进入(不进入源码模式)到上面的Net类中了
outputs = model(inputs)
通过Net类的自定义init
def __init__(self):
super(Net, self).__init__()
self.l1 = torch.nn.Linear(784, 512)
self.l2 = torch.nn.Linear(512, 256)
self.l3 = torch.nn.Linear(256, 128)
self.l4 = torch.nn.Linear(128, 64)
self.l5 = torch.nn.Linear(64, 10)
一直疑惑self是干啥的 ,是网络?为了满足好奇心,一探究竟,看到self里面包含了多层网络 l1 l2 l3

然后继续执行就进入forward函数中了,先执行了x.view,
x = x.view(-1, 784) # -1其实就是自动获取mini_batch
执行之后结果如下,所以全连接网络的输入是二维张量,batch_size ×一维特征(28×28=784)

3、outputs
复制出来的outputs (64*10)的value可以看到是64组,每组里面有10个值,但不是概率,因为model的最后一层输出时没有加激活函数。
outputs: tensor([[-0.0339, -0.0714, 0.0495, 0.1041, 0.0291, 0.0650, -0.0132, 0.1061,0.0077, 0.1032], … [-0.0356, -0.0719, 0.0602, 0.0620, 0.0322, 0.0581, -0.0166, 0.1007, 0.0311, 0.1042]], grad_fn=)
将outputs输入到criterion进行交叉熵损失函数计算。
4、target理解
注释里写的: target (Tensor) :
(
N
)
(N)
(N) where each value is
0
≤
targets
[
i
]
≤
C
−
1
,
0 \leq \text{targets}[i] \leq C-1 ,
0≤targets[i]≤C−1, or (N, d_1, d_2, …, d_K) where
K
≥
1
K \geq 1
K≥1 for K-dimensional loss.
loss
(
x
,
c
l
a
s
s
)
=
−
log
(
exp
(
x
[
c
l
a
s
s
]
)
∑
j
exp
(
x
[
j
]
)
)
=
−
x
[
c
l
a
s
s
]
+
log
(
∑
j
exp
(
x
[
j
]
)
)
\text{loss}(x, class) = -\log\left(\frac{\exp(x[class])}{\sum_j \exp(x[j])}\right) = -x[class] + \log\left(\sum_j \exp(x[j])\right)
loss(x,class)=−log(∑jexp(x[j])exp(x[class]))=−x[class]+log(j∑exp(x[j]))
5、loss.backward更新的谁的权值?
是self。
进行源码查看,这下来到了tensor文件中,出现了self(但这是还没执行backward函数的)


最近身体不适。。。更新频率减慢
未完待续
等待整理中
变量分析
分类任务中的target理解
onehot编码
by 小李
如果你坚持到这里了,请一定不要停,山顶的景色更迷人!好戏还在后面呢。加油!
欢迎交流学习和批评指正,你的点赞和留言将会是我更新的动力!谢谢😃
本文详细解析了深度学习中训练过程的关键环节,包括通过debug观察程序逻辑、理解inputs和target的结构、网络模型的初始化与前向传播,以及损失函数的作用。作者强调了亲手实践和深入理解每个步骤的重要性,并探讨了损失函数的计算及backpropagation更新权重的过程。适合初学者深入理解深度学习的运作机制。
8万+

被折叠的 条评论
为什么被折叠?



