Python 合并和训练Theano自动编码器

Python 合并和训练Theano自动编码器,python,matrix-multiplication,theano,deep-learning,autoencoder,Python,Matrix Multiplication,Theano,Deep Learning,Autoencoder,我试图使用Theano的自动编码器从两种不同类型的数据中发现特定于上下文的功能 第一种类型有13个特征,第二种类型有60个特征 n_ins=[13,60], n_hiddens=[20, 20, 20], 两者都有自己独立的自动编码器堆栈 我合并最顶层的输出,并将其输入回归层,以便进行监督训练 self.logLayer = LogisticRegression( input=(self.sigmoid_layers[0][-1].output+self.si

我试图使用Theano的自动编码器从两种不同类型的数据中发现特定于上下文的功能

第一种类型有13个特征,第二种类型有60个特征

    n_ins=[13,60], 
    n_hiddens=[20, 20, 20],
两者都有自己独立的自动编码器堆栈

我合并最顶层的输出,并将其输入回归层,以便进行监督训练

self.logLayer = LogisticRegression(
        input=(self.sigmoid_layers[0][-1].output+self.sigmoid_layers[1][-1].output),
        n_in=self.n_modes*n_hiddens[-1],
        n_out=n_outs
    )
每个上下文的预培训似乎都正常工作,但是我在使用教程中的标准培训函数进行微调时遇到了一个障碍

     train_fn = theano.function(
        inputs=[index],
        outputs=self.finetune_cost,
        updates=updates,
        givens={
            self.x: train_set_x[
                index * batch_size: (index + 1) * batch_size
            ],
            self.y: train_set_y[
                index * batch_size: (index + 1) * batch_size
            ]
        },
        name='train'
    )
我得到以下错误:

ValueError: dimension mismatch in args to gemm (5,73)x(13,20)->(5,20)
Apply node that caused the error: GpuDot22(GpuSubtensor{int64:int64:}.0, W)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(5, 73), (13, 20)]
Inputs strides: [(73, 1), (20, 1)]
Inputs values: ['not shown', 'not shown']

我相信这与训练期间如何处理Theano节点有关。似乎训练批(5,73)从第一个上下文(13,20)开始直接应用到输出节点中。

因此第一个输入的自动编码器具有输入和编码器层大小13,20,20?第二个输入的自动编码器的输入和编码器层尺寸为60、20、20、20?i、 e.最内层编码器层的两个输入尺寸均为20?如果是这样,回归层的输入大小不应该是40吗?嗨,丹尼尔,是的,这就是它的要点。是的,回归层实际上有40个输入节点。我遇到的问题是微调阶段。基本上,预训练是有效的,因为我可以将每个输入作为一个单独的结构来处理。但是,对于微调,所有内容都被视为一个结构。因此,整个输入训练数据(大小73)分别输入每个输入自动编码器(大小13和60),导致在评估第一个输入时出现异常(我认为)。因此,第一个输入的自动编码器具有输入和编码器层大小13、20、20?第二个输入的自动编码器的输入和编码器层尺寸为60、20、20、20?i、 e.最内层编码器层的两个输入尺寸均为20?如果是这样,回归层的输入大小不应该是40吗?嗨,丹尼尔,是的,这就是它的要点。是的,回归层实际上有40个输入节点。我遇到的问题是微调阶段。基本上,预训练是有效的,因为我可以将每个输入作为一个单独的结构来处理。但是,对于微调,所有内容都被视为一个结构。因此,整个输入训练数据(大小73)分别输入到每个输入自动编码器(大小13和60),导致在评估第一个输入时出现异常(我认为)。