作为个人项目的一部分,我尝试使用自己的数据修改Theano文档(Multilayer Perceptron)中给出的示例代码。
直到现在我设法以所需的格式提供我自己的(文本)数据,并且我想构建一个二元分类器。问题是,当我写出输出的数量是1,即
classifier = MLP(rng=rng, input=x, n_in=49, n_hidden=n_hidden, n_out=1)
我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Asterios\Anaconda\lib\site-packages\spyderlib\widgets\externalshell \sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "C:/Users/Asterios/Documents/Python/TripAdvisor/untitled4.py", line 603, in <module>
params = test_mlp()
File "C:/Users/Asterios/Documents/Python/TripAdvisor/untitled4.py", line 553, in test_mlp
minibatch_avg_cost = train_model(minibatch_index)
File "C:\Users\Asterios\Anaconda\lib\site-packages\theano-0.6.0-py2.7.egg\theano\compile\function_module.py", line 588, in __call__
self.fn.thunks[self.fn.position_of_error])
File "C:\Users\Asterios\Anaconda\lib\site-packages\theano-0.6.0-py2.7.egg\theano\compile\function_module.py", line 579, in __call__
outputs = self.fn()
ValueError: y_i value out of bounds
Apply node that caused the error: CrossentropySoftmaxArgmax1HotWithBias(Dot22.0, b, Elemwise{Cast{int32}}.0)
Inputs shapes: [(10L, 1L), (1L,), (10L,)]
Inputs strides: [(8L, 8L), (8L,), (4L,)]
Inputs types: [TensorType(float64, matrix), TensorType(float64, vector), TensorType(int32, vector)]
Use the Theano flag 'exception_verbosity=high' for a debugprint of this apply node.
我的训练数据的输出(在转换为theano共享类型之前)是这样的:
array([1, 1, 1, ..., 0, 0, 0], dtype=int64)
奇怪的是,如果我使用的ANYTHING大于1的输出神经元(例如n_out = 2),代码运行时没有任何错误,但当然现在有许多输出神经元没有实际意义。< / p>
有些人可以解释为什么带二进制输出的代码似乎给我一个错误?我怎样才能使这个工作?
谢谢!
答案 0 :(得分:3)
在MLP教程中用作输出层的逻辑回归类不是&#34;标准&#34;逻辑回归,它给出了单个值作为输出并且仅在两个类之间进行区分,而是一个多项Logistic回归(a.k.a Softmax回归),它为每个类提供一个值作为输出,告诉输入属于它们的概率。所以,如果你有10个班级,你也需要10个单位,显然所有输出单位的总和等于1,因为它是概率分布。
尽管使用了类名(&#34; LogistRegression&#34;),但linked source code中的文字字符串不会怀疑它的真实意图('''Multi-class Logistic Regression Class [...]'''
)。
在您的问题中,您有两个类,您还需要2个输出单元,n_out
的值必须是2而不是1.当然,有两个类,一个输出的值总是1减去另一个的值。
另外,检查你是否真的需要int64而不是int32。 Theano对第二个有更好的支持。