import mindspore
from mindspore import nn, ops
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.dense_relu_sequential = nn.SequentialCell(
nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"),
nn.ReLU(),
nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),
nn.ReLU(),
nn.Dense(512, 10, weight_init="normal", bias_init="zeros")
)
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
model = Network()
print(model)
从nn.Cell继承构建网络。用nn.SequentialCell可以将各个层串联起来。
Dense是线性层,前两个参数为输入和输出的维度长度,ReLU为非线性层。
construct是网络的构造函数。在手写数字识别上,先用flatten将手写数据识别的图片数据28*28的图片展平为512。最后输出为值表示10类计算的值。
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
用ops.ones构造一个简单的1张图片,大小28*28的。计算出结果后,用nn.Softmax进行归一化,最大的就是这类数字的概率。
for name, param in model.parameters_and_names():
print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")
可以通过以上方式输出模型层的名字和参数。
以上就是基本简单的网络构建方式。
最后给出和pytorch的接口对比
class NeuralNetwork(nn.Module):
def __init__(self):
# 继承父类nn.Module的方法和属性
super(NeuralNetwork, self).__init__()
# 数据进行展平操作
self.flatten=nn.Flatten()
# 定义一层线性神经网络
self.hidden1=nn.Linear(28*28,128)
self.hidden2=nn.Linear(128,128)
self.hidden3=nn.Linear(128,64)
self.out=nn.Linear(64,10)
def forward(self,x):
# 对输入数据进行展平操作
x=self.flatten(x)
# 将数据传入第一层线性神经网络
x=self.hidden1(x)
# 对神经网络的输出应用ReLU激活函数
x=torch.relu(x)
x=self.hidden2(x)
# 对神经网络的输出应用sigmoid激活函数
x=torch.sigmoid(x)
x=self.hidden3(x)
x=torch.relu(x)
# 将数据传入输出层
x=self.out(x)
# 最后经过输出层输出预测结果x
return x
逻辑基本一样,在接口上有细微差别。