变长输入神经网络设计

我对使用 PyTorch 可以轻松构建动态神经网络的想法很感兴趣,因此我决定尝试一下。

我脑海中的应用程序具有可变数量的相同类型的输入。对于可变数量的输入,已经使用了循环或递归神经网络。但是,这些结构在给定行的输入之间施加了一些顺序或层次结构。但是,当没有这样的关系时,这些方法可能不是最佳的。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

以下是一个例子:给定一组从高斯分布中抽取的点,估计它们的均值和方差。请注意,对于样本的每一行,点的数量可能不同。

DeepMind 的研究人员最近发表了“关系网络”的想法,它将可变数量对象的特征作为输入并以顺序不变的方式处理它们,而无需对原始数据集的置换重复进行训练。

特别是,他们对查看对象对很感兴趣。他们提出的网络结构之一首先将 n 个对象对中的每个对象对的特征传递到网络 g,然后通过求和的方式聚合网络 g 的这 n 个副本的输出并将其输入到第二个网络 f:

对对象对进行排序不变网络结构(来自 arxiv:1702.05068)

重要的是,求和实际上强加了对的顺序不变性。

还要注意,g 网络的输出通常是向量(即多个值)。

受此启发,我尝试在 PyTorch 中实现一个网络,它可以学习估计高斯分布的方差,给定从中抽取的可变数量的点。

我们使用简单的一维输入值,而不是使用对象对。让我们首先定义我们想要生成多少行以及每行有多少个点等:

# range of variances to generate
varianceRange = [0.5, 1.5]# total number of points to generate
numRows = 10000# minimum and maximum number of points to draw from each distribution
# (both inclusive)
numPointsRange = [10, 20]

然后我们绘制用于高斯的方差:

# generate true variances of Gaussians
# convert to float32 to avoid incompatible data types during training
trueVariances = np.random.uniform(varianceRange[0], varianceRange[1], numRows).astype('float32')
trueSigmas = np.sqrt(trup(trueVariances))

然后我们生成实际的点:我们首先需要抽取随机值来确定样本的每一行应该包含多少个点。然后我们生成点本身(为简单起见,我们将所有高斯分布的中心设为零):

# determine how many points should be drawn from each Gaussian
numPoints = np.random.randint(0, numPointsRange[0], numPointsRange[1], size=numRows)# draw a set of points from the Gaussian
xvalues = []for row in range(numRows):thisNumPoints = numPoints[row]# draw points from this Gaussianxvalues.append(np.random.normal(loc=0, scale=truesigmas[row], size=thisNumPoints))# convert to float32 to avoid problems with incompatible data types during trainingxvalues.append(xfloat32)# calculate ML estimators for each point
mLestimators = np.array([np.mean(xvar, ddof=0) for xv in xvalues], dtype='float32')# calculate unbiased estimators for each point
ubEstimators = np.array([np.mean(xvar, ddof=1) for xv in xvalues], dtype='float32')

我们可以直观地看到一个示例行:

蓝色曲线表示实际的高斯分布,橙色点表示从此实例中得出的值。绿线表示方差的真实平方根(两倍),红线和紫线分别对应无偏和最大似然 (ML) 估计值。

现在让我们定义网络结构。构造函数采用几个参数来定义网络在“输入”(f) 和“输出”(g) 侧应该有多少层以及这些层应该有多宽:

class Net(nn.Module):def __init__(self, num_inputs=5, width_inputSide=50, num_outputs=50):super().__init__()self.input_side_layers = nn.ModuleList([nn.Linear(num_inputs, width_inputSide) for _ in range(num_inputs)])self.output_side_layers = nn.ModuleList([nn.Linear(width_inputSide, num_outputs) for _ in range(num_inputs)])def forward(self, x):input_side_outputs = [layer(x) for layer in self.input_side_layers]self.add_module("input_side&", input_side_outputs)num_inputs = 1self.input_side_layers = []for i in range(num_inputs):layer = nn.Linear(num_inputs, width_inputSide)self.input_side_layers.append(layer)self.add_module(f"layer_{i}", layer)num_inputs = width_inputSidefor i in range(num_inputs):self.output_side_layers[i] = nn.Linear(width_inputSide, num_outputs)if i == numLayersOutputSide - 1:# we want to learn the variancenum_outputs = 1else:num_outputs = width_inputSideself.output_side_layers.append(layer)self.add_module("output&", layer)num_inputs = num_outputs

代码的核心在于网络的转发方法:

def forward(self, points):# points is a list of 2D lists if 2D points, the second index is the index# of the point within the row# overall output for the entire minibatchoutputs = []# loop over minibatch entriesfor this_points in points:# outputs of each point of this minibatch entrythis_outputs = []# stack all input points into a 2D tensorh = torch.stack(this_points)# variance (Var.from_numpy(h))h = Variable(torch.from_numpy(h))# forward all input points through the input side networkfor layer in self.input_side_layers:h = layer(h)h = F.relu(h)# average the input side network outputs: sum along first dimension (point index)avg_h = h.sum(0) / len(this_points)# feed through the output side networkout = self.output_layer(avg_h)# layer_index, in enumerate(self.outputSideLayers):h = layer# note: since we want to do regression, we do NOT apply a nonlinearty after the last layerif layer_index == len(self.outputSideLayers) - 1:h = F.relu(h)outputs.append(h)# end of loop over minibatch entriesreturn torch.cat(outputs, 0)

