mindspore(后文简称为ms)目前网上的使用者以及文章太少了,对于像我这种没有阅读官方文档的人来说属实有点不易,这里记录一下我用mindspore实现单层和双层神经网络拟合抛物面的代码。 详细代码在https://github.com/yuanzilin/PatternRecognition/tree/main/lab4中的BP_mindspore.ipynb中
一、简化版流程
主要有5个步骤: 1.定义网络结构 2.定义损失函数 3.定义反向传播网络 4.开始训练 5.用训练完成的模型对测试集进行推理 除了第1步,后面4个步骤可以用以下几行代码实现
from mindspore import nn
from mindspore.train import Model
epochs=2000
net=MyNet_double(2,3,4,1)
net_loss=nn.loss.MSELoss()
opt=nn.Momentum(net.trainable_params(),learning_rate=0.01,momentum=0.9)
model=Model(net,net_loss,opt,metrics={"loss"})
model.train(epochs,ds_train,dataset_sink_mode=False)
p=model.predict(test_X)
二、注意事项
主要是model.train()和model.predict()时需要处理一下数据的输入格式
1.ms只能处理特定格式的数据,比如我有一个数据集如下,第一列为x1,第二列为x2,第三列为y 那么这个文件转化成ms可以处理的格式的方法如下:
def readData(path):
lines=open(path,"r",encoding="utf-8").readlines()
train_X=[]
for l in lines:
data=l.strip().split(" ")
tmp=[]
x=[]
x.append(float(data[0]))
x.append(float(data[1]))
tmp.append(Tensor(x,ms.float32))
tmp.append(Tensor(float(data[2]),ms.float32))
train_X.append(tmp)
return train_X
from mindspore import dataset as ds
def create_dataset(data,batch_size=4):
input_data=ds.GeneratorDataset(data,column_names=["data","label"],column_types=[ms.float32,ms.float32])
input_data=input_data.batch(batch_size)
return input_data
train_data=readData("paraboloid_train.txt")
ds_train=create_dataset(train_data)
其中train_data[0]的输出为: 可以用如下方法查看ds.GeneratorDataset处理后的数据内容:
cnt=0
for i in ds_train.create_dict_iterator():
print(i["data"],["label"])
cnt+=1
if cnt==3:
break
输出为:
2.model.predict时,这个predict只能接转化成Tensor类型的np.array数组或者list,比如要调用这行代码进行预测:
predict_sphere=model.predict(Tensor(test_x))
那么这个test_x可以是这样:
参考文档: 1.mindspore官方文档:https://www.mindspore.cn/docs/zh-CN/r1.7/index.html 2.实现简单线性函数拟合:https://www.mindspore.cn/tutorial/zh-CN/r0.7/quick_start/linear_regression.html 3.使用MindSpore实现简单线性函数拟合:https://gitee.com/mindspore/docs/blob/r1.0/tutorials/notebook/linear_regression.ipynb
|