『MXNet』第一弹_基础操作以及常见层实现

MXNet是基础,Gluon是封装,两者犹如TensorFlow和Keras,不过得益于动态图机制,两者交互比TensorFlow和Keras要方便得多,其基础操作和pytorch极为相似,但是方便不少,有pytorch基础入门会很简单。

库导入写法,

from mxnet import ndarray as nd
from mxnet import autograd
from mxnet import gluon
import mxnet as mx

MXNet

mxnet.ndarray是整个科学计算系统的基础,整体API和numpy的nparray一致,这一点类似于pytorch,不过不同于pytorch内置变量、张量等不同数据类型,mxnet简化了只有ndarray一种,通过mxnet.autograd可以直接实现求导,十分便捷.

自动求导

x = nd.arange(4).reshape((4, 1))
# 标记需要自动求导的量
x.attach_grad()
# 有自动求导就需要记录计算图
with autograd.record():
    y = 2 * nd.dot(x.T, x)
# 反向传播输出
y.backward()
# 获取梯度
print(‘x.grad: ‘, x.grad)

nd转化为数字

nd.asscalar()

nd与np数组互化

y = nd.array(x) # NumPy转换成NDArray。

z = y.asnumpy() # NDArray转换成NumPy。

节约内存的加法

nd.elemwise_add(x, y, out=z)

层实现

relu激活

def relu(X):
    return nd.maximum(X, 0)

全连接层

# 变量生成
w = nd.random.normal(scale=1, shape=(num_inputs, 1))
b = nd.zeros(shape=(1,))
params = [w, b]

# 变量挂载梯度
for param in params:
    param.attach_grad()

# 实现全连接
def net(X, w, b):
    return nd.dot(X, w) + b

SGD实现

def sgd(params, lr, batch_size):
    for param in params:
        param[:] = param - lr * param.grad / batch_size

  

Gluon

内存数据集加载

import mxnet as mx
from mxnet import autograd, nd
import numpy as np

num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)

from mxnet.gluon import data as gdata

batch_size = 10
dataset = gdata.ArrayDataset(features, labels)
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True)

for X, y in data_iter:
    print(X, y)
    break
[[-1.74047375  0.26071024]
 [ 0.65584248 -0.50490594]
 [-0.97745866 -0.01658815]
 [-0.55589193  0.30666101]
 [-0.61393601 -2.62473822]
 [ 0.82654613 -0.00791582]
 [ 0.29560572 -1.21692061]
 [-0.35985938 -1.37184834]
 [-1.69631028 -1.74014604]
 [ 1.31199837 -1.96280086]]
<NDArray 10x2 @cpu(0)>
[ -0.14842382   7.22247267   2.30917668   2.0601418   11.89551163
   5.87866735   8.94194221   8.15139961   6.72600317  13.50252151]
<NDArray 10 @cpu(0)>

模型定义

  • 序列模型生成
  • 层填充
  • 初始化模型参数
net = gluon.nn.Sequential()
with net.name_scope():
    net.add(gluon.nn.Dense(1))
net.collect_params().initialize(mx.init.Normal(sigma=1))  # 模型参数初始化选择normal分布

优化器

wd参数为模型添加了L2正则化,机制为:w = w - lr*grad - wd*w

trainer = gluon.Trainer(net.collect_params(), ‘sgd‘, {
        ‘learning_rate‘: learning_rate, ‘wd‘: weight_decay})

trainer.step(batch_size)需要运行在每一次反向传播之后,会更新参数,一次模拟的训练过程如下,

for e in range(epochs):
        for data, label in data_iter_train:
            with autograd.record():
                output = net(data)
                loss = square_loss(output, label)
            loss.backward()
            trainer.step(batch_size)
        train_loss.append(test(net, X_train, y_train))
        test_loss.append(test(net, X_test, y_test))

层函数API

拉伸

nn.Flatten()

全连接层

gluon.nn.Dense(256, activation="relu")

参数表示输出节点数

损失函数class API

交叉熵

loss = gloss.SoftmaxCrossEntropyLoss()

原文地址:https://www.cnblogs.com/hellcat/p/9038649.html

时间: 2024-08-05 09:15:08

『MXNet』第一弹_基础操作以及常见层实现的相关文章

『PyTorch』第二弹_张量

