分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

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

发布时间:2023-09-06 01:54责任编辑:董明明关键词:暂无标签

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

库导入写法,

from mxnet import ndarray as ndfrom mxnet import autogradfrom mxnet import gluonimport 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 mxfrom mxnet import autograd, ndimport numpy as npnum_inputs = 2num_examples = 1000true_w = [2, -3.4]true_b = 4.2features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_blabels += nd.random.normal(scale=0.01, shape=labels.shape)from mxnet.gluon import data as gdatabatch_size = 10dataset = 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()

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

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved