【问题标题】:Problems while trying to understand matrix shapes in Keras?尝试理解 Keras 中的矩阵形状时遇到问题?
【发布时间】:2017-06-20 23:27:46
【问题描述】:

我正在学习 keras,这是我第一次在玩具示例中使用它,所以我尝试了以下线性回归,但是我得到了 ValueError: setting an array element with a sequence.

在:

import pandas as pd
import keras 
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation

dims = X.shape[1]
print(dims, 'dims')
print("Building model...")
nb_classes = y.shape[0]
print(nb_classes, 'classes')


model = Sequential()
model.add(Dense(1, input_dim=dims))
model.compile(optimizer='sgd', loss='mean_squared_error')

print(X.shape)
print(y.shape)
model.fit(X, y)

输出:

68 dims
Building model...
1000 classes
(1000, 68)
(1000,)
Epoch 1/10

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-10-7a58187d7756> in <module>()
     19 print(X.shape)
     20 print(y.shape)
---> 21 model.fit(X, y)

/usr/local/lib/python3.5/site-packages/keras/models.py in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, **kwargs)
    662                               shuffle=shuffle,
    663                               class_weight=class_weight,
--> 664                               sample_weight=sample_weight)
    665 
    666     def evaluate(self, x, y, batch_size=32, verbose=1,

/usr/local/lib/python3.5/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch)
   1141                               val_f=val_f, val_ins=val_ins, shuffle=shuffle,
   1142                               callback_metrics=callback_metrics,
-> 1143                               initial_epoch=initial_epoch)
   1144 
   1145     def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None):

/usr/local/lib/python3.5/site-packages/keras/engine/training.py in _fit_loop(self, f, ins, out_labels, batch_size, nb_epoch, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch)
    841                 batch_logs['size'] = len(batch_ids)
    842                 callbacks.on_batch_begin(batch_index, batch_logs)
--> 843                 outs = f(ins_batch)
    844                 if not isinstance(outs, list):
    845                     outs = [outs]

/usr/local/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
   1601         session = get_session()
   1602         updated = session.run(self.outputs + [self.updates_op],
-> 1603                               feed_dict=feed_dict)
   1604         return updated[:len(self.outputs)]
   1605 

/usr/local/lib/python3.5/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata)
    764     try:
    765       result = self._run(None, fetches, feed_dict, options_ptr,
--> 766                          run_metadata_ptr)
    767       if run_metadata:
    768         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python3.5/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
    935                 ' to a larger type (e.g. int64).')
    936 
--> 937           np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
    938 
    939           if not subfeed_t.get_shape().is_compatible_with(np_val.shape):

/usr/local/lib/python3.5/site-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    529 
    530     """
--> 531     return array(a, dtype, copy=False, order=order)
    532 
    533 

ValueError: setting an array element with a sequence.

数据:

X.shape
(1000, 20)

标签:

y.shape
(1000,)

【问题讨论】:

  • 尝试sparse_categorical_crossentropy 并重塑y = y.reshape((-1, 1))
  • 您在哪一行收到此错误?似乎您直接使用了一个元组,您只需要一个字符串、字节或数字类型的值。请检查您收到此错误的语句。
  • @tumbleweed X 和 y 的类型是什么?
  • @tumbleweed 两者都应该是 numpy 数组或普通列表。这就是问题所在。
  • 试试 X = X.A() - 这可能会有所帮助。

标签: python numpy machine-learning deep-learning keras


【解决方案1】:

Dense()input_shape 参数应该是一个整数。因此,请尝试以下操作:

model.add(Dense(nb_classes, input_dim=dims))

来自official documentation

keras.layers.core.Dense(output_dim, init='glorot_uniform', activation=None, weights=None, W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None,bias=True,input_dim=None)

在哪里

input_dim:输入的维度(整数)。将此层用作模型中的第一层时,需要此参数(或关键字参数 input_shape)。

【讨论】:

  • 再次感谢...现在我得到了:ValueError: Error when checking model input: expected dense_input_3 to have shape (None, 1000) but got array with shape (1000, 68)...另外,对不起,这是我第一次使用 keras,我也在阅读文档..
  • 请在 SO 中提出不同的问题,如果可能,请提供您的完整代码,以便我可以运行和检查。从错误消息中,如果没有提供完整的代码,则很难确定错误位置。如果您遇到不同的问题,请提出多个问题,以便其他人看到您的帖子时有所帮助。
  • 谢谢!我更新并放了我正在使用的完整代码!
【解决方案2】:

密集层的第一个参数是该层的输出数量。因此,在您的情况下,您有一个形状为 (1000, 20) 的输入和形状为 (1000,) 的标签。这意味着你有 1000 个训练样本,有 20 个特征,每个标签都是一维的(你有 1000 个)。然后您需要修改模型以具有单个输出:

model = Sequential()
model.add(Dense(1, input_dim=dims))
model.compile(optimizer='sgd', loss='mean_squared_error')

这里我使用了你想要实现线性回归的事实来移除softmax(用于分类),并使用均方误差损失而不是交叉熵。

【讨论】:

  • 谢谢!,我得到了以下跟踪:ValueError: Invalid objective: mean_square_error
  • @tumbleweed 查看更新,它是平方的,不是平方的 :) 你也可以使用 mse 作为损失,它是一样的。
  • 嗯...在我得到的配件中:ValueError: setting an array element with a sequence.
  • @tumbleweed 最好提供完整的错误信息,这个错误可能有多种原因。
  • 我更新了完整的trace,感谢帮助我理解!
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多