PyTorch构建简单的网络——波士顿房价数据集

2023-10-27

一、数据集准备

1.数据加载

使用波士顿房价数据集(Boston House Price Dataset)下载地址。使用sklearn.datasets.load_boston即可加载
(scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。sklearn中常用的模块有分类、回归、聚类、降维、模型选择、预处理)

from sklearn.datasets import load_boston
boston = load_boston()

使用keys()查看字典关键字,其中data是我们要使用的输入数据(506组数据,每组数据有13个属性,13个属性的意义分别对应feature_names的13个值),target是目标值(或叫输出值,是我们要预测的值。506组数据,一组对应一个目标值)。
在这里插入图片描述

2.数据预处理

通过print(boston['data'])发现数据的数量级差别很大,为了能让梯度下降速度更快,需要做特征缩放(Feature Scaling)或均值归一化(Mean Normalization),这两个操作都是针对某一属性而不是所有数据的。

特征缩放 均值归一化
x/max (x-mean)/(max-min)

这里我们使用sklearn MinMaxScaler()函数。

from sklearn.preprocessing import MinMaxScaler
ss_input = MinMaxScaler()
ss_output = MinMaxScaler()
data_set_input = ss_input.fit_transform(boston['data'])
data_set_output = ss_output.fit_transform(boston['target'][:, np.newaxis])

boston['target'][:, np.newaxis]的作用是将一维数组转换为二维数组,不然会出现以下错误:
在这里插入图片描述

3.划分训练集、测试集

数据集划分有两种方法:

分为2类 分为3类
训练集 Training set 70% 60%
交叉验证集 Cross Validation set 20%
测试集 Test set 30% 20%

训练集:用来拟合模型中的参数
交叉验证集:用来选择合适的模型参数。模型中除了一些需要学习的参数,还有一些需要提前人为指定的参数,验证集就是为了选取效果最佳的模型所对应的参数
测试集:用来衡量从交叉验证集中选出的最优模型的性能

简单点,分为两类:

train_set_input = data_set_input[0:350, :]
train_set_output = data_set_output[0:350, :]
test_set_input = data_set_input[351:506, :]
test_set_output = data_set_output[351:506, :]

二、构建网络

构建最简单的网络:全连接,只有三层,输入—>14个神经元的隐藏层—>输出。由于有13个属性,所以输入单元有13个;1层隐藏层,隐藏层单元个数随便选的(隐藏层数量大于1层时,各隐藏层单元数目一般一样)。
激活函数选取: 常用的激活函数有ReLU()、Sigmoid()、Tanh()

ReLU Sigmoid Tanh
使用较多 mean=0.5
输出只有正值
mean=0
输出有正有负

既然ReLU()是使用较多的,那隐藏层激活函数用ReLU();房价只有正值,所以输出层用 Sigmoid()

from torch import nn
net = nn.Sequential(
    nn.Linear(13, 14),
    nn.ReLU(),
    nn.Linear(14, 1),
    nn.Sigmoid()
)

另一种方法:
注意:用这种方法时,需要将predict = net(input)换成predict = net.forward(input)

class net_structure(nn.Module):
    def __init__(self,input_num,hidden_num,output_num):
        super(net_structure,self).__init__()
        self.net = nn.Sequential(
            nn.Linear(input_num, hidden_num),
            nn.ReLU(),
            nn.Linear(hidden_num, output_num),
            nn.Sigmoid()
        )

    def forward(self, input):
        return self.net(input)
        
net = net_structure(13,14,1)

如果网络权重不初始化,pytorch有一套默认初始化机制,使用下面代码查看权重:

print(net.state_dict().keys())

三、定义损失函数和优化器

损失函数就是目标函数cost(在函数里都用loss表示。cost、loss意思一样,目标函数、损失函数、误差函数意思也一样)。nn.MSELoss()函数就是均方损失函数(y-y*)^2
优化器就是根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数值的作用。大家都说RMSprop()最好使,那就用这个。

