anaconda:管理开发环境
jupyter:编写整个数据处理流程
pycharm:远程编写调试代码
ipdb:pycharm dubug时偶尔出现一些bug,可以用结合ipdb补充解决
数据的获得、清洗、特征工程等预处理在这一步做,最后有一点是共同的,就是把准备好的数据进行“批量化”,因为训练模型时必须把数据批量化,最好的方法是生成数据迭代器,供后面训练时使用。
# data
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
模型的定义、初始化。
model = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
model.apply(init_weights)
定义损失函数,本质上是两个向量之前的距离,度量 y , y ^ y,\hat y y,y^ 之间的差距,可以从几何角度、熵的角度考虑,大部分可以证明是与概率极大似然等价的。
# loss
loss = nn.CrossEntropyLoss(reduction='none')
优化算法
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
《动手学习深度学习》http://zh-v2.d2l.ai/chapter_linear-networks/softmax-regression-concise.html这一节的代码有两个bug:
这一步综合了前面的步骤,有几个要点:
1 。 1^。 1。 固定套路:两层循环,外层循环控制整个训练集使用的轮数,内层循环控制batch;
2 。 2^。 2。 为了便于调试超参数,需要可视化训练过程,在训练过程中需要计算train loss、train acc、test acc,并以num_epochs、batch作为横坐标,第一个图可视化整个流程(宏观),第二个图可视化第一个epoch训练细节(微观)过程。具体图例如下:
3 。 3^。 3。 需要注意的是,画图会特别慢,所以描点不宜过多,宏观20个点左右,微观10-15个点左右。
# train
num_epochs = 20
# plt full epoch
animator = Animator(xlabel='epoch', ylabel='epoch', xlim=[1, num_epochs], ylim=[0., 1],
legend=['train loss', 'train acc', 'test acc'])
# plt each epoch
animator_batch = Animator(xlabel='batch', xlim=[1, 235], ylim=[0., 2],
legend=['train loss', 'train acc', 'test acc'])
for epoch in range(num_epochs):
# Set the model to training mode
if isinstance(model, torch.nn.Module):
model.train()
batch_idx = 0
for X, y in train_iter:
# Compute gradients and update parameters
y_hat = model(X)
l = loss(y_hat, y)
optimizer.zero_grad()
l.mean().backward()
optimizer.step()
# plt each epoch
if epoch == 0 and batch_idx % 23 == 0:
train_plt(animator_batch, batch_idx, model, train_iter)
batch_idx += 1
# plt full epoch
train_plt(animator, epoch, model, train_iter)