首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可训练,多参数动作。函数NeuPy / Theano

可训练,多参数动作。函数NeuPy / Theano
EN

Stack Overflow用户
提问于 2018-04-18 20:33:58
回答 2查看 178关注 0票数 1

如何在Neupy或Theano中实现自定义激活函数(带有平均和方差经梯度下降调整的RBF核),以便在Neupy中使用。

{快速背景:渐变下降适用于网络中的每个参数。我想要创建一个专门的特性空间,其中包含优化的特性参数,所以Neupy}

我认为我的问题在于参数的创建,它们的大小,以及它们是如何连接起来的。

主要感兴趣的功能。

激活函数类

代码语言:javascript
复制
class RBF(layers.ActivationLayer):
    def initialize(self):
        super(RBF, self).initialize()
        self.add_parameter(name='mean', shape=(1,),
                       value=init.Normal(), trainable=True)
        self.add_parameter(name='std_dev', shape=(1,),
                       value=init.Normal(), trainable=True)
    def output(self, input_value):
        return rbf(input_value, self.parameters)

RBF函数

代码语言:javascript
复制
def rbf(input_value, parameters):
    K = _outer_substract(input_value, parameters['mean'])
    return np.exp(- np.linalg.norm(K)/parameters['std_dev'])

功能来塑造?

代码语言:javascript
复制
def _outer_substract(x, y):
    return (x - y.T).T

帮助将是非常感谢,因为这将提供伟大的洞察力如何定制网际网络。这些文件至少需要在某些领域做些工作.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-19 15:37:36

当层更改输入变量的形状时,它必须将更改通知后续层。对于这种情况,它必须具有自定义的output_shape属性。例如:

代码语言:javascript
复制
from neupy import layers
from neupy.utils import as_tuple
import theano.tensor as T

class Flatten(layers.BaseLayer):
    """
    Slight modification of the Reshape layer from the neupy library:
    https://github.com/itdxer/neupy/blob/master/neupy/layers/reshape.py
    """
    @property 
    def output_shape(self):
        # Number of output feature depends on the input shape 
        # When layer receives input with shape (10, 3, 4)
        # than output will be (10, 12). First number 10 defines
        # number of samples which you typically don't need to
        # change during propagation
        n_output_features = np.prod(self.input_shape)
        return (n_output_features,)

    def output(self, input_value):
        n_samples = input_value.shape[0]
        return T.reshape(input_value, as_tuple(n_samples, self.output_shape))

如果您在终端上运行它,您将看到它工作正常。

代码语言:javascript
复制
>>> network = layers.Input((3, 4)) > Flatten()
>>> predict = network.compile()
>>> predict(np.random.random((10, 3, 4))).shape
(10, 12)

在您的例子中,我可以看到一些问题:

  1. rbf函数不返回theano表达式。它应该在函数编译期间失败。
  2. 如果您不指定要计算范数的轴,像np.linalg.norm这样的函数将返回标量。

下面的解决方案应该适用于您

代码语言:javascript
复制
import numpy as np
from neupy import layers, init
import theano.tensor as T


def norm(value, axis=None):
    return T.sqrt(T.sum(T.square(value), axis=axis))


class RBF(layers.BaseLayer):
    def initialize(self):
        super(RBF, self).initialize()

        # It's more flexible when shape of the parameters
        # denend on the input shape
        self.add_parameter(
            name='mean', shape=self.input_shape,
            value=init.Constant(0.), trainable=True)

        self.add_parameter(
            name='std_dev', shape=self.input_shape,
            value=init.Constant(1.), trainable=True)

    def output(self, input_value):
        K = input_value - self.mean
        return T.exp(-norm(K, axis=0) / self.std_dev)


network = layers.Input(1) > RBF()
predict = network.compile()
print(predict(np.random.random((10, 1))))

network = layers.Input(4) > RBF()
predict = network.compile()
print(predict(np.random.random((10, 4))))
票数 1
EN

Stack Overflow用户

发布于 2018-04-19 20:27:02

虽然itdxer充分回答了这个问题,但我想补充一下这个问题的确切解决办法。

建筑创作

代码语言:javascript
复制
network = layers.Input(size) > RBF() > layers.Softmax(num_out)

激活函数

代码语言:javascript
复制
    # Elementwise Gaussian (RBF)
    def rbf(value, mean, std):
        return T.exp(-.5*T.sqr(value-mean)/T.sqr(std))/(std*T.sqrt(2*np.pi))

RBF类

代码语言:javascript
复制
    class RBF(layers.BaseLayer):
 
        def initialize(self):
 
            # Begin by initializing.
            super(RBF, self).initialize()
 
            # Add parameters to train
            self.add_parameter(name='means', shape=self.input_shape,
                           value=init.Normal(), trainable=True)
            self.add_parameter(name='std_dev', shape=self.input_shape,
                           value=init.Normal(), trainable=True)
 
        # Define output function for the RBF layer.
        def output(self, input_value):
            K = input_value - self.means
            return rbf(input_value,self.means,self.std_dev

培训

如果你对训练感兴趣。它很简单,

代码语言:javascript
复制
# Set training algorithm
gdnet = algorithms.Momentum(
    network,
    momenutm = 0.1
)

# Train. 
gdnet.train(x,y,max_iter=100)

这与适当的输入和目标编译,均值和方差是更新的基础上的元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49908588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档