| @@ -7,26 +7,24 @@ | |||||
| 数据集可从本项目的数据集中引用,[数据集引用](https://git.openi.org.cn/OpenIOSSG/MNIST_Example/datasets?type=1) | 数据集可从本项目的数据集中引用,[数据集引用](https://git.openi.org.cn/OpenIOSSG/MNIST_Example/datasets?type=1) | ||||
| - MNISTData数据集是由10类28∗28的灰度图片组成,训练数据集包含60000张图片,测试数据集包含10000张图片。 | |||||
| - MNIST_Data.zip数据集压缩包的目录结构如下: | |||||
| > MNIST_Data.zip | |||||
| > ├── test | |||||
| > │ ├── t10k-images-idx3-ubyte | |||||
| > │ └── t10k-labels-idx1-ubyte | |||||
| > └── train | |||||
| > ├── train-images-idx3-ubyte | |||||
| > └── train-labels-idx1-ubyte | |||||
| - MnistDataset_torch数据集是由10类28∗28的灰度图片组成,训练数据集包含60000张图片,测试数据集包含10000张图片。 | |||||
| - MnistDataset_torch.zip数据集压缩包的目录结构如下: | |||||
| > MnistDataset_torch.zip | |||||
| > | |||||
| > ├── test | |||||
| > | |||||
| > └── train | |||||
| > | > | ||||
| ##### 2,预训练模型说明: | ##### 2,预训练模型说明: | ||||
| checkpoint_lenet-1_1875模型可从本项目的模型目录中引用,[预训练模型引用]() | |||||
| Torch_MNIST_Example_Model模型可从本项目的模型目录中引用,[预训练模型引用]() | |||||
| * checkpoint_lenet-1_1875模型的目录结构如下: | |||||
| * Torch_MNIST_Example_Model模型的目录结构如下: | |||||
| > checkpoint_lenet-1_1875 | |||||
| > ├── checkpoint_lenet-1_1875.ckpt | |||||
| > Torch_MNIST_Example_Model | |||||
| > ├── mnist_epoch1_0.76.pkl | |||||
| > | > | ||||
| ## 二. 如何在云脑上获取代码路径,数据集路径,预训练模型路径,输出路径 | ## 二. 如何在云脑上获取代码路径,数据集路径,预训练模型路径,输出路径 | ||||
| @@ -51,7 +49,7 @@ code_path = c2net_context.code_path + "/" + "Openl_Cloudbrain_Example" | |||||
| ``` | ``` | ||||
| dataset_path = c2net_context.dataset_path +"/" +"数据集名称" | dataset_path = c2net_context.dataset_path +"/" +"数据集名称" | ||||
| 在本示例中代码路径为: | 在本示例中代码路径为: | ||||
| dataset_path = c2net_context.dataset_path + "/" + "MNIST_Data" | |||||
| dataset_path = c2net_context.dataset_path + "/" + "MnistDataset_torch" | |||||
| ``` | ``` | ||||
| ##### 4,获取预训练模型路径 | ##### 4,获取预训练模型路径 | ||||
| @@ -59,7 +57,7 @@ dataset_path = c2net_context.dataset_path + "/" + "MNIST_Data" | |||||
| ``` | ``` | ||||
| pretrain_model_path = c2net_context.pretrain_model_path +"/" +"模型名称" | pretrain_model_path = c2net_context.pretrain_model_path +"/" +"模型名称" | ||||
| 在本示例中预训练模型路径为: | 在本示例中预训练模型路径为: | ||||
| pretrain_model_path = c2net_context.pretrain_model_path + "/" + "checkpoint_lenet-1_1875" | |||||
| pretrain_model_path = c2net_context.pretrain_model_path + "/" + "Torch_MNIST_Example_Model" | |||||
| ``` | ``` | ||||
| ##### 5,获取输出路径 | ##### 5,获取输出路径 | ||||
| @@ -96,9 +94,10 @@ upload_output() | |||||
| | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | ||||
| | 镜像 | 镜像选择含有python和torch的镜像 | | | 镜像 | 镜像选择含有python和torch的镜像 | | ||||
| | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择gpu_mnist_example/train.py | | | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择gpu_mnist_example/train.py | | ||||
| | 数据集 | 数据集选择MNIST_Data.zip | | |||||
| | 数据集 | 数据集选择MnistDataset_torch.zip | | |||||
| | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | ||||
| | 资源规格 | 规格选择[GPU] | | | 资源规格 | 规格选择[GPU] | | ||||
| | 模型 | 模型选择Torch_MNIST_Example_Model | | |||||
| 启动调试任务后,先执行prepare()进行数据准备; | 启动调试任务后,先执行prepare()进行数据准备; | ||||
| @@ -113,10 +112,10 @@ upload_output() | |||||
| | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | ||||
| | 镜像 | 镜像选择含有python和torch的镜像 | | | 镜像 | 镜像选择含有python和torch的镜像 | | ||||
| | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择gpu_mnist_example/train.py | | | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择gpu_mnist_example/train.py | | ||||
| | 数据集 | 数据集选择MNIST_Data.zip | | |||||
| | 数据集 | 数据集选择MnistDataset_torch.zip | | |||||
| | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | ||||
| | 资源规格 | 规格选择[GPU] | | | 资源规格 | 规格选择[GPU] | | ||||
| | 模型 | 模型选择checkpoint_lenet-1_1875 | | |||||
| | 模型 | 模型选择Torch_MNIST_Example_Model | | |||||
| 启动训练任务后,训练结束会在任务的结果下载页提供输出结果下载 | 启动训练任务后,训练结束会在任务的结果下载页提供输出结果下载 | ||||
| @@ -66,18 +66,17 @@ if __name__ == '__main__': | |||||
| #初始化导入数据集和预训练模型到容器内 | #初始化导入数据集和预训练模型到容器内 | ||||
| c2net_context = prepare() | c2net_context = prepare() | ||||
| #获取数据集路径 | #获取数据集路径 | ||||
| checkpoint_lenet_1_1875_path = c2net_context.dataset_path+"/"+"checkpoint_lenet-1_1875" | |||||
| MnistDataset_torch = c2net_context.dataset_path+"/"+"MnistDataset_torch" | |||||
| MnistDataset_torch_path = c2net_context.dataset_path+"/"+"MnistDataset_torch" | |||||
| #获取预训练模型路径 | #获取预训练模型路径 | ||||
| mnist_example_test2_model_djts_path = c2net_context.pretrain_model_path+"/"+"MNIST_Example_test2_model_djts" | |||||
| Torch_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Torch_MNIST_Example_Model" | |||||
| #log output | #log output | ||||
| print('cuda is available:{}'.format(torch.cuda.is_available())) | print('cuda is available:{}'.format(torch.cuda.is_available())) | ||||
| device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | ||||
| batch_size = args.batch_size | batch_size = args.batch_size | ||||
| epochs = args.epoch_size | epochs = args.epoch_size | ||||
| test_dataset = mnist.MNIST(root=MnistDataset_torch + "/test", train=False, transform=ToTensor(),download=False) | |||||
| test_dataset = mnist.MNIST(root=MnistDataset_torch_path + "/test", train=False, transform=ToTensor(),download=False) | |||||
| test_loader = DataLoader(test_dataset, batch_size=batch_size) | test_loader = DataLoader(test_dataset, batch_size=batch_size) | ||||
| model = Model().to(device) | model = Model().to(device) | ||||
| checkpoint = torch.load(mnist_example_test2_model_djts_path + "/mnist_epoch1.pkl") | |||||
| checkpoint = torch.load(Torch_MNIST_Example_Model_path + "/mnist_epoch1.pkl") | |||||
| model.load_state_dict(checkpoint['model']) | model.load_state_dict(checkpoint['model']) | ||||
| test(model,test_loader,len(test_dataset)) | test(model,test_loader,len(test_dataset)) | ||||
| @@ -80,24 +80,23 @@ if __name__ == '__main__': | |||||
| #初始化导入数据集和预训练模型到容器内 | #初始化导入数据集和预训练模型到容器内 | ||||
| c2net_context = prepare() | c2net_context = prepare() | ||||
| #获取数据集路径 | #获取数据集路径 | ||||
| checkpoint_lenet_1_1875_path = c2net_context.dataset_path+"/"+"checkpoint_lenet-1_1875" | |||||
| MnistDataset_torch = c2net_context.dataset_path+"/"+"MnistDataset_torch" | |||||
| MnistDataset_torch_path = c2net_context.dataset_path+"/"+"MnistDataset_torch" | |||||
| #获取预训练模型路径 | #获取预训练模型路径 | ||||
| mnist_example_test2_model_djts_path = c2net_context.pretrain_model_path+"/"+"MNIST_Example_test2_model_djts" | |||||
| Torch_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Torch_MNIST_Example_Model" | |||||
| #log output | #log output | ||||
| print('cuda is available:{}'.format(torch.cuda.is_available())) | print('cuda is available:{}'.format(torch.cuda.is_available())) | ||||
| device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | ||||
| batch_size = args.batch_size | batch_size = args.batch_size | ||||
| epochs = args.epoch_size | epochs = args.epoch_size | ||||
| train_dataset = mnist.MNIST(root=os.path.join(MnistDataset_torch, "train"), train=True, transform=ToTensor(),download=False) | |||||
| test_dataset = mnist.MNIST(root=os.path.join(MnistDataset_torch, "test"), train=False, transform=ToTensor(),download=False) | |||||
| train_dataset = mnist.MNIST(root=os.path.join(MnistDataset_torch_path, "train"), train=True, transform=ToTensor(),download=False) | |||||
| test_dataset = mnist.MNIST(root=os.path.join(MnistDataset_torch_path, "test"), train=False, transform=ToTensor(),download=False) | |||||
| train_loader = DataLoader(train_dataset, batch_size=batch_size) | train_loader = DataLoader(train_dataset, batch_size=batch_size) | ||||
| test_loader = DataLoader(test_dataset, batch_size=batch_size) | test_loader = DataLoader(test_dataset, batch_size=batch_size) | ||||
| #如果有保存的模型,则加载模型,并在其基础上继续训练 | #如果有保存的模型,则加载模型,并在其基础上继续训练 | ||||
| if os.path.exists(os.path.join(mnist_example_test2_model_djts_path, "mnist_epoch1_0.76.pkl")): | |||||
| checkpoint = torch.load(os.path.join(mnist_example_test2_model_djts_path, "mnist_epoch1_0.76.pkl")) | |||||
| if os.path.exists(os.path.join(Torch_MNIST_Example_Model_path, "mnist_epoch1_0.76.pkl")): | |||||
| checkpoint = torch.load(os.path.join(Torch_MNIST_Example_Model_path, "mnist_epoch1_0.76.pkl")) | |||||
| model.load_state_dict(checkpoint['model']) | model.load_state_dict(checkpoint['model']) | ||||
| optimizer.load_state_dict(checkpoint['optimizer']) | optimizer.load_state_dict(checkpoint['optimizer']) | ||||
| start_epoch = checkpoint['epoch'] | start_epoch = checkpoint['epoch'] | ||||
| @@ -6,10 +6,10 @@ | |||||
| 数据集可从本项目的数据集中引用,[数据集引用](https://git.openi.org.cn/OpenIOSSG/MNIST_Example/datasets?type=1) | 数据集可从本项目的数据集中引用,[数据集引用](https://git.openi.org.cn/OpenIOSSG/MNIST_Example/datasets?type=1) | ||||
| - MNISTData数据集是由10类28∗28的灰度图片组成,训练数据集包含60000张图片,测试数据集包含10000张图片。 | |||||
| - MNISTData.zip数据集压缩包的目录结构如下: | |||||
| - MnistDataset_mindspore数据集是由10类28∗28的灰度图片组成,训练数据集包含60000张图片,测试数据集包含10000张图片。 | |||||
| - MnistDataset_mindspore.zip数据集压缩包的目录结构如下: | |||||
| > MNISTData.zip | |||||
| > MnistDataset_mindspore.zip | |||||
| > ├── test | > ├── test | ||||
| > │ ├── t10k-images-idx3-ubyte | > │ ├── t10k-images-idx3-ubyte | ||||
| > │ └── t10k-labels-idx1-ubyte | > │ └── t10k-labels-idx1-ubyte | ||||
| @@ -50,7 +50,7 @@ code_path = c2net_context.code_path + "/" + "Openl_Cloudbrain_Example" | |||||
| ``` | ``` | ||||
| dataset_path = c2net_context.dataset_path +"/" +"数据集名称" | dataset_path = c2net_context.dataset_path +"/" +"数据集名称" | ||||
| 在本示例中代码路径为: | 在本示例中代码路径为: | ||||
| dataset_path = c2net_context.dataset_path + "/" + "MNISTData" | |||||
| dataset_path = c2net_context.dataset_path + "/" + "MnistDataset_mindspore" | |||||
| ``` | ``` | ||||
| ##### 4,获取预训练模型路径 | ##### 4,获取预训练模型路径 | ||||
| @@ -97,7 +97,7 @@ upload_output() | |||||
| | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | ||||
| | 镜像 | 镜像选择mindspore_1.10.1 | | | 镜像 | 镜像选择mindspore_1.10.1 | | ||||
| | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择npu_mnist_example/train.py | | | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择npu_mnist_example/train.py | | ||||
| | 数据集 | 数据集选择MNISTData.zip | | |||||
| | 数据集 | 数据集选择MnistDataset_mindspore.zip | | |||||
| | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | ||||
| | 资源规格 | 规格选择[Ascend: 1 * Ascend 910 CPU:24 核 256GiB],表示单机单卡 | | | 资源规格 | 规格选择[Ascend: 1 * Ascend 910 CPU:24 核 256GiB],表示单机单卡 | | ||||
| | 模型 | 模型可选择Mindspore_MNIST_Example_Model | | | 模型 | 模型可选择Mindspore_MNIST_Example_Model | | ||||
| @@ -115,7 +115,7 @@ upload_output() | |||||
| | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | | 代码分支 | 选择仓库代码中要使用的代码分支,默认可选择master分支 | | ||||
| | 镜像 | 镜像选择mindspore_1.10.1 | | | 镜像 | 镜像选择mindspore_1.10.1 | | ||||
| | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择npu_mnist_example/train.py | | | 启动文件 | 启动文件选择代码目录下的启动脚本,在本示例中选择npu_mnist_example/train.py | | ||||
| | 数据集 | 数据集选择MNISTData.zip | | |||||
| | 数据集 | 数据集选择MnistDataset_mindspore.zip | | |||||
| | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | | 运行参数 | 选择增加运行参数可以向脚本中其他参数传值,如epoch_size,需要在代码里定义增加的超参数 | | ||||
| | 资源规格 | 规格选择[Ascend: 1 * Ascend 910 CPU:24 核 256GiB],表示单机单卡 | | | 资源规格 | 规格选择[Ascend: 1 * Ascend 910 CPU:24 核 256GiB],表示单机单卡 | | ||||
| | 模型 | 模型选择Mindspore_MNIST_Example_Model | | | 模型 | 模型选择Mindspore_MNIST_Example_Model | | ||||
| @@ -1,9 +1,9 @@ | |||||
| """ | """ | ||||
| 示例选用的数据集是MNISTData.zip | |||||
| 示例选用的数据集是MnistDataset_mindspore.zip | |||||
| 数据集结构是: | 数据集结构是: | ||||
| MNISTData.zip | |||||
| MnistDataset_mindspore.zip | |||||
| ├── test | ├── test | ||||
| │ ├── t10k-images-idx3-ubyte | │ ├── t10k-images-idx3-ubyte | ||||
| │ └── t10k-labels-idx1-ubyte | │ └── t10k-labels-idx1-ubyte | ||||
| @@ -52,7 +52,7 @@ if __name__ == "__main__": | |||||
| #初始化导入数据集和预训练模型到容器内 | #初始化导入数据集和预训练模型到容器内 | ||||
| c2net_context = prepare() | c2net_context = prepare() | ||||
| #获取数据集路径 | #获取数据集路径 | ||||
| mnistdata_path = c2net_context.dataset_path+"/"+"MNISTData" | |||||
| MnistDataset_mindspore_path = c2net_context.dataset_path+"/"+"MnistDataset_mindspore" | |||||
| #获取预训练模型路径 | #获取预训练模型路径 | ||||
| Mindspore_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Mindspore_MNIST_Example_Model" | Mindspore_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Mindspore_MNIST_Example_Model" | ||||
| #获取输出路径 | #获取输出路径 | ||||
| @@ -69,7 +69,7 @@ if __name__ == "__main__": | |||||
| print("============== Starting Testing ==============") | print("============== Starting Testing ==============") | ||||
| load_param_into_net(network, load_checkpoint(os.path.join(Mindspore_MNIST_Example_Model_path, "checkpoint_lenet-1_1875.ckpt"))) | load_param_into_net(network, load_checkpoint(os.path.join(Mindspore_MNIST_Example_Model_path, "checkpoint_lenet-1_1875.ckpt"))) | ||||
| ds_test = create_dataset(os.path.join(mnistdata_path, "test"), batch_size=1).create_dict_iterator() | |||||
| ds_test = create_dataset(os.path.join(MnistDataset_mindspore_path, "test"), batch_size=1).create_dict_iterator() | |||||
| data = next(ds_test) | data = next(ds_test) | ||||
| images = data["image"].asnumpy() | images = data["image"].asnumpy() | ||||
| labels = data["label"].asnumpy() | labels = data["label"].asnumpy() | ||||
| @@ -1,9 +1,9 @@ | |||||
| """ | """ | ||||
| 示例选用的数据集是MNISTData.zip | |||||
| 示例选用的数据集是MnistDataset_mindspore.zip | |||||
| 数据集结构是: | 数据集结构是: | ||||
| MNISTData.zip | |||||
| MnistDataset_mindspore.zip | |||||
| ├── test | ├── test | ||||
| │ ├── t10k-images-idx3-ubyte | │ ├── t10k-images-idx3-ubyte | ||||
| │ └── t10k-labels-idx1-ubyte | │ └── t10k-labels-idx1-ubyte | ||||
| @@ -52,7 +52,7 @@ if __name__ == "__main__": | |||||
| #初始化导入数据集和预训练模型到容器内 | #初始化导入数据集和预训练模型到容器内 | ||||
| c2net_context = prepare() | c2net_context = prepare() | ||||
| #获取数据集路径 | #获取数据集路径 | ||||
| mnistdata_path = c2net_context.dataset_path+"/"+"MNISTData" | |||||
| MnistDataset_mindspore_path = c2net_context.dataset_path+"/"+"MnistDataset_mindspore" | |||||
| #获取预训练模型路径 | #获取预训练模型路径 | ||||
| Mindspore_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Mindspore_MNIST_Example_Model" | Mindspore_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Mindspore_MNIST_Example_Model" | ||||
| #获取输出路径 | #获取输出路径 | ||||
| @@ -60,7 +60,7 @@ if __name__ == "__main__": | |||||
| context.set_context(mode=context.GRAPH_MODE,device_target=args.device_target) | context.set_context(mode=context.GRAPH_MODE,device_target=args.device_target) | ||||
| #使用数据集的方式 | #使用数据集的方式 | ||||
| ds_train = create_dataset(os.path.join(mnistdata_path, "train"), cfg.batch_size) | |||||
| ds_train = create_dataset(os.path.join(MnistDataset_mindspore_path, "train"), cfg.batch_size) | |||||
| network = LeNet5(cfg.num_classes) | network = LeNet5(cfg.num_classes) | ||||
| net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") | net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") | ||||
| net_opt = nn.Momentum(network.trainable_params(), cfg.lr, cfg.momentum) | net_opt = nn.Momentum(network.trainable_params(), cfg.lr, cfg.momentum) | ||||
| @@ -1,9 +1,9 @@ | |||||
| """ | """ | ||||
| 示例选用的数据集是MNISTData.zip | |||||
| 示例选用的数据集是MnistDataset_mindspore.zip | |||||
| 数据集结构是: | 数据集结构是: | ||||
| MNISTData.zip | |||||
| MnistDataset_mindspore.zip | |||||
| ├── test | ├── test | ||||
| │ ├── t10k-images-idx3-ubyte | │ ├── t10k-images-idx3-ubyte | ||||
| │ └── t10k-labels-idx1-ubyte | │ └── t10k-labels-idx1-ubyte | ||||
| @@ -64,7 +64,7 @@ if __name__ == "__main__": | |||||
| #初始化导入数据集和预训练模型到容器内 | #初始化导入数据集和预训练模型到容器内 | ||||
| c2net_context = prepare() | c2net_context = prepare() | ||||
| #获取数据集路径 | #获取数据集路径 | ||||
| mnistdata_path = c2net_context.dataset_path+"/"+"MNISTData" | |||||
| MnistDataset_mindspore_path = c2net_context.dataset_path+"/"+"MnistDataset_mindspore" | |||||
| #获取预训练模型路径 | #获取预训练模型路径 | ||||
| Mindspore_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Mindspore_MNIST_Example_Model" | Mindspore_MNIST_Example_Model_path = c2net_context.pretrain_model_path+"/"+"Mindspore_MNIST_Example_Model" | ||||
| output_path = c2net_context.output_path | output_path = c2net_context.output_path | ||||
| @@ -79,7 +79,7 @@ if __name__ == "__main__": | |||||
| print("download_input failed") | print("download_input failed") | ||||
| while not os.path.exists("/cache/download_input.txt"): | while not os.path.exists("/cache/download_input.txt"): | ||||
| time.sleep(1) | time.sleep(1) | ||||
| ds_train = create_dataset_parallel(os.path.join(mnistdata_path, "train"), cfg.batch_size) | |||||
| ds_train = create_dataset_parallel(os.path.join(MnistDataset_mindspore_path, "train"), cfg.batch_size) | |||||
| network = LeNet5(cfg.num_classes) | network = LeNet5(cfg.num_classes) | ||||
| net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") | net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") | ||||