我想训练一个神经网络来表示从R^n到R的函数。这个神经网络只有一个层,输入神经元是函数的参数,输出是函数的值。例如,函数可以是“逻辑与”:两个输入值,一个输出值。
为了训练这样的网络,我需要定义一个成本函数,然后利用Theano对梯度的支持进行推导。问题在于:通常你会使用神经网络进行分类。一个训练样本是(输入,y),其中y是期望输出=应该具有最大似然性的输出神经元的索引。
在这种情况下,这是不可能的,我只有一个输出神经元,需要将其与标签进行比较=>标签不用于索引。伪代码如下:
if y==0: cost= - outputelse: cost= - (1-output)
使用这种方法,每个样本都需要重新计算成本。因为计算成本的公式依赖于y的值。
我认为有必要在theano公式中实现选择。类似于这个伪代码:
block1= - outputblock2= - (1 - output)blockMatrix= [block1 : block2]return blockMatrix[y]
在theano教程中,索引与微分结合使用,因此这应该可行。
实际问题:Theano中的阻塞是如何工作的?
我的代码中符号的类型:output是一个矩阵,y是一个向量。样本是这样创建的,一行是一个样本。
data_x = numpy.matrix([[0, 0], [1, 0], [0, 1], [1, 1]])data_y = numpy.array([0, 0, 0, 1])
完整代码在pastebin上:http://pastebin.com/PByUyvMQ它基本上与这个教程完全相同:http://deeplearning.net/tutorial/logreg.html
回答:
我不太确定阻塞的确切含义,但对于简单地连接两个张量变量,有theano.tensor.concatenate()
和theano.tensor.stack()
。
此外,你的问题还有另一种表述方式,可以避免条件和阻塞:
cost = -(1-y)*output -y*(1-output)