python - 可训练的多参数事件。函数 (RBF) NeuPy/Theano

标签 python machine-learning theano neupy

如何在 Neupy 或 Theano 中实现自定义激活函数(通过梯度下降调整均值和方差的 RBF 核)以在 Neupy 中使用。

{快速背景:梯度下降适用于网络中的每个参数。我想创建一个专门的特征空间,其中包含优化的特征参数,因此 Neupy}

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

感兴趣的主要功能。

激活函数类

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函数

def rbf(input_value, parameters):
    K = _outer_substract(input_value, parameters['mean'])
    return np.exp(- np.linalg.norm(K)/parameters['std_dev'])

函数塑造?

def _outer_substract(x, y):
    return (x - y.T).T

我们将非常感谢您的帮助,因为这将为如何定制 neupy 网络提供深入的见解。至少可以说,该文档在某些领域可能需要一些工作......

最佳答案

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

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))

如果您在终端中运行它,您会发现它有效

>>> 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 这样的函数将返回标量。

以下解决方案应该适合您

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))))

关于python - 可训练的多参数事件。函数 (RBF) NeuPy/Theano,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49908588/

相关文章:

python - 机器学习中如何处理缺失数据?

theano - 如何为具有 3 个 channel 的输入图像创建 layer0 输入

python - sklearn : How to reset a Regressor or classifier object in sknn

python - 如何在 pygame 中使圆圈半透明?

python - 我可以使用任何 stackdriver 监控 api 或 gcloud 命令获得 gcp 计算建议以调整实例大小吗

python - 基于类的 View - 未调用 get 函数

python - 带正则化的 Numpy 线性回归

machine-learning - 如果我使用 CUDA 训练神经网络,我是否需要使用 CUDA 运行输出的算法?

python - theano T.grad() 错误 : not part of computational graph

python - 如何将自定义协议(protocol)与 Callable 协议(protocol)结合起来?