mindflow.solver

class mindflow.solver.Solver(network, optimizer, loss_fn='l2', metrics=None, eval_network=None, eval_indexes=None, amp_level='O0', **kwargs)[源代码]

用于训练或推理的高级API。 Solver 将图层分组到具有训练和推理功能的对象中。

参数:
  • network (Cell) - 训练或测试网络。

  • optimizer (Cell) - 用于更新权重的优化器。

  • loss_fn (Union(str, dict, Cell)) - 目标函数,如果 loss_fn 为None,网络应包含逻辑损失和梯度计算。请注意,在数据模式下不支持 loss_fn 的dict类型。 默认值:“l2”。

  • metrics (Union[dict, set]) - 在训练和推理时,由模型评估的字典或metrics集。例如:{“accuracy”, “recall”}。默认值:None。

  • eval_network (Cell) - 评估网络。如果未定义,networkloss_fn 将包装为 eval_network。默认值:None。注:在PINNs模式下不需要设置 eval_network

  • eval_indexes (list) - 定义 eval_network 时,如果 eval_indexes 为None,则 eval_network 将传递给metrics,否则 eval_indexes 必须包含三个元素:损失值、预测值和标签的位置。损失值将传递给 Loss metrics,预测值和标签将传递到其他metric。默认值:None。

  • amp_level (str) - mindspore.amp.build_train_network 中参数 level 的选项,混合精确训练的级别。支持[“O0”, “O2”, “O3”, “auto”]。默认值:“O0”。

    • O0:不改变。

    • O2:将网络强制转换为float16,保持批处理规范在float32中运行,使用动态损失比例。

    • O3:将网络强制转换为float16,带有附加属性 keep_batchnorm_fp32=False

    • auto:设置为不同设备中的建议级别。在GPU上设置级别为O2,Ascend上设置级别为O3 。建议的级别由导出经验选择,不能总是保持平均数值。用户应指定特殊网络的级别。 GPU上建议使用O2,Ascend上建议使用O3。有关 amp_level 设置的详情可查阅 mindspore.amp.build_train_network

支持平台:

Ascend GPU

样例:

>>> from mindflow.solver import Solver
>>> import mindspore
>>> from mindspore import nn
...
>>> class Net(nn.Cell):
...     def __init__(self, num_class=10, num_channel=1):
...         super(Net, self).__init__()
...         self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')
...         self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')
...         self.fc1 = nn.Dense(16*5*5, 120, weight_init='ones')
...         self.fc2 = nn.Dense(120, 84, weight_init='ones')
...         self.fc3 = nn.Dense(84, num_class, weight_init='ones')
...         self.relu = nn.ReLU()
...         self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
...         self.flatten = nn.Flatten()
...
...     def construct(self, x):
...         x = self.max_pool2d(self.relu(self.conv1(x)))
...         x = self.max_pool2d(self.relu(self.conv2(x)))
...         x = self.flatten(x)
...         x = self.relu(self.fc1(x))
...         x = self.relu(self.fc2(x))
...         x = self.fc3(x)
...         return x
...
>>> net = Net()
>>> loss = nn.SoftmaxCrossEntropyWithLogits()
>>> optim = nn.Momentum(params=net.trainable_params(), learning_rate=0.1, momentum=0.9)
>>> solver = Solver(net, loss_fn=loss, optimizer=optim, metrics=None)
eval(valid_dataset, callbacks=None, dataset_sink_mode=True)[源代码]

由Python前端控制迭代的评估接口。 配置为PyNative模式或CPU,评估过程将使用数据集非下沉模式执行。

说明

如果 dataset_sink_mode 为True,则数据将发送到设备。如果设备是Ascend,则数据功能将逐个传输。每次数据传输的限制为256M。

参数:
  • valid_dataset (Dataset) - 用于评估模型的数据集。

  • callbacks (Optional[list(Callback)]) - 训练过程中应执行的回调对象的列表。默认值:None。

  • dataset_sink_mode (bool) - 确定是否通过数据集通道传递数据。默认值:True。

返回:

Dict,其键为度量的名称,值为度量的值。

样例:

>>> # For details about how to build the dataset, please refer to the tutorial
>>> # document on the official website.
>>> dataset = create_custom_dataset()
>>> acc = solver.eval(dataset, dataset_sink_mode=False)
predict(*predict_data)[源代码]

