theano中的类型匹配错误[无法将Type Generic(变量<generic>)转换为Type TensorType]

时间:2016-05-05 11:24:08

标签: python-2.7 machine-learning theano mnist

thisfile.py

import cPickle
import gzip
import os
import numpy

import theano
import theano.tensor as T

def load_data(dataset):
    f = gzip.open(dataset, 'rb')
    train_set, valid_set, test_set = cPickle.load(f)
    f.close()


    def shared_dataset(data_xy, borrow=True):
        data_x, data_y = data_xy
        shared_x = theano.shared(numpy.asarray(data_x,
                                               dtype=theano.config.floatX),
                                 borrow=borrow)
        shared_y = theano.shared(numpy.asarray(data_y,
                                               dtype=theano.config.floatX),
                                 borrow=borrow)
        return shared_x, T.cast(shared_y, 'int32')

    test_set_x, test_set_y = shared_dataset(test_set)
    valid_set_x, valid_set_y = shared_dataset(valid_set)
    train_set_x, train_set_y = shared_dataset(train_set)

    rval = [(train_set_x, train_set_y), (valid_set_x, valid_set_y),
            (test_set_x, test_set_y)]
    return rval

class PCA(object):

    def __init__(self):
        self.param = 0       

    def dimemsion_transform(self, X):
        m_mean = T.mean(X, axis=0)
        X = X - m_mean          ##################### this line makes error
        return X

if __name__ == '__main__':
    dataset = 'mnist.pkl.gz'
    # load the MNIST data
    data = load_data(dataset)

    X = T.matrix('X')

    m_pca = PCA()

    transform = theano.function(
        inputs=[],
        outputs=m_pca.dimemsion_transform(X),
        givens={
            X: data
        }
    )

错误显示如下

Traceback (most recent call last):
  File ".../thisfile.py", line 101, in <module>
    X: data
  File ".../Theano/theano/compile/function.py", line 322, in function
    output_keys=output_keys)
  File ".../Theano/theano/compile/pfunc.py", line 443, in pfunc
    no_default_updates=no_default_updates)
  File ".../Theano/theano/compile/pfunc.py", line 219, in rebuild_collect_shared
    cloned_v = clone_v_get_shared_updates(v, copy_inputs_over)
  File ".../Theano/theano/compile/pfunc.py", line 93, in clone_v_get_shared_updates
    clone_v_get_shared_updates(i, copy_inputs_over)
  File ".../Theano/theano/compile/pfunc.py", line 93, in clone_v_get_shared_updates
    clone_v_get_shared_updates(i, copy_inputs_over)
  File ".../Theano/theano/compile/pfunc.py", line 93, in clone_v_get_shared_updates
    clone_v_get_shared_updates(i, copy_inputs_over)
  File ".../Theano/theano/compile/pfunc.py", line 96, in clone_v_get_shared_updates
    [clone_d[i] for i in owner.inputs], strict=rebuild_strict)
  File ".../Theano/theano/gof/graph.py", line 242, in clone_with_new_inputs
    new_inputs[i] = curr.type.filter_variable(new)
  File ".../Theano/theano/tensor/type.py", line 234, in filter_variable
    self=self))
TypeError: Cannot convert Type Generic (of Variable <Generic>) into Type TensorType(float64, matrix). You can try to manually convert <Generic> into a TensorType(float64, matrix).

我正在与theano制作PCA功能,但有问题。 从PCA类

中的dimension_transform中的MNIST数据中减去平均值

我不明白为什么它会给出类型匹配错误以及如何解决它

1 个答案:

答案 0 :(得分:0)

您的问题来自以下几行:

data = load_data(dataset)

此处data是一个列表(因为这是load_data()返回的内容)。

transform = theano.function(
    inputs=[],
    outputs=m_pca.dimemsion_transform(X),
    givens={
        X: data
    }
)

在这里你将它作为一个值传递。您必须从load_data()的返回值中提取所需的项目,如下所示:

[(train_set_x, train_set_y), (valid_set_x, valid_set_y),
        (test_set_x, test_set_y)] = load_data(dataset)

然后使用

    givens={
        X: train_set_x
    }

或其他值之一。