Keras 神经网络错误:使用序列设置数组元素

Posted

技术标签:

【中文标题】Keras 神经网络错误:使用序列设置数组元素【英文标题】:Keras Neural Network Error: Setting an Array Element with a Sequence 【发布时间】:2017-11-18 07:38:26 【问题描述】:

我正在将虚拟数据加载到神经网络中,但收到一个似乎无法调试的错误:

这是我的数据,可视化:

 df:
Label          Mar
0    | [[.332, .326], [.058, .138]]
0    | [[.234, .246], [.234, .395]]
1    | [[.084, .23], [.745, .923]], 

我正在尝试使用“Mar”列来预测“Label”列(我知道这些数据没有意义,它与我的真实数据相似)。这是我的神经网络代码:

model = Sequential()
model.add(Dense(3, input_dim=(1), activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
X = df['Mar']
Y = pd.get_dummies(df['Label'])
model.fit(X, Y, epochs=150, batch_size=10)

这是创建我的示例数据的代码:

Sample = ['Label': 0, 'Mar': [[.332, .326], [.058, .138]],
 'Label': 0, 'Mar': [[.234, .246], [.013, .592]],
 'Label': 1,  'Mar': [[.084, .23], [.745, .923]]]

df = pd.DataFrame(Sample)

当我到达这段代码的最后一行时,我得到了这个错误:

Epoch 1/150
-----------------------------------------------------------------------
ValueError                            Traceback (most recent call last)
<ipython-input-271-3d2506918d89> in <module>()
----> 1 model.fit(X, Y, epochs=150, batch_size=10)

/usr/local/lib/python2.7/site-packages/keras/models.pyc in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
    854                               class_weight=class_weight,
    855                               sample_weight=sample_weight,
--> 856                               initial_epoch=initial_epoch)
    857 
    858     def evaluate(self, x, y, batch_size=32, verbose=1,

/usr/local/lib/python2.7/site-packages/keras/engine/training.pyc in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
   1496                               val_f=val_f, val_ins=val_ins, shuffle=shuffle,
   1497                               callback_metrics=callback_metrics,
-> 1498                               initial_epoch=initial_epoch)
   1499 
   1500     def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None):

/usr/local/lib/python2.7/site-packages/keras/engine/training.pyc in _fit_loop(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch)
   1150                 batch_logs['size'] = len(batch_ids)
   1151                 callbacks.on_batch_begin(batch_index, batch_logs)
-> 1152                 outs = f(ins_batch)
   1153                 if not isinstance(outs, list):
   1154                     outs = [outs]

/usr/local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.pyc in __call__(self, inputs)
   2227         session = get_session()
   2228         updated = session.run(self.outputs + [self.updates_op],
-> 2229                               feed_dict=feed_dict)
   2230         return updated[:len(self.outputs)]
   2231 

/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata)
    776     try:
    777       result = self._run(None, fetches, feed_dict, options_ptr,
--> 778                          run_metadata_ptr)
    779       if run_metadata:
    780         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata)
    952             np_val = subfeed_val.to_numpy_array()
    953           else:
--> 954             np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
    955 
    956           if (not is_tensor_handle_feed and

/usr/local/lib/python2.7/site-packages/numpy/core/numeric.pyc 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.

我现在怀疑这与我的输入列是列表有关,而不是 np 数组?但是,我尝试先将它们制作成数组,但我仍然遇到同样的错误。真的很喜欢并感谢帮助!

编辑我尝试了一种对标签字段进行热编码的方法,因为我在网上某处找到了可能有所帮助的方法。在这一点上它没有帮助

【问题讨论】:

Mar 在这种情况下是什么意思?每个输入样本是 2 x 2 矩阵吗?您已经设置了输入层,使其接收一个神经元并将一个神经元输出到隐藏层。与您设置 NN 的方式相比,您的数据维度不匹配。 Mar 没有任何意义,它只是一组虚拟数据。对于您的另一点,我认为这可能是问题所在,但我已经尝试多次更改 NN 形状期望并且没有让它接受任何东西。你有什么建议? 我修复了尺寸大小,这样它就不会抱怨了。输入形状为 (3,)。问题仍然是“ValueError: Setting an array element with a sequence” 我在生成 numpy 向量时犯了错误。我错误地生成了一个列表数组。 【参考方案1】:

这里有几个问题,

    输入的形状错误 输入是数组和列表的混合体。

一种可能的解决方案是使用keras.layers.Flatten 重塑您的数据,并使用pd.Series.tolist() 统一输入数组的数据类型:

model = Sequential()
model.add(Flatten(input_shape=(2,2)))
model.add(Dense(3, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
X = df['Mar'].tolist()
Y = df['Label']
model.fit(X, Y, epochs=150, batch_size=10)

【讨论】:

以上是关于Keras 神经网络错误:使用序列设置数组元素的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow2.0TensorFlow 2.0高阶API: Keras—使用Keras基于Squential的序列编排模式创建神经网络过程(附带源码)

基于 Keras 用深度学习预测时间序列

利用Keras搭建LSTM循环神经网络

用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan

Keras中基础知识

Keras:如何“合并”两个不同神经网络的输出来训练解码器?