mxnet:基础知识和一个简单的示例
NDArray与NumPy的多维数组类似,但NDArray提供了更多的功能:GPU和CPU的异步计算;自动求导。这使得NDArray能更好地支持机器学习。
初始化
from mxnet import ndarray as nd
nd.zeros((3,4))
nd.ones((3,4))
nd.array([[1,2],[3,4]])
out:
[[1. 2.][3. 4.]] <NDArray 2x2 @cpu(0)>
nd.random_normal(0,1,shape=(3,4)) #标准正态分布
# 输出信息
y.shape
y.size
操作符
按照相应元素运算
x+y
x*y
nd.exp(x)
矩阵的乘法
nd.dot(x, y.T)
广播(Beoadcasting)
当二元操作符左右两边ndarray形状不一样时,系统会尝试将它们扩充到共同的形状。
a=nd.arange(3).reshape((3,1))
b=nd.arange(2),reshape((1,2))
print ('a+b', a+b)
out:
a+b:
[[ 0. 1.] [ 1. 2.] [ 2. 3.]] <NDArray 3x2 @cpu(0)>
与NumPy的转换
x=np.ones((2,3))
y=nd.array(x) # numpy->mxnet
z=y.asnumpy() # mxnet->numpy
替换操作
如果我们写y=x+y,会开辟新的内存来存储计算结果,如:
x=nd.ones((3,4))
y=nd.ones((3,4))
before = id(y)
y=y+x
id(y)==before # False
可以通过[:]写到之间建立好的数组中
z=nd.zeros_like(y)
before=id(z)
z[:]=x+y
id(z)==before # True
上述,系统还是为x+y创建了临时空间,再复制给了z。为了避免这个开销,可以使用操作符的全名版本并指定out参数
nd.elemwise_add(x,y,out=z)
id(z)==before # True
截取(Slicing)
x=nd.arange(0,9).reshape((3,3))
x[1:3]
out:
[[ 3. 4. 5.] [ 6. 7. 8.]] <NDArray 2x3 @cpu(0)>
#改变指定位置的值
x[1,2]=9.
#多维截取
x[1:2,1:3]
#多维写入
x[1:2,1:3]=9.
out:
[[ 0. 1. 2.] [ 3. 9. 9.] [ 6. 7. 8.]] <NDArray 3x3 @cpu(0)>
使用autograd自动求导
import mxnet.ndarray as nd
import mxnet.autograd as ag
为变量附上梯度
x=nd.array([[1,2],[3,4]])
x.attach_grad() # ndarray的方法申请相应的空间
# 定义函数f=2x*x,显式要求mxnet记录我们要求导的程序
with ag.record():
y=x*2
z=y*x
# 通过z.backword()来进行求导,如果z不是一个标量,z.backward()等价于nd.sum(z).backward().
z.backward()
print('x.grad: ',x.grad)
x.grad == 4*x
# output
x.grad:
[[4., 8.]
[12., 16.]]
<NDArray 2x2 @cpu(0)>
[[ 1. 1.]
[ 1. 1.]]
<NDArray 2x2 @cpu(0)>
对控制流求导
命令式的编程的一个便利之处是几乎可以对任意的可导程序进行求导,即使里面包含了 Python 的 控制流。对于计算图框架来说,这个对应于动态图,就是图的结构会根据输入数据不同而改变。
def f(a):
b=a*2
while nd.norm(b).asscalar() < 1000:
b=b*2
if nd.sum(b).asscalar() > 0:
c=b
else:
c = 100 * b
return c
使用record和backward求导
a = nd.random_normal(shape=3)
a.attach_grad()
with ag.record():
c = f(a)
c.backward()
头梯度和链式法则
基于链式法则:
\]
\(\frac{dz}{dy}\)就是\(\frac{dy}{dx}\)的头梯度,而计算\(\frac{dz}{dy}\),头梯度则为默认值,即nd.ones_like(y)。我们也可以手动指定头梯度。
with ag.record():
y = x * 2
z = y * x
head_gradient = nd.array([[10, 1.], [.1, .01]])
z.backward(head_gradient)
print(x.grad)
# out
x=
[[1.,2.]
[3.,4.]]
<NDArray 2x2 @cpu(0)>
x.grad=
[[40., 8.]
[12., 0.16]]
<NDArray 2x2 @cpu(0)>
mxnet:基础知识和一个简单的示例的更多相关文章
- C# 基础知识 (四).C#简单介绍及托管代码
暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了非常多东西,也学到了非常多东西,也认识到了非常多不足之处!闲暇之余我准备又一次进一步巩固C#相关知识,包含 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- 容器基础(五): 实现一个简单容器sdocker
在前面几部分的基础上, 我们更新一下代码,实现一个简单容器 sdocker. sdocker目录构成 linux: # tree . ├── Makefile ├── cpu-test.c # 由cp ...
- Blazor一个简单的示例让我们来起飞
Blazor Blazor他是一个开源的Web框架,不,这不是重点,重点是它可以使c#开发在浏览器上运行Web应用程序.它其实也简化了SPA的开发过程. Blazor = Browser + Razo ...
- 使用Express创建一个简单的示例
1.安装Express 使用npm包安装工具来安装Express安装包,打开npm命令行,输入: npm install -g express 2.创建一个工程 本示例是在windows下创建的,项目 ...
- Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译
一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...
- [安卓基础] 005.创建一个简单的UI
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Away3d 基础 1 ---对一个简单类的解释
转自:http://www.cnblogs.com/nooon/archive/2009/05/16/1458334.html 原英文地址: http://www.flashmagazine.com/ ...
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
新建一个single view 工程: 关闭ARC , 在.xib视图文件上拖放一个UIImageView 两个UIButton ,一个UISlider ,布局如图. 并为他们连线, UIImage ...
随机推荐
- Flutter常用组件(Widget)解析-ListView
一个可滚动的列表组件 不管在哪,列表组件都尤为重要和常用. 首先来看个例子: import 'package:flutter/material.dart'; void main () => ru ...
- L1 与 L2 正则化
参考这篇文章: https://baijiahao.baidu.com/s?id=1621054167310242353&wfr=spider&for=pc https://blog. ...
- JVM笔记(一)数字在JVM中的表示
数字在JVM中的表示 一.整数在JVM中的表示 1.在Java虚拟机中,整数有四种表示: byte:8位 short:16位 int:32位 long:64位 2.原码. ...
- [CC-PERMUTE]Just Some Permutations 3
[CC-PERMUTE]Just Some Permutations 3 题目大意: \(T(T\le10^5)\)次询问,每次询问有多少长度为\(n(n\le10^6)\)的排列,满足任意相邻两个数 ...
- [NOI导刊2010提高]黑匣子
OJ题号:洛谷1801 思路:建立一个大根堆.一个小根堆.大根堆维护前i小的元素,小根堆维护当前剩下的元素. #include<cstdio> #include<queue> ...
- angular.js--demo2-----声明局部控制器controller
<!doctype html><html ng-app="HelloAngular"> <head> <meta charset=&quo ...
- C++ 经典知识点面试题
1.指针的优点和缺点 优点:灵活高效 (1)提高程序的编译效率和执行速度(数组下标往下移时,需要使用乘法和加法,而指针直接使用++即可) (2)通过指针可使用主调函数和被调函数之间共享变量或数据结构, ...
- nagle算法和TCP_NODELAY
写socket发现的一个诡异现象,当时将多个小数据写操作合并成一个写操作,问题就没了.Chenshuo同学还建议我设置TCP_NODELAY,只是后来因为事情忙,也就没有再深究下去. 现在大概明白,是 ...
- mybatis学习之路----mysql批量新增数据
原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...
- Kubernetes中的亲和性与反亲和性
通常情况下,Pod分配到哪些Node是不需要管理员操心的,这个过程会由scheduler自动实现.但有时,我们需要指定一些调度的限制,例如某些应用应该跑在具有SSD存储的节点上,有些应用应该跑在同一个 ...