你会注意到这一行:

output = h.sum(0) / len(thisPoints)

它在输入端聚合网络的输出张量。

为了简单起见,我们不使用任何正则化,例如 dropout 层等。此外,网络的大小是手动输入的,而不是来自一些更严格的程序,例如 k 倍交叉验证等。

准备训练的代码如下:

# instantiate the model
model = Net()allIndices = np.arange(len(targetTrain))# define the loss function
lossFunc = nn.MSELoss()minibatchSize = 32# number of training epochs
num_epochs = 40optimizer = optim.Adam(model.parameters(), lr = 0.0001)trainLosses = [] ; testLosses = []# variable for target values of test set
testTargetVar = Variable(torch.from_numpy(stack(targetTest)))

主要训练循环是:

# print "starting training"
for epoch in range(num_epochs):np.random.shuffle(all_indices)# # put model in training modemodel.train()train_loss = 0train_steps = 0for indices in np.array_split(all_indices, minibatchSize):optimizer.zero_grad()# forward through the networkoutput = model.forward(input_train[indices] for index in indices)# build a PyTorch variable with the target valuetarget = Variable(thisTarget, requires_grad=False)# so that we can propagate backwards afterwordstrain_loss += lossFunc.forward(output, thisTarget)# accumulatetrain_loss += loss.data[0]# backpropagateloss.backward()# update learning rateoptimizer.step()# update learning rateoptimizer.step()train_steps += 1train_loss /= train_stepstrain_losses.append(train_loss)# evaluate model on test setmodel.eval()test_loss = lossFunc.forward(output, testTarget).data[0]test_losses.append(test_loss)print("epoch", epoch, "train_loss", train_loss, "test_loss", testLoss)

在我的计算机上训练需要一段时间。损失与训练周期的演变如下:

然后我们可以在测试集上评估我们训练的模型:

model.eval()
predictions = model.forward(inputTest).data.numpy()[:,0]

让我们用以下代码来看一下用于生成高斯分布的真实方差和预测方差之间的差异:

def absDiff(prediction, trueValues):absDiff = prediction - trueValuesreturn np.mean(absDiff**2)import pandas as pddf = pd.DataFrame(dict(estimator=["network prediction","ML estimator","unbiased estimator"
]))rmse = [absDiffFunc(predictions, targetTest),absDiffFunc(np.sqrt(np.var(x, ddof=0)), 1 for x in inputTest), absDiffFunc(np.sqrt(np.var(x, ddof=1)), 1 for x in inputTest)
])

同时,我们将方差的最大似然估计和无偏估计与真实方差进行比较。下表总结了此示例运行的结果:

estimatorrmse
0network prediction0.225890
1ML estimator0.246142
2unbiased estimator0.241594

均方误差的根与最大似然估计和无偏估计相当(如果不是略好的话——但请记住,这仅适用于此样本,而不适用于一般情况)。

上述网络结构可用于学习可变数量输入的函数。本文的笔记本可在此处找到。


原文链接:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hugging Face使用笔记

1. HuggingFace简介 Hugging Face Hub和 Github 类似,都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能: 模型仓库(Model Repository):Git仓库可以让你管理代码版…

kei5l中不能跳转到函数定义的原因和个人遇到的问题

快捷键 CTRLK或F12,在选择要查看的函数定义时按下可以查看到(文件没问题的情况下) 出现不能查看的原因 1,没有设置生成文件信息(第一次打开工程常遇到问题) 2, 定义函数的代码没有加入工程 解决方式如下…

南大通用数据库-Gbase-8a-学习-44-DDLEVENT恢复

