mindelec.solver.Solver
- class mindelec.solver.Solver(network, optimizer, loss_fn='l2', mode='Data', train_constraints=None, test_constraints=None, train_input_map=None, test_input_map=None, mtl_weighted_cell=None, latent_vector=None, latent_reg=0.01, 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”。
mode (str) - 模型的类型。支持[“Data”, “PINNs”]。默认值:”Data”。
Data:模型是data_driven。
PINNs:模型是physics_informed。
train_constraints (Constraints) - 训练数据集损失的定义。默认值:None。如果模式是PINNs,则 train_constraints 不能为None。
test_constraints (Constraints) - 测试数据集损失的定义。默认值:None。如果模式为PINNs,且需要执行 eval (见类中的 train_with_eval 和 eval 函数)时, test_constraints 不能为None。
train_input_map (dict) - 在训练时,指定相应数据集中数据的列名进入网络。key为数据集的名称,value为在相应的数据集中的数据列名进入网络。默认值:None。如果模型的输入不是单个, train_input_map 不能为None。
test_input_map (dict) - 在执行评估时,指定相应数据集中数据的列名进入网络。key为数据集的名称,value为进入网络数据集中的列名。默认值:None。如果模型的输入不是单个且需要eval,则 test_input_map 不能为None。
mtl_weighted_cell (Cell) - 基于多任务学习不确定性评估的损失加权算法。默认值:None。
latent_vector (Parameter) - 参数的Tensor。控制方程中,用于编码变分参数的潜在向量。它将与采样数据连接在一起,作为最终网络输入。默认值:None。
latent_reg (float) - 潜在向量的正则化系数。默认值:1e-2。
metrics (Union[dict, set]) - 在训练和推理时,由模型评估的字典或metrics集。例如:{‘accuracy’, ‘recall’}。默认值:None。
eval_network (Cell) - 评估网络。如果未定义,network 和 loss_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
样例:
>>> from mindelec.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 (Union[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 (Union[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)