05 网络构建 网络构建神经网络模型由神经网络层和Tensor操作构成mindspore.nn提供了常见神经网络层的实现。在MindSpore中Cell类是构建所有网络的基类也是网络的基本单元。一个神经网络模型可表示为一个Cell由不同的子Cell构成。使用这样的嵌套结构可以简单地使用面向对象编程的思维对神经网络结构进行构建和管理。下面我们将构建一个用于Mnist数据集分类的神经网络模型。importmindsporefrommindsporeimportnn,ops定义模型类当我们定义神经网络时可以继承nn.Cell类在__init__方法中进行子Cell的实例化和状态管理在construct方法中实现Tensor操作。construct意为神经网络计算图构建相关内容详见Graph Mode加速。classNetwork(nn.Cell):def__init__(self):super().__init__()self.flattennn.Flatten()self.dense_relu_sequentialnn.SequentialCell(nn.Dense(28*28,512,weight_initnormal,bias_initzeros),nn.ReLU(),nn.Dense(512,512,weight_initnormal,bias_initzeros),nn.ReLU(),nn.Dense(512,10,weight_initnormal,bias_initzeros))defconstruct(self,x):xself.flatten(x)logitsself.dense_relu_sequential(x)returnlogits构建完成后实例化Network对象并查看其结构。modelNetwork()print(model)Network (flatten): Flatten (dense_relu_sequential): SequentialCell (0): Denseinput_channels784, output_channels512, has_biasTrue (1): ReLU (2): Denseinput_channels512, output_channels512, has_biasTrue (3): ReLU (4): Denseinput_channels512, output_channels10, has_biasTrue 我们构造一个输入数据直接调用模型可以获得一个二维的Tensor输出其包含每个类别的原始预测值。model.construct()方法不可直接调用。Xops.ones((1,28,28),mindspore.float32)logitsmodel(X)# print logitslogitsTensor(shape[1, 10], dtypeFloat32, value [[-5.08734025e-04, 3.39190010e-04, 4.62840870e-03 ... -1.20305456e-03, -5.05689112e-03, 3.99264274e-03]])在此基础上通过一个nn.Softmax层实例获得预测概率。pred_probabnn.Softmax(axis1)(logits)y_predpred_probab.argmax(1)print(fPredicted class:{y_pred})Predicted class: [4]模型层本节将分解上节构造的神经网络模型中的每一层。首先构造一个shape为(3, 28, 28)的随机数据即3个28x28的图像依次通过每个神经网络层来观察其效果。input_imageops.ones((3,28,28),mindspore.float32)print(input_image.shape)(3, 28, 28)nn.Flatten实例化nn.Flatten层将28x28的2D张量转换为784大小的连续数组。flattennn.Flatten()flat_imageflatten(input_image)print(flat_image.shape)(3, 784)nn.Densenn.Dense为全连接层其使用权重和偏差对输入进行线性变换。layer1nn.Dense(in_channels28*28,out_channels20)hidden1layer1(flat_image)print(hidden1.shape)(3, 20)nn.ReLUnn.ReLU层为网络加入非线性激活函数帮助神经网络学习各种复杂的特征。print(fBefore ReLU:{hidden1}\n\n)hidden1nn.ReLU()(hidden1)print(fAfter ReLU:{hidden1})Before ReLU: [[-0.04736331 0.2939465 -0.02713677 -0.30988005 -0.11504349 -0.11661264 0.18007928 0.43213072 0.12091967 -0.17465964 0.53133243 0.12605792 0.01825903 0.01287796 0.17238477 -0.1621131 -0.0080034 -0.24523425 -0.10083733 0.05171938] [-0.04736331 0.2939465 -0.02713677 -0.30988005 -0.11504349 -0.11661264 0.18007928 0.43213072 0.12091967 -0.17465964 0.53133243 0.12605792 0.01825903 0.01287796 0.17238477 -0.1621131 -0.0080034 -0.24523425 -0.10083733 0.05171938] [-0.04736331 0.2939465 -0.02713677 -0.30988005 -0.11504349 -0.11661264 0.18007928 0.43213072 0.12091967 -0.17465964 0.53133243 0.12605792 0.01825903 0.01287796 0.17238477 -0.1621131 -0.0080034 -0.24523425 -0.10083733 0.05171938]] After ReLU: [[0. 0.2939465 0. 0. 0. 0. 0.18007928 0.43213072 0.12091967 0. 0.53133243 0.12605792 0.01825903 0.01287796 0.17238477 0. 0. 0. 0. 0.05171938] [0. 0.2939465 0. 0. 0. 0. 0.18007928 0.43213072 0.12091967 0. 0.53133243 0.12605792 0.01825903 0.01287796 0.17238477 0. 0. 0. 0. 0.05171938] [0. 0.2939465 0. 0. 0. 0. 0.18007928 0.43213072 0.12091967 0. 0.53133243 0.12605792 0.01825903 0.01287796 0.17238477 0. 0. 0. 0. 0.05171938]]nn.SequentialCellnn.SequentialCell是一个有序的Cell容器。输入Tensor将按照定义的顺序通过所有Cell。我们可以使用nn.SequentialCell来快速组合构造一个神经网络模型。seq_modulesnn.SequentialCell(flatten,layer1,nn.ReLU(),nn.Dense(20,10))logitsseq_modules(input_image)print(logits.shape)(3, 10)nn.Softmax最后使用nn.Softmax将神经网络最后一个全连接层返回的logits的值缩放到[0, 1]区间表示每个类别的预测概率。axis指定的维度数值和为1。softmaxnn.Softmax(axis1)pred_probabsoftmax(logits)模型参数网络内部神经网络层具有权重参数和偏置参数如nn.Dense这些参数会在训练过程中不断进行优化可通过model.parameters_and_names()来获取参数名及对应的参数详情。print(fModel structure:{model}\n\n)forname,paraminmodel.parameters_and_names():print(fLayer:{name}\nSize:{param.shape}\nValues :{param[:2]}\n)Model structure: Network (flatten): Flatten (dense_relu_sequential): SequentialCell (0): Denseinput_channels784, output_channels512, has_biasTrue (1): ReLU (2): Denseinput_channels512, output_channels512, has_biasTrue (3): ReLU (4): Denseinput_channels512, output_channels10, has_biasTrue Layer: dense_relu_sequential.0.weight Size: (512, 784) Values : [[-0.01491369 0.00353318 -0.00694948 ... 0.01226766 -0.00014423 0.00544263] [ 0.00212971 0.0019974 -0.00624789 ... -0.01214037 0.00118004 -0.01594325]] Layer: dense_relu_sequential.0.bias Size: (512,) Values : [0. 0.] Layer: dense_relu_sequential.2.weight Size: (512, 512) Values : [[ 0.00565423 0.00354313 0.00637383 ... -0.00352688 0.00262949 0.01157355] [-0.01284141 0.00657666 -0.01217057 ... 0.00318963 0.00319115 -0.00186801]] Layer: dense_relu_sequential.2.bias Size: (512,) Values : [0. 0.] Layer: dense_relu_sequential.4.weight Size: (10, 512) Values : [[ 0.0087168 -0.00381866 -0.00865665 ... -0.00273731 -0.00391623 0.00612853] [-0.00593031 0.0008721 -0.0060081 ... -0.00271535 -0.00850481 -0.00820513]] Layer: dense_relu_sequential.4.bias Size: (10,) Values : [0. 0.]更多内置神经网络层详见mindspore.nn API。