机器学习的一般框架

数据科学开发工具

anaconda:管理开发环境
jupyter:编写整个数据处理流程
pycharm:远程编写调试代码
ipdb:pycharm dubug时偶尔出现一些bug,可以用结合ipdb补充解决

数据开发六步

data

数据的获得、清洗、特征工程等预处理在这一步做,最后有一点是共同的,就是把准备好的数据进行“批量化”,因为训练模型时必须把数据批量化,最好的方法是生成数据迭代器,供后面训练时使用。

# data
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

model

模型的定义、初始化。

model = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
model.apply(init_weights)

loss

定义损失函数,本质上是两个向量之前的距离,度量 y , y ^ y,\hat y y,y^ 之间的差距,可以从几何角度、熵的角度考虑,大部分可以证明是与概率极大似然等价的。

# loss
loss = nn.CrossEntropyLoss(reduction='none')

optimization

优化算法

optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

train

《动手学习深度学习》http://zh-v2.d2l.ai/chapter_linear-networks/softmax-regression-concise.html这一节的代码有两个bug:

  1. metric.add(float(l.sum()), accuracy(y_hat, y), y.numel()) ,不同的数据,不同的模型,最后对模型表现进行平均,没有什么意义;
  2. trani loss、train acc两条线近似于平线,并没有观察到训练的细节现象;

这一步综合了前面的步骤,有几个要点:
1 。 1^。 1 固定套路:两层循环,外层循环控制整个训练集使用的轮数,内层循环控制batch;
2 。 2^。 2 为了便于调试超参数,需要可视化训练过程,在训练过程中需要计算train loss、train acc、test acc,并以num_epochs、batch作为横坐标,第一个图可视化整个流程(宏观),第二个图可视化第一个epoch训练细节(微观)过程。具体图例如下:
机器学习的一般框架_第1张图片
机器学习的一般框架_第2张图片

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)

你可能感兴趣的:(深度学习算法,python,深度学习)