cost = nn.MSELoss()
optimizer = torch.optim.RMSprop(net.parameters(), lr=0.01)

四、训练网络

网络输入只能是张量,数据集是numpy.ndarray(可以使用train_set_input.type()查看数据类型),需要使用torch.FloatTensor()进行类型转换。

变量声明:
1.max_epoch:迭代次数
2.iter_loss:每次迭代损失函数的平均值
3.batch_loss:一次迭代中所有样本的损失函数的值

梯度下降中,学习速率a乘的是每次迭代所有样本的目标函数cost,关于权重weight的导数,的和sum。因此每次迭代需要将“目标函数cost关于权重weight的导数的和sum”清零

方法声明:
1.optimizer.zero_grad():清零
2.loss.backward():反向传播求梯度
3.optimizer.step():更新所有参数
4.iter_loss.append(np.average(np.array(batch_loss))):记录本次迭代误差函数的平均值
更详细的解释见:torch代码解析 为什么要使用optimizer.zero_grad()

max_epoch = 300
iter_loss = []
batch_loss = []
for i in range(max_epoch):
    for n in range(train_set_input.shape[0]):
        input = Variable(torch.FloatTensor(train_set_input[n, :]))
        output = Variable(torch.FloatTensor(train_set_output[n, :]))

        predict = net(input)
        loss = cost(predict, output)
        batch_loss.append(loss.data.numpy())
        optimizer.zero_grad()
        loss.backward()
    	optimizer.step()
    iter_loss.append(np.average(np.array(batch_loss)))

使用以下语句查看损失函数随迭代次数变化的图像:

from matplotlib.font_manager import FontProperties
x = np.arange(max_epoch)
y = np.array(iter_loss)
#为了能显示中文
myfont = FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
plt.plot(x, y)
plt.title('损失函数随迭代次数变化图像', fontproperties=myfont)
plt.xlabel('迭代次数', fontproperties=myfont)
plt.ylabel('每次迭代损失函数平均值', fontproperties=myfont)
plt.show()

在这里插入图片描述

五、测试网络效果

predict_ass = []
for i in range(test_set_input.shape[0]):
    input = Variable(torch.FloatTensor(test_set_input[i, :]))
    predict_ass.append(net(input))

查看预测值和真实值:

x = np.arange(test_set_input.shape[0])
y1 = np.array(predict_ass)
y2 = np.array(test_set_output)
myfont = FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
line1, = plt.plot(x, y1)
line2, = plt.plot(x, y2)
plt.legend([line1, line2], ["predict", "real"], loc=1)
plt.title('预测值与实际值', fontproperties=myfont)
plt.xlabel('数据/组', fontproperties=myfont)
plt.ylabel('房价', fontproperties=myfont)
plt.show()

预测效果不太好。
在这里插入图片描述

六、数据分析

1.确定一层隐藏层时,隐藏层单元个数与预测准确度的关系

为了确定隐藏层单元个数预测准确度的关系,将数据集分为三类:训练集、验证集、测试集,对不同隐藏层单元个数求出训练集和验证集损失函数的值(横坐标为隐藏层单元个数,蓝色线为“训练集损失函数”,红色线为“验证集损失函数”)
当验证集损失函数>训练集损失函数时,说明模型出现过拟合(14个出现隐藏层单元出现了过拟合,可能这也是为什么拟合效果并不好的原因)
在这里插入图片描述

选取没有出现过拟合的隐藏层单元个数(以7、8、15、16为例)与14个隐藏层单元对比,发现不同隐藏层单元个数对损失函数的最小值影响没有区别,但7个和16个隐藏层单元预测效果较好

隐藏层单元个数 14 7 8 15 16
损失函数 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
测试网络效果 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

2.确定两层隐藏层时,隐藏层单元个数与预测准确度的关系