根据输入计算模型预测。

说明

这是一个预编译函数。参数应与model.predict()函数相同。

参数:
  • predict_data (Union[Tensor, tuple(Tensor)]) - 预测数据。

返回:

Tensor,预测数组。

异常:
  • TypeError - 如果 predict_data 不是Tensor或tuple[Tensor]。

样例:

>>> input_data = Tensor(np.random.randint(0, 255, [1, 1, 32, 32]), mindspore.float32)
>>> result = solver.predict(input_data)
>>> print(result.shape)
(1, 10)
train(epoch, train_dataset, callbacks=None, dataset_sink_mode=True, sink_size=- 1)[源代码]

迭代由Python前端控制的训练API。

说明

如果 dataset_sink_mode 为True,则数据将发送到设备。如果设备是Ascend,则数据功能将逐个传输。每次数据传输的限制为256M。 如果 sink_size > 0,则数据集的每个epoch都可以无限次遍历,直到从数据集中获取到 sink_size 个数的元素。下一个epoch继续从上一个遍历的结束位置遍历。

参数:
  • epoch (int) - 通常为每个epoch数据上的迭代总数。当 dataset_sink_mode 设置为true且接 sink_size > 0时,每个epoch接收 sink_size 步数,而不是迭代总数。

  • train_dataset (Dataset) - 训练数据集迭代器。如果没有 loss_fn ,将会返回具有多个数据[data1, data2, data3, …]的tuple并传递到网络。否则返回tuple[data, label]。

  • callbacks (Optional[list[Callback], Callback]) - 回调对象或回调对象的列表,会在训练时被执行。默认值:None。

  • dataset_sink_mode (bool) - 确定是否通过数据集通道传递数据。配置PyNative模式或CPU,训练过程中数据集将不会被下沉。默认值:True。

  • sink_size (int) - 控制每个下沉集中的数据量。如果 sink_size = -1,则接收每个epoch的完整数据集。如果 sink_size > 0,则每个epoch下沉 sink_size 的数据。如果 dataset_sink_mode 为False,则 sink_size 将失效。默认值:-1。

样例:

>>> # For details about how to build the dataset, please refer to the tutorial
>>> # document on the official website.
>>> dataset = create_custom_dataset()
>>> solver.train(2, dataset)
train_with_eval(epoch, train_dataset, test_dataset, eval_interval, callbacks=None, dataset_sink_mode=True, sink_size=- 1)[源代码]

迭代由Python前端控制的Train_with_eval API。

说明

如果 dataset_sink_mode 为True,则数据将发送到设备。如果设备是Ascend,则数据功能将逐个传输。每次数据传输的限制为256M。 如果 sink_size > 0,则数据集的每个epoch都可以无限次遍历,直到从数据集中获取到 sink_size 个数的元素。下一个epoch继续从上一个遍历的结束位置遍历。

参数:
  • epoch (int) - 通常为每个epoch数据上的迭代总数。当 dataset_sink_mode 设置为true且接 sink_size > 0时,每个epoch接收 sink_size 步数,而不是迭代总数。

  • train_dataset (Dataset) - 训练数据集迭代器。如果没有 loss_fn ,将会返回具有多个数据[data1, data2, data3, …]的tuple并传递到网络。否则返回tuple[data, label]。数据和标签将分别传到网络和loss函数。

  • test_dataset (Dataset) - 用于评估模型的数据集。

  • eval_interval (int) - 指定eval间隔。

  • callbacks (Optional[list[Callback], Callback]) - 回调对象或回调对象的列表,应在训练时被执行。默认值:None。

  • dataset_sink_mode (bool) - 确定是否通过数据集通道传递数据。配置PyNative模式或CPU,训练过程中数据集将不会被下沉。默认值:True。

  • sink_size (int) - 控制每个下沉集中的数据量。如果 sink_size = -1,则接收每个epoch的完整数据集。如果 sink_size > 0,则每个epoch下沉 sink_size 的数据。如果 dataset_sink_mode 为False,则 sink_size 将失效。默认值:-1。

样例:

>>> # For details about how to build the dataset, please refer to the tutorial
>>> # document on the official website.
>>> dataset = create_custom_dataset()
>>> solver.train_with_eval(20, dataset, dataset, 10)