【问题标题】:Regression with lasagne: error千层面回归:错误
【发布时间】:2015-07-01 02:51:17
【问题描述】:

我正在尝试使用 lasagne/nolearn 进行回归。我很难找到如何做到这一点的文档(一般来说是深度学习的新手)。

从一个简单的网络开始(一个隐藏层)

from lasagne import layers

from lasagne.nonlinearities import softmax
from lasagne.updates import nesterov_momentum
from nolearn.lasagne import NeuralNet    

print(np.shape(X)) # (137, 43)
print(np.shape(y)) # (137,)

layers_s = [('input', layers.InputLayer),
           ('dense0', layers.DenseLayer),
           ('output', layers.DenseLayer)]

net_s = NeuralNet(layers=layers_s,

                 input_shape=(None, num_features),
                 dense0_num_units=43,
                 output_num_units=1,
                 output_nonlinearity=None,

                 regression=True,

                 update=nesterov_momentum,
                 update_learning_rate=0.001,
                 update_momentum=0.9,

                 eval_size=0.2,
                 verbose=1,
                 max_epochs=100)

net_s.fit(X, y)

我收到以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-23-23c15ceec104> in <module>()
----> 1 net_s.fit(X, y)

/home/alex/anaconda3/lib/python3.4/site-packages/nolearn/lasagne.py in fit(self, X, y)
    148             out, self.loss, self.update,
    149             self.X_tensor_type,
--> 150             self.y_tensor_type,
    151             )
    152         self.train_iter_, self.eval_iter_, self.predict_iter_ = iter_funcs

/home/alex/anaconda3/lib/python3.4/site-packages/nolearn/lasagne.py in _create_iter_funcs(self, output_layer, loss_func, update, input_type, output_type)
    298         all_params = get_all_params(output_layer)
    299         update_params = self._get_params_for('update')
--> 300         updates = update(loss_train, all_params, **update_params)
    301 
    302         train_iter = theano.function(

/home/alex/src/lasagne/lasagne/updates.py in nesterov_momentum(loss, all_params, learning_rate, momentum)
     38 # such that the gradient can be evaluated at the current parameters.
     39 def nesterov_momentum(loss, all_params, learning_rate, momentum=0.9):
---> 40     all_grads = theano.grad(loss, all_params)
     41     updates = []
     42 

/home/alex/anaconda3/lib/python3.4/site-packages/theano/gradient.py in grad(cost, wrt, consider_constant, disconnected_inputs, add_names, known_grads, return_disconnected)
    431 
    432     if cost is not None and cost.ndim != 0:
--> 433         raise TypeError("cost must be a scalar.")
    434 
    435     if isinstance(wrt, set):

TypeError: cost must be a scalar.

谢谢!..

【问题讨论】:

  • 你找到解决这个问题的方法了吗?我遇到了完全相同的错误消息。

标签: python theano deep-learning


【解决方案1】:

确保您使用的是 已知可以一起使用的 nolearn 和 Lasagne 版本。

假设您一直在关注Using convolutional neural nets to detect facial keypoints tutorial。那么正确的做法是从this requirements.txt file 安装依赖项,如下所示:

pip uninstall Lasagne
pip uninstall nolearn
pip install -r https://raw.githubusercontent.com/dnouri/kfkd-tutorial/master/requirements.txt

但是,如果您使用的是来自 Git master 的 nolearn,请确保安装 requirements.txt file found there 中的 Lasagne 版本:

pip uninstall Lasagne
pip install -r https://raw.githubusercontent.com/dnouri/nolearn/master/requirements.txt

【讨论】:

    【解决方案2】:

    不确定您使用的是哪个版本的 nolearn 和 lasagne。我确实注意到你有y 的形状为(137,)。根据我的用法,这需要(137, 1) 才能适用于您的情况,并且通常,dim 2 需要与output_num_units 匹配。

    试试y.reshape((-1, 1))

    如果这不起作用,则可能是 Python 3 兼容性问题。

    【讨论】:

    • 我遇到了类似的问题,这解决了问题。谢谢!
    • 如果在将数据发送到 NeuralNet 时无法确定数据应具有的形状:对于分类任务,目标向量 y 必须只有一维。对于回归任务,无论回归目标的数量如何,它总是有两个维度。这里有一些代码来说明这一点:gist.github.com/dnouri/fe855653e9757e1ce8c4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多