同1,作图(图上横坐标意义是错的!!横坐标为隐藏层单元个数,红色线为“训练集损失函数”,蓝色线为“验证集损失函数”)
在这里插入图片描述
选取没有出现过拟合的隐藏层单元个数(4、7、10)与一层隐藏层16个单元对比,发现两层隐藏层损失函数值减小速度快于一层隐藏层,但7个和16个隐藏层单元预测效果较好

隐藏层单元个数 16 4 7 10
损失函数 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
测试网络效果 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
3.不同损失函数的区别

由于目前还没搞清楚不同损失函数的应用场景的区别,暂时将损失函数按文章《神经网络的损失函数》中提及的回归损失函数和分类损失函数两类分,以后学明白了再来修改。
由于这是一个预测问题,所以涉及到的损失函数有:nn.MSELoss()nn.L1Loss()nn.SmoothL1Loss()这三种,MBELoss()函数在PyTorch上没有,因此不做分析。
发现相比于nn.L1Loss(),nn.SmoothL1Loss()和nn.MSELoss()的最小值几乎一样;在达到最小值所用的时间上,nn.MSELoss()更快
在这里插入图片描述
在使用同一个网络验证不同损失函数时,虽然每次使用的是同一个网络,但要定义三次,注意,不是声明三次!!!


附:完整代码

import numpy as np
import torch
from matplotlib.font_manager import FontProperties
from sklearn.datasets import load_boston
from sklearn.preprocessing import MinMaxScaler
from torch import nn
from torch.autograd import Variable
import matplotlib.pyplot as plt

# 1-1 加载数据
boston = load_boston()
# 1-2 数据归一化
ss_input = MinMaxScaler()
ss_output = MinMaxScaler()
data_set_input = ss_input.fit_transform(boston['data'])
data_set_output = ss_output.fit_transform(boston['target'][:, np.newaxis])
# 1-3 划分数据集
train_set_input = data_set_input[0:350, :]
train_set_output = data_set_output[0:350, :]
test_set_input = data_set_input[351:506, :]
test_set_output = data_set_output[351:506, :]

# 2 构建网络
net = nn.Sequential(
    nn.Linear(13, 14),
    nn.ReLU(),
    nn.Linear(14, 1),
    nn.Sigmoid(),
)

# 3 定义优化器和损失函数
cost = nn.MSELoss()
optimizer = torch.optim.RMSprop(net.parameters(), lr=0.01)

# 4 训练网络
max_epoch = 300
iter_loss = []
batch_loss = []
for i in range(max_epoch):
    optimizer.zero_grad()
    for n in range(train_set_input.shape[0]):
        input = Variable(torch.FloatTensor(train_set_input[n, :]))
        output = Variable(torch.FloatTensor(train_set_output[n, :]))

        predict = net(input)
        loss = cost(predict, output)
        batch_loss.append(loss.data.numpy())
        loss.backward()

    optimizer.step()
    iter_loss.append(np.average(np.array(batch_loss)))

#5 测试网络效果
predict_ass = []
for i in range(test_set_input.shape[0]):
    input = Variable(torch.FloatTensor(test_set_input[i, :]))
    predict_ass.append(net(input))

# 图1
x = np.arange(max_epoch)
y = np.array(iter_loss)
myfont = FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
plt.plot(x, y)
plt.title('损失函数随迭代次数变化图像', fontproperties=myfont)
plt.xlabel('迭代次数', fontproperties=myfont)
plt.ylabel('每次迭代损失函数平均值', fontproperties=myfont)
plt.show()

#图2
x = np.arange(test_set_input.shape[0])
y1 = np.array(predict_ass)
y2 = np.array(test_set_output)
myfont = FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
line1 = plt.scatter(x, y1, c='red')
line2 = plt.scatter(x, y2, c='yellow')
plt.legend([line1, line2], ["predict", "real"], loc=1)
plt.title('预测值与实际值', fontproperties=myfont)
plt.xlabel('数据/组', fontproperties=myfont)
plt.ylabel('房价', fontproperties=myfont)
plt.show()

