mxnet找大小网络

#-*-coding:utf-8-*-  #
#如果使用PY文件,许声明此文件为UTF-8格式,这样可以使用中文注释。如果使用ipynb文件,则无需此行

import logging
import math
import random
import mxnet as mx
import numpy as np

logging.getLogger().setLevel(logging.DEBUG)  #打开调试信息的显示

#设置超参数:
n_sample = 1000     #训练用的数据点个数
batch_size = 1      #批大小
learning_rate = 0.1 #学习速率
n_epoch = 1         #训练epoch

#生成训练数据:

#每组数据是在(0,1)之间的2哥随机数,共n_sample组数据
train_in = [[ random.uniform(0, 1) for c in range(2)] for n in range(n_sample)]

train_out = [0 for n in range(n_sample)]  # 期望输出,先初始化为0

for i in range(n_sample):
    #每组数据的期望输出,是2个输入数中的大者
    train_out[i] = max(train_in[i][0], train_in[i][1])
    
    
#定义变量train_iter为训练数据的迭代器(Iter),它将负责提供数据给训练过程。在此我们使用MXNet内置的数组迭代器(NDArrayIter)。
#这里的np.array函数可将python数组转为Numpy数组。MXNet经常会使用NumPy数组。
#将期望输出(称为label,即标签)命名为reg_label,并与train_out对接。
#将shuffle设置为真(True),代表每个epoch会随机打乱数据,这对于提高训练效果很重要。


train_iter = mx.io.NDArrayIter(data = np.array(train_in), label = {'reg_label':np.array(train_out)}, batch_size = batch_size, shuffle = True)

#接着定义网络结构。定义变量src为输入层,具体内容是MXNet的内部变量‘data’,代表训练数据。
src = mx.sym.Variable('data')
#定义变量fc为全连接层(FullyConnected)。
#输入数据(data)为变量src,即输入层,即训练数据
#将num_hidden设置为1,代表此层有1个神经元。
#命名(name)为fc,以后方便后续MXNet辨认。建议为每一层设置唯一的名字。
fc = mx.sym.FullyConnected(data = src, num_hidden = 1, name = 'fc')
#定义变量net为输出层,具体是线性回归输出(LinearRegressionOutput)。
#此时MXNet会自动使用MES作为损失函数。
#输入数据为fc,即上一层,将此层命名为reg,以与此前的reg_label对应。
net = mx.sym.LinearRegressionOutput(data = fc, name = 'reg')
#定义变量module为需训练的网络模组。
#网络的输出(symbol)为刚才定义的net变量。
#期望标签名(label_names)为erg_label,与此前对应。
module = mx.mod.Module(symbol = net, label_names = (['reg_label']))

#定义epoch_callback函数,在此它负责输出训练出的网络的参数值
def epoch_callback(epoch, symbol, arg_params, aux_params):
    for k in arg_params: #对于所有网络的参数...
        print(k)         #输出参数名
        print(arg_params[k].asnumpy())  #输出参数值,这里转为Numpy数组,输出更美观
        
#最后,调用module.fit,开始训练
        
module.fit(
        train_iter,  #训练数据的迭代器
        eval_data = None, #在此只训练,不使用测试数据
        eval_metric = mx.metric.create('mse'), #输出MSE损失信息
        optimizer = 'sgd',   #梯度下降算法为SGD
        #设置学习速率
        optimizer_params = {'learning_rate': learning_rate},
        num_epoch = n_epoch, #训练epoch数
        #每经过100个batch 输出训练速度
        batch_end_callback = mx.callback.Speedometer(batch_size, 100),
        epoch_end_callback = epoch_callback,      #完成每个epoch后调用epoch_callback
        )

猜你喜欢

转载自blog.csdn.net/qq_41858768/article/details/81431301
今日推荐