MXNET深度学习框架-14-自定义网络层

        通常在创建网络时,我们也只是会使用mxnet的api而已,根本无法理解它内部的真正含义。接下来我们创建一些自定义层,来看看网络是如何实现的:

# 自定义层
class mydense(gn.nn.Block):
    def __init__(self,out_units,in_units,**kwargs):
        super(mydense, self).__init__(**kwargs)
        with self.name_scope():
            self.weight=self.params.get("weight",shape=(out_units,in_units)) #权重
            self.bias = self.params.get("bias", shape=(out_units))  # 偏置项
    def forward(self, x):
        linear=nd.dot(x,self.weight.data())+self.bias.data()
        return nd.relu(linear)

上面创建了一个简单的网络层,接下来我们给它附上一些参数:

dense=mydense(out_units=10,in_units=5)
print(dense.params)

结果:
在这里插入图片描述
接下来创建一个实例化对象来看看它的参数:

dense=mydense(out_units=5,in_units=10)
print(dense.params)
dense.initialize()  # 初始化
X=nd.random_normal(shape=(2,10),scale=0.1)
print("自定义层:",dense(X))

结果:
在这里插入图片描述
既然我们自己能够定义block,那么就可以被gluon使用:

# 使用gluon调用自定义层
def gluon_net():
    net=gn.nn.Sequential()
    net.add(mydense(out_units=64,in_units=32))
    net.add(mydense(out_units=5, in_units=64))
    return net
net=gluon_net()
net.initialize()
X1=nd.random_normal(shape=(2,32))
print("gluon调用自定义层:",net(X1))

结果:
在这里插入图片描述
        从代码中我们可以发现一个问题:自定义的层需要输入两个参数,输入神经元和输出神经元,而gluon中则只需要设置输出神经元。

本章所有源码:

import mxnet.gluon as gn
import mxnet.ndarray as nd
import mxnet.autograd as ag

# 自定义层
class mydense(gn.nn.Block):
    def __init__(self,out_units,in_units,**kwargs):
        super(mydense, self).__init__(**kwargs)
        with self.name_scope():
            self.weight=self.params.get("weight",shape=(in_units,out_units)) #权重
            self.bias = self.params.get("bias", shape=(out_units))  # 偏置项
    def forward(self, x):
        linear=nd.dot(x,self.weight.data())+self.bias.data()
        return nd.relu(linear)

# 创建一个实例化对象来看看它的参数
dense=mydense(out_units=5,in_units=10)
print(dense.params)
dense.initialize()  # 初始化
X=nd.random_normal(shape=(2,10),scale=0.1)
print("自定义层:",dense(X))

# 使用gluon调用自定义层
def gluon_net():
    net=gn.nn.Sequential()
    net.add(mydense(out_units=64,in_units=32))
    net.add(mydense(out_units=5, in_units=64))
    return net
net=gluon_net()
net.initialize()
X1=nd.random_normal(shape=(2,32))
print("gluon调用自定义层:",net(X1))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值