从零和使用mxnet实现线性回归

1.线性回归从零实现(1000,)epoch:1,loss:5.7996epoch:2,loss:2.1903epoch:3,loss:0.9078epoch:4,loss:0.3178e

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

1.线性回归从零实现

from mxnet import ndarray as nd
import matplotlib.pyplot as plt
import numpy as np
import time
num_inputs = 2
num_examples = 1000
w = [2,-3.4]
b = 4.2

x = nd.random.normal(scale=1,shape=(num_examples,num_inputs))
y = nd.dot(x,nd.array(w).T) + b
y += nd.random.normal(scale=0.01,shape=y.shape)
print(y.shape)
(1000,)
plt.scatter(x[:,1].asnumpy(),y.asnumpy())
plt.show()

从零和使用mxnet实现线性回归

class LinearRegressor:
    def __init__(self,input_shape,output_shape):
        self.input_shape = input_shape
        self.output_shape = output_shape
        self.weight = nd.random.normal(scale=0.01,shape=(input_shape,1))
        self.bias = nd.zeros(shape=(1))

    def fit(self,x,y,learning_rate,epoches,batch_size):
        start = time.time()
        for epoch in range(epoches):
            for batch_data in self.batches(x,y,batch_size):
                x_batch,y_batch = batch_data[0],batch_data[1]
                y_hat = self.forward(x_batch)
                loss = self.mse(y_batch,y_hat)
                error = y_hat - y_batch.reshape(y_hat.shape)
                self.optimizer(x_batch,error,learning_rate)
            print('epoch:{},loss:{:.4f}'.format(epoch+1,self.mse(y,self.forward(x)).asscalar()))
        print('weight:',self.weight)
        print('bias:',self.bias)
        print('time interval:{:.2f}'.format(time.time() - start))
        
    def forward(self,x):
        return nd.dot(x,self.weight) + self.bias
    
    def mse(self,y,y_hat):
        m = len(y)
        mean_square = nd.sum((y - y_hat.reshape(y.shape)) ** 2) / (2 * m)
        return mean_square
    
    def optimizer(self,x,error,learning_rate):
        gradient = 1/len(x) * nd.dot(x.T,error)
        self.weight = self.weight - learning_rate * gradient
        self.bias = self.bias - learning_rate * error[0]
        
    def batches(self,x,y,batch_size):
        nSamples = len(x)
        nBatches = nSamples // batch_size 
        indexes = np.random.permutation(nSamples)
        for i in range(nBatches):
            yield (x[indexes[i*batch_size:(i+1)*batch_size]], y[indexes[i*batch_size:(i+1)*batch_size]])
        
lr = LinearRegressor(input_shape=2,output_shape=1)
lr.fit(x,y,learning_rate=0.1,epoches=20,batch_size=200)
epoch:1,loss:5.7996
epoch:2,loss:2.1903
epoch:3,loss:0.9078
epoch:4,loss:0.3178
epoch:5,loss:0.0795
epoch:6,loss:0.0204
epoch:7,loss:0.0156
epoch:8,loss:0.0068
epoch:9,loss:0.0022
epoch:10,loss:0.0009
epoch:11,loss:0.0003
epoch:12,loss:0.0001
epoch:13,loss:0.0001
epoch:14,loss:0.0001
epoch:15,loss:0.0000
epoch:16,loss:0.0000
epoch:17,loss:0.0000
epoch:18,loss:0.0001
epoch:19,loss:0.0001
epoch:20,loss:0.0001
weight: 
[[ 1.999662]
 [-3.400079]]
<NDArray 2x1 @cpu(0)>
bias: 
[4.2030163]
<NDArray 1 @cpu(0)>
time interval:0.22

2.线性回归简洁实现

from mxnet import gluon
from mxnet.gluon import loss as gloss
from mxnet.gluon import data as gdata
from mxnet.gluon import nn
from mxnet import init,autograd

# 定义模型
net = nn.Sequential()
net.add(nn.Dense(1))

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

# 定义损失函数
loss = gloss.L2Loss()

# 定义优化算法
optimizer = gluon.Trainer(net.collect_params(), 'sgd',{'learning_rate':0.1})

epoches = 20
batch_size = 200

# 获取批量数据
dataset = gdata.ArrayDataset(x,y)
data_iter = gdata.DataLoader(dataset,batch_size,shuffle=True)

# 训练模型
start = time.time()
for epoch in range(epoches):
    for batch_x,batch_y in data_iter:
        with autograd.record():
            l = loss(net(batch_x),batch_y)
        l.backward()
        optimizer.step(batch_size)
    l = loss(net(x),y)
    print('epoch:{},loss:{:.4f}'.format(epoch+1,l.mean().asscalar()))