目录 一、环境信息 二、前景提要 1、情况描述 2、3号节点gc_recover日志截图 3、3号节点express日志截图 4、ddlevent截图 5、报错赋权语句分别在1节点和4节点执行 6、gcadmin 三、解决方法 1、描述 2、清理系统user表DDLEVENT 3、拷贝系统user表数据 (…

3.js - 灯光与阴影 - 聚光灯

// ts-nocheckimport * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入hdr加载器 import { RGBELoader } from three/examples/jsm/loaders/RGBELoader.js // 导入lil.gui import { GUI } from thre…

数据库之索引(三)

目录 一、简述索引实现的原理 二、简述数据库索引的重构过程 三、为什么MySQL的索引使用B树 四、简述联合索引的存储结构及其有效方式 五、MySQL的Hash索引和B树索引有何区别 一、简述索引实现的原理 在MySQL中,索引是在存储引擎层实现的,不同存储引…

Echarts:渲染成Canvas还是SVG,该如何抉择?

ECharts 从初始一直使用 Canvas 绘制图表。而 ECharts v4.0 发布了 SVG 渲染器,从而提供了一种新的选择。在初始化图表实例时,只需设置 renderer 参数 为 canvas 或 svg 即可指定渲染器,比较方便。贝格前端工场带领大家看下如何选择。 一、C…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

苹果电脑为什么要清理软件?

你有没有想过&#xff0c;你的苹果电脑也许是一个秘密的收藏家&#xff1f;没错&#xff0c;你的Mac可能在悄悄收集那些你曾经用过的每一个字节&#xff0c;从那次偶然下载的应用到你已经忘记了的各种文件。久而久之&#xff0c;这些“收藏品”就会堆积成山&#xff0c;让你的苹…

智能电表在碳中和实现过程中发挥什么作用

智能电表在碳中和实现过程中发挥着至关重要的作用&#xff0c;这些作用主要体现在提高碳排放计量的精准度、推动绿色能源转型、促进电力领域低碳发展等方面&#xff1b;随着技术的不断发展和应用的不断深入相信智能电表将在碳中和实现过程中发挥更加重要的作用。以下是对智能电…

开始尝试从0写一个项目--前端(二)

修改请求路径的位置 将后续以及之前的所有请求全都放在同一个文件夹里面 定义axios全局拦截器 为了后端每次请求都需要向后端传递jwt令牌检验 ps&#xff1a;愁死了&#xff0c;翻阅各种资料&#xff0c;可算是搞定了&#xff0c;哭死~~ src\utils\request.js import axio…

【最新鸿蒙应用开发】——Router页面路由

Router路由 页面路由指的是在应用程序中实现不同页面之间的跳转&#xff0c;以及数据传递。通过 Router 模块就可以实现这个功能. 1. 创建页面 之前是创建的文件&#xff0c;使用路由的时候需要创建页面&#xff0c;步骤略有不同 方法 1&#xff1a;直接右键新建Page&#xf…

Python28-10 LightGBM对乳腺癌数据集进行分类

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一个梯度提升框架&#xff0c;由微软开发。它用于机器学习中的分类、回归和排序等任务&#xff0c;特别适合处理大规模数据和高维特征。LightGBM的核心是梯度提升决策树&#xff08;GBDT&#xff09;算法&am…

虚拟现实3d场景漫游体验实现了“所见即所得”

如今&#xff0c;从实体店铺到工厂企业&#xff0c;再到政府单位&#xff0c;各行各业都已纷纷加入VR数字化升级的行列&#xff0c;相比传统的2D商品展示&#xff0c;三维交互展示成为商企客户交流的主流方式。产品展示、服务介绍、考察洽谈等都可以通过在3D虚拟场景网站中真实…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展&#xff0c;学术交流与研讨成为了推动科研进步的重要途径。进入7月&#xff0c;众多高质量的EI国际会议纷纷拉开帷幕&#xff0c;为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下&#xff0c;我们将详细介绍一些在7月可投的EI国际会议…

Chromium编译指南2024 Linux篇-安装官方工具depot_tools(二)

1.引言 在上一节中&#xff0c;我们已经完成了 Git 的安装&#xff0c;并了解了其在 Chromium 编译过程中的重要性。接下来&#xff0c;我们将继续进行环境的配置&#xff0c;首先是安装和配置 Chromium 编译所需的重要工具——depot_tools。 depot_tools 是一组用于获取、管…

你最近想通了什么事情?这10条职场经验帮助你活得更通透

1别总当老好人 记得刚步入职场那会儿&#xff0c;我简直是“老好人”的代名词。 无论是同事的额外任务&#xff0c;还是朋友的小忙&#xff0c;我总是二话不说就接下来&#xff0c;结果自己累得半死&#xff0c;换来的却是别人的理所当然和偶尔的忽视。 直到有一次&#xff…

云计算【第一阶段(27)】DHCP原理与配置以及FTP的介绍

一、DHCP工作原理 1.1、DHCP概念 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff0c;该协议允许服务器向客户端动态分配 IP 地址和配置信息。 DHCP协议支持C/S&#xff08;客户端/服务器&#xff09;结构&…

break 和 continue 的区别与用法

break 和 continue 的区别与用法 1、break 语句2、continue 语句3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JAVA中&#xff0c;break 和 continue 是两种常用的控制流语句&#xff0c;它们主要用于在循环结构中改变程序的执行…

Nacos 进阶篇---集群:选举心跳健康检查劳动者(九)

一、引言 本章将是我们第二阶段&#xff0c;开始学习集群模式下&#xff0c;Nacos 是怎么去操作的 &#xff1f; 本章重点&#xff1a; 在Nacos服务端当中&#xff0c;会去开启健康心跳检查定时任务。如果是在Nacos集群下&#xff0c;大家思考一下&#xff0c;有没有必要所有的…

无人直播系统源码开发:功能~优势~开发方法

自动直播通常是指通过自动化技术来实现实时内容分发的过程&#xff0c;它结合了流媒体技术和人工智能&#xff08;如机器学习&#xff09;。以下是自动直播实现的基本步骤&#xff1a; 内容采集&#xff1a;通过摄像头、手机等设备捕捉实时画面&#xff0c;并通过编码将其转换成…