# LeNet5 mnist import os # os.environ['DEVICE_ID'] = '0' import mindspore as ms import mindspore.context as context import mindspore.dataset.transforms.c_transforms as C import mindspore.dataset.transforms.vision.c_transforms as CV from mindspore import nn from mindspore.train import Model from mindspore.train.callback import LossMonitor context.set_context(mode=context.GRAPH_MODE, device_target='Ascend') DATA_DIR_TRAIN = "MNIST/train" # 训练集信息 DATA_DIR_TEST = "MNIST/test" # 测试集信息 def create_dataset(training=True, num_epoch=1, batch_size=32, resize=(32, 32), rescale=1/(255*0.3081), shift=-0.1307/0.3081, buffer_size=64): ds = ms.dataset.MnistDataset(DATA_DIR_TRAIN if training else DATA_DIR_TEST) ds = ds.map(input_columns="image", operations=[CV.Resize(resize), CV.Rescale(rescale, shift), CV.HWC2CHW()]) ds = ds.map(input_columns="label", operations=C.TypeCast(ms.int32)) ds = ds.shuffle(buffer_size=buffer_size).batch(batch_size, drop_remainder=True).repeat(num_epoch) return ds class LeNet5(nn.Cell): def __init__(self): super(LeNet5, self).__init__() self.relu = nn.ReLU() self.conv1 = nn.Conv2d(1, 6, 5, stride=1, pad_mode='valid') self.conv2 = nn.Conv2d(6, 16, 5, stride=1, pad_mode='valid') self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.flatten = nn.Flatten() self.fc1 = nn.Dense(400, 120) self.fc2 = nn.Dense(120, 84) self.fc3 = nn.Dense(84, 10) def construct(self, input_x): output = self.conv1(input_x) output = self.relu(output) output = self.pool(output) output = self.conv2(output) output = self.relu(output) output = self.pool(output) output = self.flatten(output) output = self.fc1(output) output = self.fc2(output) output = self.fc3(output) return output def test_train(lr=0.01, momentum=0.9, num_epoch=3, ckpt_name="a_lenet"): ds_train = create_dataset(num_epoch=num_epoch) ds_eval = create_dataset(training=False) net = LeNet5() loss = nn.loss.SoftmaxCrossEntropyWithLogits(is_grad=False, sparse=True, reduction='mean') opt = nn.Momentum(net.trainable_params(), lr, momentum) loss_cb = LossMonitor(per_print_times=1) model = Model(net, loss, opt, metrics={'acc', 'loss'}) model.train(num_epoch, ds_train, callbacks=[loss_cb]) metrics = model.eval(ds_eval) print('Metrics:', metrics) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument('--data_url', required=True, default=None, help='Location of data.') parser.add_argument('--train_url', required=True, default=None, help='Location of training outputs.') parser.add_argument('--num_epochs', type=int, default=1, help='Number of training epochs.') args, unknown = parser.parse_known_args() import moxing as mox mox.file.copy_parallel(src_url=args.data_url, dst_url='MNIST/') test_train()