从零和使用mxnet实现dropout

需求:从零和使用mxnet实现dropout数据集:使用load_digits()手写数字数据集要求:使用1个掩藏层n_hidden1=36,激活函数为relu,损失函数为softmax

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

需求:

  • 从零和使用mxnet实现dropout

数据集:

  • 使用load_digits()手写数字数据集

要求:

  • 使用1个掩藏层n_hidden1 = 36,激活函数为relu,损失函数为softmax交叉熵损失函数

注意:

  • drop函数的实现方法
  • 训练和测试时drop的区别

1.从零实现dropout

from sklearn import datasets
from mxnet import gluon,nd,autograd,init
from mxnet.gluon import nn,data as gdata,loss as gloss,trainer
# 加载数据集
digits = datasets.load_digits()
features,labels = nd.array(digits['data']),nd.array(digits['target'])
print(features.shape,labels.shape)
labels_onehot = nd.one_hot(labels,10)
print(labels_onehot.shape)
(1797, 64) (1797,)
(1797, 10)
class NeuroNet:
    def __init__(self,n_inputs,n_hidden1,n_outputs):
        hidden_layer = Layer(n_inputs,n_hidden1)
        output_layer = Layer(n_hidden1,n_outputs)
        self.layers = [hidden_layer,output_layer]
        
        for layer in self.layers:
            for param in layer.params:
                param.attach_grad()
    
    def softmax(self,x):
        step1 = x.exp()
        step2 = step1 / step1.sum(axis=1,keepdims=True)
        return step2
    
    def softmaxCrossEntropyLoss(self,y_pred,y):
        step1 = -y * y_pred.log()
        step2 = step1.sum(axis=1)
        loss = step2.sum(axis=0) / len(y)
        return loss
        
    def drop(self,x,drop_probability,train=True):
        '''
        神经元被丢弃的概率为p
        '''
        if train:
            mask = nd.random.uniform(0,1,shape=x.shape,dtype='float32') > drop_probability
            return mask * x / (1 - drop_probability)
        else:
            return x
        
    def forward(self,x,train=True):
        for layer in self.layers[:-1]:
            step1 = layer.forward(x)
            step2 = self.drop(step1,0.2,train)
            x = step2
        output_layer = self.layers[-1]
        return self.softmax(output_layer.forward(x))
    
    def sgd(self,learning_rate,batch_size):
        '''
        使用随机梯度下降更新所有权重和偏置
        '''
        for layer in self.layers:
            layer.sgd(learning_rate,batch_size)
                
    def dataIter(self,x,y,batch_size):
        dataset = gdata.ArrayDataset(x,y)
        return gdata.DataLoader(dataset,batch_size,shuffle=True)
    
    def fit(self,x,y,epoches,batch_size,learning_rate):
        for epoch in range(epoches):
            for x_batch,y_batch in self.dataIter(x,y,batch_size):
                with autograd.record():
                    y_pred = self.forward(x_batch,train=True)
                    loss = self.softmaxCrossEntropyLoss(y_pred,y_batch)
                loss.backward()
                self.sgd(learning_rate,batch_size)
            if epoch % 50 == 0:
                y_pred_all = self.forward(x,train=False)
                loss_all = self.softmaxCrossEntropyLoss(y_pred_all,y)
                accuracy_score = self.accuracyScore(y_pred_all,y)
                print('epoch:{},loss:{},accuracy:{}'.format(epoch+50,loss_all,accuracy_score))
            
    def predict(self,x):
        y_pred = self.forward(x)
        return y_pred.argmax(axis=0)
    
    def accuracyScore(self,y_pred,y):
        acc_sum = (y_pred.argmax(axis=1) == y.argmax(axis=1)).sum().asscalar()
        return acc_sum / len(y)
        
class Layer:
    def __init__(self,n_inputs,n_outputs):
        weight = nd.random.normal(scale=0.01,shape=(n_inputs,n_outputs))
        bias = nd.zeros(shape=(n_outputs))
        self.params = [weight,bias]
    
    def relu(self,x):
        return nd.maximum(x,0)
    
    def forward(self,x):
        step1 = nd.dot(x,self.params[0]) + self.params[1]
        return self.relu(step1)
    
    def sgd(self,learning_rate,batch_size):
        for param in self.params:
            param[:] = param - learning_rate * param.grad / batch_size 
            
    def print_params(self):
        for param in self.params:
            print(param)
net = NeuroNet(64,36,10)
net.fit(features,labels_onehot,epoches=500,batch_size=200,learning_rate=0.5)
epoch:50,loss:
[2.2988722]
<NDArray 1 @cpu(0)>,accuracy:0.18308291597106288
epoch:100,loss:
[1.4126126]
<NDArray 1 @cpu(0)>,accuracy:0.7395659432387313
epoch:150,loss:
[0.46316707]
<NDArray 1 @cpu(0)>,accuracy:0.9259877573734001
epoch:200,loss:
[0.24678323]
<NDArray 1 @cpu(0)>,accuracy:0.9493600445186422
epoch:250,loss:
[0.17839472]
<NDArray 1 @cpu(0)>,accuracy:0.9610461880912632
epoch:300,loss:
[0.14298467]
<NDArray 1 @cpu(0)>,accuracy:0.9688369504730105
epoch:350,loss:
[0.1198809]
<NDArray 1 @cpu(0)>,accuracy:0.9738452977184195
epoch:400,loss:
[0.10388324]
<NDArray 1 @cpu(0)>,accuracy:0.9782971619365609
epoch:450,loss:
[0.0917427]
<NDArray 1 @cpu(0)>,accuracy:0.9827490261547023
epoch:500,loss:
[0.08237094]
<NDArray 1 @cpu(0)>,accuracy:0.9849749582637729
print('预测结果:',net.predict(features[:10]))
print('真实结果:',labels[:10])
预测结果: 
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
<NDArray 10 @cpu(0)>
真实结果: 
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
<NDArray 10 @cpu(0)>

2.使用mxnet实现dropout

n_inputs = 64
n_hiddens = 36
n_outputs = 10

# 定义模型
net = nn.Sequential()
net.add(nn.Dense(n_hiddens,activation='relu'))
net.add(nn.Dropout(rate=0.2))
net.add(nn.Dense(n_outputs))

# 初始化模型
net.initialize(init.Normal(sigma=0.01))

# 损失函数
loss = gloss.SoftmaxCrossEntropyLoss(sparse_label=False)

optimizer = trainer.Trainer(net.collect_params(), 'sgd', {'learning_rate':0.5})

# 训练模型
epoches = 500
batch_size = 200

dataset = gdata.ArrayDataset(features,labels_onehot)
dataIter = gdata.DataLoader(dataset,batch_size,shuffle=True)
for epoch in range(epoches):
    for x_batch,y_batch in dataIter:
        with autograd.record():
            y_pred = net.forward(x_batch)
            l = loss(y_pred, y_batch).sum() / batch_size
        l.backward()
        optimizer.step(batch_size)
    if epoch % 50 == 0:
        y_all_pred = net.forward(features)
        acc_sum = (y_all_pred.argmax(axis=1) == labels_onehot.argmax(axis=1)).sum().asscalar()
        print('epoch:{},loss:{},accuracy:{}'.format(epoch+50,loss(y_all_pred,labels_onehot).sum() / len(labels_onehot),acc_sum/len(y_all_pred)))
epoch:50,loss:
[2.2981045]
<NDArray 1 @cpu(0)>,accuracy:0.16304952698942682
epoch:100,loss:
[0.97166663]
<NDArray 1 @cpu(0)>,accuracy:0.867557039510295
epoch:150,loss:
[0.3836201]
<NDArray 1 @cpu(0)>,accuracy:0.9243183082915971
epoch:200,loss:
[0.24329802]
<NDArray 1 @cpu(0)>,accuracy:0.9449081803005008
epoch:250,loss:
[0.18068495]
<NDArray 1 @cpu(0)>,accuracy:0.9577072899276572
epoch:300,loss:
[0.14546551]
<NDArray 1 @cpu(0)>,accuracy:0.9660545353366722
epoch:350,loss:
[0.1219953]
<NDArray 1 @cpu(0)>,accuracy:0.9727323316638843
epoch:400,loss:
[0.10563282]
<NDArray 1 @cpu(0)>,accuracy:0.9760712298274903
epoch:450,loss:
[0.09357208]
<NDArray 1 @cpu(0)>,accuracy:0.9788536449638287
epoch:500,loss:
[0.08368526]
<NDArray 1 @cpu(0)>,accuracy:0.9816360601001669
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120004.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMWARE虚拟机上网三种方法分析

    VMWARE虚拟机上网三种方法分析VMWARE虚拟机不能上网三种方法分析  PostBy:2009-1-2320:43:00 bridged(桥接模式)、NAT(网络地址转换模式)host-only(主机模式)。理论理解:1.bridged(桥接模式)在这处模式下,虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩码,DNS,且IP地址要和主机的IP在同一网段内。这样,虚拟机就和主

    2022年5月19日
    35
  • 手机号码归属地数据库下载

    手机号码归属地数据库下载一份手机号归属地数据,共有174495条数据,包括中国移动,中国联通,中国电信的(包含152、186、188、189开头的手机号)。其中cardtype字段基本上没有什么用。因为可以通过办理某些业务就可以把如全球通卡转成神州行卡。对于这样的一份数据,你想要怎么利用?如果你只是想做一个手机号归属地查询的功能,那就浪费了。这个收数据库的主要功能就是通过手机号的前7位数字判断出手机号的归属城…

    2022年7月22日
    48
  • Java.Utils:Date 时间工具类

    Java.Utils:Date 时间工具类packagecom.boob.common.utils;importjava.text.DateFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;/***@description:…

    2022年7月16日
    17
  • CentOS7安装MySQL8.0.12(mysql8版本有的地方还是有坑想好再用)

    CentOS7安装MySQL8.0.12(mysql8版本有的地方还是有坑想好再用)

    2021年6月1日
    117
  • mavlink无人机控制程序_无人机协同作战

    mavlink无人机控制程序_无人机协同作战1.MAVLink简介MAVLink(MicroAirVehicleLink,微型空中飞行器链路通讯协议)是无人飞行器与地面站(GroundControlStation,GCS)之间通讯,以及无人飞行器之间通讯最常用的协议。它已经在PX4、APM、PIXHAWK和ParrotAR.Drone飞控平台上进行了大量测试。2.发明者LorenzMeier简介MAVLink的…

    2022年8月15日
    10
  • 使用SSH隧道和Squid创建专用加密代理以进行真正的隐私浏览「建议收藏」

    使用SSH隧道和Squid创建专用加密代理以进行真正的隐私浏览「建议收藏」在远程Linux机器上运行代理服务器,并通过SSH隧道将所有流量传输到它。第1步:安装Squid因为我使用CentOS,所以我只是做了一个 yuminstallsquid第2步:配置Squid好吧,默认的squid配置(/etc/squid/squid.conf)非常好,虽然我需要添加一个ACL子句,所以我实际上可以使用代理。远程的局域网是192.168.1.0/24,所以把这…

    2022年9月9日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号