昇思框架学习日记,《昇思25天学习打卡营第01天|lulul》
)
昇思框架学习心得
总体来说对于熟悉pytorch框架的使用者,昇思上手难度不高,不过作为国产的深度学习框架还是很值得学习的,大多数模块与torch用法都一样,能够很快速的构建网络,进行训练。
接下来我将分享一些对于第一节课程打卡的心得
昇思(Mindspore)构建网络:
# Define model
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.dense_relu_sequential = nn.SequentialCell(
nn.Dense(28*28, 512),
nn.ReLU(),
nn.Dense(512, 512),
nn.ReLU(),
nn.Dense(512, 10)
)
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
model = Network()
print(model)
通过使用nn.SequentialCell进行网络的构建,其中nn.Dense(in_features,out_features)是全连接层,nn.ReLu()和nn.Conv2d都是老伙计了激活函数和卷积(代码里没提);同时不难发现mindspore使用construct表示前向传播。
同样的我们在这里展示一段pytorch实现相同功能的代码,方便理解。
class Network(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.dense_relu_sequential = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10)
)
def forward(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
model = Network()
print(model)
这样更能够清晰的理解模型构建的区别了,但是本质都是一样的。
模型训练
模型训练通常分为三部:
- 正向计算:模型预测结果,并与标签求预测损失。
- 反向传播:利用自动微分机制(与pytorch框架一致),自动求模型参数对于loss的梯度。
- 参数优化:将梯度更新到参数上。
# Instantiate loss function and optimizer
loss_fn = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = nn.SGD(model.trainable_params(), 1e-2) # 优化器
# 1. Define forward function
def forward_fn(data, label):
logits = model(data)
loss = loss_fn(logits, label)
return loss, logits
# 2. Get gradient function
grad_fn = mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)
# 3. Define function of one-step training
def train_step(data, label):
(loss, _), grads = grad_fn(data, label)
optimizer(grads)
return loss
def train(model, dataset):
size = dataset.get_dataset_size()
model.set_train()
for batch, (data, label) in enumerate(dataset.create_tuple_iterator()):
loss = train_step(data, label)
if batch % 100 == 0:
loss, current = loss.asnumpy(), batch
print(f"loss: {loss:>7f} [{current:>3d}/{size:>3d}]")
mindspore使用value_and_grad通过函数变换获得梯度计算函数。
使用set_train设置为训练模式,执行正向计算、反向传播和参数优化。
最后附上打卡截图