#ps 查看权重
print(net.state_dict().keys())

2020.9.5 更新

经过一段时间的学习,发现“附:训练模型、测试模型”中的代码有些地方存在问题:

  1. 梯度下降梯度清零的位置
  2. 数据是逐个计算的,没有充分利用矢量运算的快速性
  3. 计算复杂

现修改如下:

  1. 先进行了梯度清零,然后进行梯度下降
  2. 采用矢量运算的方式,减少代码行数
  3. 增加了训练误差、测试误差的显示

(仍存在一些问题,如训练误差明显小于测试误差、数据集是否过少、科学方式调参等)

import numpy as np
import torch
from matplotlib.font_manager import FontProperties
from sklearn.datasets import load_boston
from sklearn.preprocessing import MinMaxScaler
from torch import nn
from torch.autograd import Variable
import matplotlib.pyplot as plt

# 1-1 加载数据
boston = load_boston()
# 1-2 数据归一化
ss_input = MinMaxScaler()
ss_output = MinMaxScaler()
data_set_input = ss_input.fit_transform(boston['data'])
data_set_output = ss_output.fit_transform(boston['target'][:, np.newaxis])
# 1-3 划分数据集
train_set_input = data_set_input[0:350, :]
train_set_output = data_set_output[0:350, :]
test_set_input = data_set_input[351:506, :]
test_set_output = data_set_output[351:506, :]

# 2 构建网络
net = nn.Sequential(
    nn.Linear(13, 14),
    nn.ReLU(),
    nn.Linear(14, 1),
    nn.Sigmoid(),
)

# 3 定义优化器和损失函数
loss = nn.MSELoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.5) 

# 4 训练网络
max_epoch = 3000
l_arr = []
for i in range(max_epoch):
    predict = net(torch.FloatTensor(train_set_input))
    l = loss(torch.FloatTensor(train_set_output), predict)
    optimizer.zero_grad()    
    l.backward()
    optimizer.step()
    l_arr.append(l.item())

#5 测试网络效果
predict = net(torch.FloatTensor(test_set_input))
test_loss = loss(torch.FloatTensor(test_set_output), predict)
print('train_loss:%.6f , test_loss:%.6f' % (torch.FloatTensor(l_arr).mean(), test_loss))

# 图1
x = np.arange(max_epoch)
y = np.array(l_arr)
myfont = FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
plt.plot(x, y)
plt.title('损失函数随迭代次数变化图像', fontproperties=myfont)
plt.xlabel('迭代次数', fontproperties=myfont)
plt.ylabel('每次迭代损失函数平均值', fontproperties=myfont)
plt.show()

#图2
x = np.arange(test_set_input.shape[0])
y1 = np.array(predict.detach().numpy())
y2 = np.array(test_set_output)
myfont = FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
line1 = plt.scatter(x, y1, c='red')
line2 = plt.scatter(x, y2, c='yellow')
plt.legend([line1, line2], ["predict", "real"], loc=1)
plt.title('预测值与实际值', fontproperties=myfont)
plt.xlabel('数据/组', fontproperties=myfont)
plt.ylabel('房价', fontproperties=myfont)
plt.show()

#ps 查看权重
for param in net.parameters():
    print(param.shape)
    print(param.data)