参考:http://www.jianshu.com/p/5ae644748f21# 几个数学概念: 标量(Scalar)是只有大小,没有方向的量,如1,2,3等 向量(Vector)是有大小和方向的量,其实就是一串数字,如(1,2) 矩阵(Matrix)是好几个向量拍成一排合并而成的一堆数字,如[1,2;3,4] 其实标量,向量,矩阵它们三个也是张量,标量是零维的张量,向量是一维的张量,矩阵是二维的张量,除此之外,张量不仅可以是三维的,还可以是四维的.五维的... 一点小注意: 1.由于torc

『PyTorch』第一弹_Linux系统下的安装记录

官网首页(http://pytorch.org/)是有安装教程的,但是点击之后没有反应,原因不明,所以不得不自己寻找一个安装方法. 安装参考如下: http://blog.csdn.net/amds123/article/details/69396953 由于我的机器使用Anaconda2.7内部嵌套了Anaconda3.6,而我更倾向于使用3.6版本(个人感觉使用3.x是大势所趋,且3.x的确比2.7方便不少),而我的cuda版本是8,所以我根据自己的情况记录一下安装流程: # 激活环境 so

『MXNet』专题汇总

MXNet文档 MXNet官方教程 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四弹_Gluon自定义层 『MXNet』第五弹_MXNet.image图像处理 『MXNet』第六弹_Gluon性能提升 『MXNet』第七弹_多GPU并行程序设计 『MXNet』第八弹_数据处理API_上 『MXNet』第九弹_分类器以及迁移学习DEMO 『MXNet』第十弹_物体检测SSD 『MXNet』第八

『Re』正则表达式模块_常用方法记录

『Re』知识工程作业_主体识别 一个比较完备的正则表达式介绍 几个基础函数 re.compile(pattern, flags=0) 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的match ()和search ()等方法. 实际有两种使用方式: pattern.匹配方法(string) 或者 re.匹配方法(pattern,string) 使用或|来强化匹配规则: pattern_t = re.compile( '[0-9〇一二三四五六七八九]{4}年.{1,2}月.{1,3

『TensorFlow』分布式训练_其二_多GPU并行demo分析(待续)

建议比对『MXNet』第七弹_多GPU并行程序设计 models/tutorials/image/cifar10/cifer10_multi_gpu-train.py # Copyright 2015 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file exc

『TensorFlow』迁移学习_他山之石,可以攻玉

目的: 使用google已经训练好的模型,将最后的全连接层修改为我们自己的全连接层,将原有的1000分类分类器修改为我们自己的5分类分类器,利用原有模型的特征提取能力实现我们自己数据对应模型的快速训练.实际中对于一个陌生的数据集,原有模型经过不高的迭代次数即可获得很好的准确率. 实战: 实机文件夹如下,两个压缩文件可以忽略: 花朵图片数据下载: 1 curl -O http://download.tensorflow.org/example_images/flower_photos.tgz 已经

『TensorFlow』读书笔记_降噪自编码器

『TensorFlow』降噪自编码器设计 之前学习过的代码,又敲了一遍,新的收获也还是有的,因为这次注释写的比较详尽,所以再次记录一下,具体的相关知识查阅之前写的文章即可(见上面链接). # Author : Hellcat # Time : 2017/12/6 import numpy as np import sklearn.preprocessing as prep import tensorflow as tf from tensorflow.examples.tutorials.mni

『MXNet』第六弹_数据处理API(待续)

一.Gluon数据加载 图片数据(含标签)加载函数:gluon.data.vision.ImageFolderDataset 给出ImageFolderDataset类的描述, Init signature: mxnet.gluon.data.vision.datasets.ImageFolderDataset(root, flag=1, transform=None) Source: class ImageFolderDataset(dataset.Dataset): """

『MXNet』第七弹_分类器demo示意

解压文件命令: with zipfile.ZipFile('../data/kaggle_cifar10/' + fin, 'r') as zin: zin.extractall('../data/kaggle_cifar10/') 拷贝文件命令: shutil.copy(原文件, 目标文件) 整理数据 我们有两个文件夹'../data/kaggle_cifar10/train'和'../data/kaggle_cifar10/test',一个记录了文件名和类别的索引文件 我们的目的是在新的文件