假象篇-动态可变参数的神经网络

Posted halone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了假象篇-动态可变参数的神经网络相关的知识,希望对你有一定的参考价值。

前不久参加了一次比赛,通过这次比赛对神经网络的功能有一些了解。同时我在使用的时候发现了一个问题,就是神经网络的训练数据一般是训练完这种数据后的模型想要预测以后的数据,输入的参数得和之前的训练数据的个数保持一致才行,这在神经网络模型下应该说是他的一个缺陷,就是训练后的模型限制了以后参数的个数,同时,输出的参数也不能输出不同个数的参数。

这种情况在使用的过程中表现的一个例子为:输入的预测图片必须得是训练时的大小 例如训练时的图片大小是30*30,那么预测的时候也只能是30*30

为了解决神经网络的这个缺陷,我在上课的时候想着可以人为地修改神经网络的结构从而解决这个问题,即将训练后的模型的训练参数设置为可变的情况,例如在训练时用的图片是90*90的,预测的时候也可以输入180*180或50*40这种大小来预测,初步的解决方法是将以下的过程融合在神经网络中:

1)首先通过一个训练的数据集,遍历其中范围最广的一个,然后将其输入参数的大小设置为其最广的那一个

2)通过以下方法:对大小不一致的图片参数(或其他参数等)通过以下规则实现

  1.对于图片大小比例不同训练参数大小比例的情况:对将要预测值进行按照训练参数大小比例插入0值进行补充,以达到原训练参数比例大小

  2.对于图片大小小于训练参数大小的情况:对将要预测值行列中进行插入均值进行补充,以达到原训练参数大小(类似于PS中的羽化)

  3.对于图片大小大于训练参数大小的情况:先获取和原训练参数大小的求余值,对将要预测值进行隔预测值大小除于刚刚的求余值的最后得到值的位置去掉该值,以达到原训练参数大小(类似于PS中的去噪点)

那么根据这个原则写出来的神经网络,输入参数是可变的。

对于动态的神经网络,其输出值应该也是可以变的,这个场景就好比,根据原本神经网络的模型识别一张图片,原本只能知道这个训练的模型是有多少比例符合训练的模型,通过动态的改变输出参数可以改变为以下的这种识别方案:

例如识别一个苹果,神经网络最终输出的是苹果而不是预测估计值

再例如,用这个网络识别一只带叶子的苹果,它出来的应该是 新鲜苹果,而不是估计值。

我想实现动态输出参数的方式的想法是:

为神经网络创建List容器集合,第一个List容器集合中储存的是一个泛型类 里面含有基础的信息

通过上述我们已经实现了一个动态的输入神经网络,那么假定这个神经网络输出的是1个参数 ,我们对他们进行训练,在训练的过程中我们给他们最终的训练的标签集是ist中的index坐标

现在任意输入一张含有苹果的图片,然后我们给他指定这张图片是苹果,若List集合中没有存在苹果这个基础信息,第一个List集合中存储进苹果这个基础信息,那么这个时候第一个List集合中存入的就是 苹果

有这个基础信息后,以后我们输入N张含有苹果的图片进动态输入的神经网络中进行训练,那么它会得到一个训练器,以后只要输入一个含有苹果的图片,他会输出List中苹果的index

同样地重复识别苹果枝上叶子的这个过程以后,List集合中又多了一个 苹果叶子 的基础信息,同时训练器能识别苹果叶子的index

经过上述两个训练之后,对于一个即含有苹果枝上含有叶子 又含有苹果 的这样一张图片,这个识别在理论上应该是会输出 苹果的index和叶子index的和的均值,为0.5,虽然我们可以通过该值知道这里面还有苹果和苹果叶子。

但是这样的一个结果,很明显还是不符合我们预期要输出 苹果 和 苹果叶子 这两个参数,而且再将参数提升至三个的时候,该方法便不适用了

很明显 输出的参数是一个的时候 ,可以确定两个值。那么同理 输出的参数是两个的时候,可以确定3个值,依此类推

但是在这种情况下,我们考虑的是如何动态输出神经网络的参数,而不是如何解决这个问题,况且,一开始我们就不知道要输出的参数是多少。这种情况下,就要借助于我们神奇的宇宙了,宇宙中,行星卫星之间能组成运动系统,行星恒星间能组成卫星系统,恒星又能和它上一级组成系统,依次类推,神经网络不也能如此。

我们在上述已经实现了动态输入的神经网络,那么这个时候,我们将神经网络输出一个参数输入到另外的神经网络中,再通过上述的方法进行逐一分级,从而实现动态输出参数的过程。

一层动态:将训练后的神经网络存储到一个List集合中,现在List集合有所有训练完的神经网络,及其所属大类值,及其基本的信息

二层动态:存有一个功能,它作为大类别判断器,他会判断信息所属大类值(可给出多个),这里的功能是减少运算量

三层动态:根据上述所给出大类值,根据对应大类的神经网络,进行判断,将判断值和对应神经网络的index添加到最终结果的List中,并且作为最终结果返回

这样 神经网络输出的结果是对应List集合,而List集合又是动态的,List集合含有判断值,和对应神经网络的index,那么再用自然语言解析,我们可以得到一个最终的答案。

这样我们就实现了 动态输入参数的神经网络  还有 动态输出参数的神经网络的集合了

以上是关于假象篇-动态可变参数的神经网络的主要内容,如果未能解决你的问题,请参考以下文章

函数栈帧与可变参数列表 p1可变参数列表(完结)( C语言从入门到入土(进阶篇)

Python入门教程第60篇 函数进阶之可变关键字参数

一脚踩进java之基础篇34——可变参数Collection工具类集合嵌套

一脚踩进java之基础篇34——可变参数Collection工具类集合嵌套

如何循环遍历动态大小的数组并将属性作为参数传递给可变参数函数?

jdk5新特性:可变参数