# train_loss:0.006195 , test_loss:0.024815

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch构建简单的网络——波士顿房价数据集 的相关文章

  • SpringMVC集成Swagger2,初尝试和遇到的相关问题

    本文章更新页请至 http blog csdn net MikeLC7 article details 75088123 之前项目的接口文档都是手动编写Word文档来做 制作成本较高 并且在进行版本迭代的时候进行标注和说明不是很方便 后来发
  • 电池的安规认证(IEC/EN)和航空运输认证UN38.3

    IEC62133 EN62133认证标准 使用范围及介绍 可充电电池和电池组 碱性或其他非酸性电解质 密封便携式电池的安全要求 测试项目测试项目 连续低倍率充电 振动 高温模壳应力 高低温循环 反充电 镍电 外部 短路 自由跌落 机械冲击
  • H5页面,上下滑动翻页

    针对之前的版本 https blog csdn net qq 16494241 article details 78095575进行了升级修改 改用原生JS编写 之前的基于JQ 可设置页面内容元素内部滚动及滚动至顶部或最底部触发翻页效果 P
  • 海湾标准汉字码表查询_标准汉字码表

    A 安 1618 暗 1621 按 1620 案 1624 B 吧 1641 八 1643 白 1655 百 1657 班 1664 般 1667 板 1669 半 1675 办 1676 帮 1679 棒 1684 包 1692 薄 17
  • Oracle navicat新建表空间,用户

    第一次使用oracle 记录一下遇到的不少坑 新建表空间 1 点击其它 gt 表空间 gt 新建表空间 2 填好基本信息 然后点击保存 大小 物理路径 自动扩展on off以及大小 创建好表空间后 新建用户 1 第一次使用的话 首先重启数据
  • linux特殊权限位之setuid、setgid和sticky

    我们登陆到系统之后 创建一个普通文件或者目录的时候 会有一个默认的权限 普通文件是644 目录文件是755 想必大家都知道这个是由umask这个值决定的 我们可以直接执行umask命令查看 linux系统默认的umask值是0022 想改变
  • 组合预测模型

    组合预测模型 EMD KPCA LSTM EMD LSTM LSTM多输入单输出回归预测对比 Matlab程序 目录 组合预测模型 EMD KPCA LSTM EMD LSTM LSTM多输入单输出回归预测对比 Matlab程序 预测结果
  • 声音反卷积matlab,用MATLAB做反卷积

    关键词 反卷积 MATLAB fft 频移 分母中频谱零点 卷积核 代码如下 clear all clc h 1 1 1 1 要求 f 1 2 3 2 已知 g conv h f 已知 g h f 这里卷积结果g知道 f知道 f视作卷积核
  • 在idea中使用JaCoCo插件统计单元测试覆盖率

    在后台工程师开发完新代码交给QA进行测试时 软件测试人员一般都会要求后台开发对单元测试的覆盖率达到一定的标准 例如我们的标准是分支覆盖率达到50 以上 函数覆盖率达到50 以上 在idea中查看覆盖率挺简单的 idea中支持三种插件来查看覆
  • SpringCloud详解

    SpringCloud是一个基于SpringBoot的分布式系统开发框架 它能够帮助我们快速 稳定地构建分布式系统 本篇博客将对SpringCloud进行详细解析 介绍SpringCloud的主要组件和相关应用场景 同时提供代码示例以帮助读
  • Linux查看端口、进程情况及kill进程

    看端口 ps aux grep tomcat 发现并没有8080端口的Tomcat进程 使用命令 netstat apn 查看所有的进程和端口使用情况 发现下面的进程列表 其中最后一栏是PID Program name 发现8080端口被P
  • Response对象-响应字符数据

    Response响应数据 1 response将字符数据返回到浏览器 需要两步 通过response对象获取字符输出流PrintWriter writer resp getWriter 通过字符输出流写数据 writer writer aa
  • 【语义分割】一篇看完就懂的最新深度语义分割模型综述

    点击上方 AI算法修炼营 选择加星标或 置顶 标题以下 全是干货 引言 语义分割结合了图像分类 目标检测和图像分割 通过一定的方法将图像分割成具有一定语义含义的区域块 并识别出每个区域块的语义类别 实现从底层到高层的语义推理过程 最终得到一
  • 解决Struts 中There is no Action mapped for namespace / and action name...

    自己调试的时候报这个错误 也是找了很久 试了很多网上的方法 最后发现是因为自己的请求写错了 struts中是这样的
  • 超详细进制转换(二进制、八进制、十进制、十六进制)详解

    目录 在学习四种进制转换之前先了解一下自种进制的特点 一 整数转换 1 十进制转R进制 2 R进制转十进制 3 二进制转八进制 十六进制 4 八进制转二进制 二 小数转换 1 十进制转R进制 2 R进制转十进制 在学习四种进制转换之前先了解
  • 华为云中对象存储服务软件开发工具包(OBS SDK) C语言介绍

    华为云的OBS介绍 摘自华为云官网 https support huaweicloud com obs index html 华为云的对象存储服务 Object Storage Service OBS 是一个基于对象的海量存储服务 为客户提
  • 软件物理架构与逻辑架构在软件架构中的应用

    在不同的架构设计方法中出现的软件架构视图种类很多 本文介绍最常用的两种架构视图 逻辑架构视图和物理架构视图 并通过具体案例的分析说明如何运用它们进行架构设计 当观察和描述事物大局的时候 逻辑架构和物理架构是最常用的角度 比如 以我们办公室里
  • 工厂方法模式(Factory Method)-最易懂的设计模式解析

    前言 在上文提到的最易懂的设计模式系列解析 简单工厂模式 发现简单工厂模式存在一系列问题 工厂类集中了所有实例 产品 的创建逻辑 一旦这个工厂不能正常工作 整个系统都会受到影响 违背 开放 关闭原则 一旦添加新产品就不得不修改工厂类的逻辑
  • C#入门——Console.Write()与Console.WriteLine()

    两者区别 Console Write abc 输出到控制台中 且在最后位置不换行 参数至少有一个以上 Console WriteLine 输出到控制台中 且在最后位置换行 有无参数均可 若没有参数 则为空行 具体用法 class Progr