print('weight:',net[0].weight.data())
print('weight:',net[0].bias.data())
print('time interval:{:.2f}'.format(time.time() - start))
epoch:1,loss:5.7794
epoch:2,loss:1.9934
epoch:3,loss:0.6884
epoch:4,loss:0.2381
epoch:5,loss:0.0825
epoch:6,loss:0.0286
epoch:7,loss:0.0100
epoch:8,loss:0.0035
epoch:9,loss:0.0012
epoch:10,loss:0.0005
epoch:11,loss:0.0002
epoch:12,loss:0.0001
epoch:13,loss:0.0001
epoch:14,loss:0.0001
epoch:15,loss:0.0001
epoch:16,loss:0.0000
epoch:17,loss:0.0000
epoch:18,loss:0.0000
epoch:19,loss:0.0000
epoch:20,loss:0.0000
weight: 
[[ 1.9996439 -3.400059 ]]
<NDArray 1x2 @cpu(0)>
weight: 
[4.2002025]
<NDArray 1 @cpu(0)>
time interval:0.86

3. 附:mxnet中的损失函数核初始化方法

  • 损失函数

    all = [‘Loss’, ‘L2Loss’, ‘L1Loss’,
    ‘SigmoidBinaryCrossEntropyLoss’, ‘SigmoidBCELoss’,
    ‘SoftmaxCrossEntropyLoss’, ‘SoftmaxCELoss’,
    ‘KLDivLoss’, ‘CTCLoss’, ‘HuberLoss’, ‘HingeLoss’,
    ‘SquaredHingeLoss’, ‘LogisticLoss’, ‘TripletLoss’, ‘PoissonNLLLoss’, ‘CosineEmbeddingLoss’]

  • 初始化方法

    [‘Zero’, ‘One’, ‘Constant’, ‘Uniform’, ‘Normal’, ‘Orthogonal’,’Xavier’,’MSRAPrelu’,’Bilinear’,’LSTMBias’,’DusedRNN’]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • 前端性能的优化_概括介绍

    前端性能的优化_概括介绍之前有整理过一部分知识点,一直没有发布,因为都是有关CSS方面的零散内容;现在想想无论做什么都需要慢慢积累,所以还是决定将之前整理的相关内容验证之后慢慢分享给你们,现在看到感觉还挺有意思。好了废话不多说,直接上代码以及图例(为了让大家方便阅读,都有自己验证过程的一些图片作为分享)。1.前端性能优化点:1.4个层面与8个点。1.4个层面:1.网络层面2.构建层面3.浏览器渲染层面4.服务端层面2.8个点:1.资源的合并与压缩。2

    2025年7月21日
    6
  • intellij idea 2021 激活码【中文破解版】「建议收藏」

    (intellij idea 2021 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

    2022年3月21日
    84
  • 弗曼学习法,你在用吗?

    弗曼学习法,你在用吗?今天简单的谈论一下弗曼学习法,是被学术界认为最niubi的学习方法。理查德.弗曼(1918-1988)1965年获得诺贝尔物理学奖,美籍犹太人,也是最早提出纳米的人。之所以以他的名字命名改学习方法,想必不用说大家也都知道了,总之很厉害一个人就是了。 弗曼学习法的原理,可以用一句话来概括(透过现象看本质),比方说我们刚学习、接触一个知识点,按照正常的逻辑就是去学会怎么使用它就行了,而带来的弊端就是,当时,亦或者一段时间内我们能记得,但是随着时间加长,没有使用过这个知识点,我们便会很快就忘记了。因为我

    2022年6月13日
    37
  • C语言的seekg函数,c++ fstream中seekg()和seekp()的用法[通俗易懂]

    C语言的seekg函数,c++ fstream中seekg()和seekp()的用法[通俗易懂]先说一下C语言中fseek()的功能:函数原型:intfseek(FILE*fp,LONGoffset,intorigin)参数含义:fp文件指针offset相对于origin规定的偏移位置量origin指针移动的起始位置,可设置为以下三种情况:SEEK_SET文件开始位置SEEK_CUR文件当前位置SEEK_END文件结束位置C++中seep()和seekg()…

    2022年6月7日
    83
  • javascript中通过document.cookie写入不了cookie的问题「建议收藏」

    javascript中通过document.cookie写入不了cookie的问题「建议收藏」网上有很多通过document.cookie来写入cookie的写法,使用的代码如下但是在本地直接通过浏览器浏览的时候,并不能写入cookie。经过试验才发现,只有当用在服务器或者本地的服务器中的时候,才能使用这个方法写入cookie

    2022年7月20日
    49
  • 角度与弧度互转_如何将角度转为弧度

    角度与弧度互转_如何将角度转为弧度1、角度定义   两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。(单位:º)2、弧度定义   两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度(单位:rad)。可简单理解为:弧度=弧长/半径3、弧长与弧度   3.1圆的周长C的计算…

    2022年4月19日
    73

发表回复

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

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