随机推荐

  • 硬核!10分钟教你搭建一个本地版GPT4.0!

    今天10分钟手把手教会你在自己电脑上搭建一个官方原版的GPT4 0 不用ChatGPT账号 不用API 直接免费使用上官方原版的GPT4 0 对 你没看错 不仅是正版GPT4 0 还完全免费 而且整个部署流程极其简单 没有任何操作难度 这个
  • 七大视频剪辑软件,达人必备,你用过几个?

    随着自媒体和短视频时代的到来 越来越多的人参与其中 各大平台短视频内容层出不穷 找一款实用的视频编辑软件是很有必要的 如果你还在为视频剪辑而迷茫 不知道如何选择剪辑软件 那么今天这篇文章你一定要读一读 首先分享一下近年比较受欢迎的两款电脑剪
  • 获取百度图片(正则表达式)

    在爬取百度图片的过程中 因为自己写的是转成Json的格式 但是在爬取的过程中会出现各种各样的错误 最终躺了 还是使用正则表达式比较稳 import requests import os import re def get images fr
  • 【应用回归分析】CH4 假设检验与预测1——一般线性假设

    目录 前言 引例 1 例1 2 例2 一 假设检验的基本思想 二 定理 4 1 1 1 定理内容 2 定理证明 前言 在上一章 我们讨论了回归参数的几种估计方法 依据这些方法得到回归系数的估计 就可以建立经验回归方程 但是 所建立的经验回归
  • java 线性表-----数据表示形式(源代码)

    1 import java util Arrays 2 3 public class SequenceList
  • 01 自己实现一个可执行的链表【Linked List 链表】

    include
  • 项目中途引入Mybatis-plus后报错:Caused by: java.lang.ClassNotFoundException: org.mybatis.logging.LoggerFactory

    项目中途引入Mybatis plus后报错 Caused by java lang ClassNotFoundException org mybatis logging LoggerFactory 1 网上有提供解决办法1 在引入mybat
  • tomcat启动没有反应以及不写日志解决方法

    公司更新项目功能在更新的时候本来五分钟搞定的 但是突发意味导致服务停了一个小时 先说一下遇到这个问题的经过 我首先把需要更新的文件上传上去之后 把tomcat停止了一下 然后再去启动的时候遇到一个问题 启动无数遍都没有一丁点的反应 而且也不
  • python二级题库(百分之九十原题) 刷题软件推荐

    目录 刷题软件 模拟python二级考试 选择题 二 基本操作 三 简单应用 四 综合应用 刷题软件 文末有联系方式 注明来意 选择题 1 下列叙述中正确的是 A 解决一个问题可以有不同的算法 且它们的时间复杂度可以是不同的 B 算法的时间
  • 输入一组数组,回车结束的方法

    1 while scanf d b 2 3 array i b 4 if n getchar 5 6 array i 0 7 break 8 9 include
  • 阿里云ECS遭挖矿程序攻击解决方法(彻底清除挖矿程序,顺便下载了挖矿程序的脚本)

    一 杀死挖矿程序进程 在服务器上使用top指令查看cpu的使用情况 发现有一个叫java的程序占用cpu高达99 9 PID USER PR NI VIRT RES SHR S CPU MEM TIME COMMAND 5778 root
  • IOS如何返回到tabbar第一个按钮的主页面

    如图所示 当我们点击 消息 好友 我的按钮之后 如果用户没有登录 会出现登录页面 而此时我们点击登录页面的返回按钮 想返回到地图页面 该如何实现呢 在返回按钮的方法中实现如下代码 self navigationController tabB
  • 常见开源协议大白话说明

    GPL 只要你用了任何该协议的库 甚至是一段代码 那么你的整个程序 不管以何种方式链接 都必须全部使用GPL协议 并遵循该协议开源 商业软件公司一般禁用GPL代码 但可以使用GPL的可执行文件和应用程序 AGPL 即Affero GPL 是
  • Spring学习总结(2)——Spring的常用注解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本文汇总了Spring的常用注解 以方便大家查询和使用 具体如下 使用注解之前要开启自动扫描功能 其中base package为需要扫描的包 含子包 1
  • IOU_GIOU_DIOU_CIOU_EIOU优缺点总结

    IOU GIOU DIOU CIOU EIOU 优点 IOU算法是目标检测中最常用的指标 具有尺度不变性 满足非负性 同一性 对称性 三角不等性等特点 GIOU在基于IOU特性的基础上引入最小外接框解决检测框和真实框没有重叠时loss等于0
  • 群体智能,多个机器人协同搬运!

    来源 湖南大学机器人视觉感知与控制技术国家工程实验室 1 项目简介 基于室内监控摄像头的多机器人协作分拣搬运系统 主要利用中央处理服务器通过获取多个分布在四周的网络监控摄像头的图像 对处于视频图像中的机器人进行实时精准的三维坐标定位 定位精
  • 外部函数取ajax返回的数据

    1 ajax回调数据使用回调函数 业务场景 上传图片后的取返回来的图片地址进行前台的展示 前端上传图片需要对大图片进行图片压缩 然后再上传 小图片不做限制 总的文件比较到 这里我封装了全局的方法 方法正常使用 但是碰到一个问题 当想把上传图
  • 使用VoTT进行视频数据集标注

    视频数据集标注方法 使用VoTT进行视频数据集标注 By 自牧君 2021 12 04 一 VoTT 1 1 简介 软件下载地址 www github com Microsoft VoTT releases VoTT是微软发布的用于图像目标
  • vue--注册全局组件

    注册全局组件步骤 步骤一 像往常一样新建一个组件 这里要注意的是 需要给这个组件一个署名 之前不都是data methods那些嘛 现在用name 注册其实以前的加上这个name也没什么关系 但是注册全局组件才使用这个
  • PyTorch构建简单的网络——波士顿房价数据集

    PyTorch构建简单的网络 波士顿房价数据集 一 数据集准备 1 数据加载 2 数据预处理 3 划分训练集 测试集 二 构建网络 三 定义损失函数和优化器 四 训练网络 五 测试网络效果 六 数据分析 1 确定一层隐藏层时 隐藏层单元个数