Keras AttributeError:“列表”对象没有属性“ndim”

Posted

技术标签:

【中文标题】Keras AttributeError:“列表”对象没有属性“ndim”【英文标题】:Keras AttributeError: 'list' object has no attribute 'ndim' 【发布时间】:2018-07-07 16:55:58 【问题描述】:

我正在 Jupyter Notebook (Python 3.6) 中运行 Keras 神经网络模型

我收到以下错误

AttributeError: 'list' 对象没有属性 'ndim'

从 Keras.model 调用 .fit() 方法后

model  = Sequential()
model.add(Dense(5, input_dim=len(X_data[0]), activation='sigmoid' ))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['acc'])
model.fit(X_data, y_data, epochs=20, batch_size=10)

我检查了 Keras(在 Anaconda3 中)的 requirements.txt 文件,numpy、scipy 和六个模块版本都是最新的。

什么可以解释这个AttributeError?

完整的错误信息如下(似乎与 Numpy 有点相关):

----------------------------------- ---------------------------- AttributeError Traceback(最近调用 最后)在() 3 model.add(密集(1,激活='sigmoid')) 4 model.compile(loss='mean_squared_error',优化器='adam',metrics=['acc']) ----> 5 model.fit(X_data, y_data, epochs=20, batch_size=10)

~\Anaconda3\lib\site-packages\keras\models.py in fit(self, x, y, batch_size、epochs、verbose、回调、validation_split、 验证数据,洗牌,类权重,样本权重,初始时期, steps_per_epoch, validation_steps, **kwargs) 第963章 第964章 --> 965 验证步骤=验证步骤) 966 第967章

~\Anaconda3\lib\site-packages\keras\engine\training.py in fit(self, x, y,batch_size,epochs,详细,回调,validation_split, 验证数据,洗牌,类权重,样本权重,初始时期, steps_per_epoch, validation_steps, **kwargs) 1591 类重量=类重量,1592 check_batch_axis=假, -> 1593 batch_size=batch_size) 1594 # 准备验证数据。第1595章

~\Anaconda3\lib\site-packages\keras\engine\training.py 在 _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size) 1424 self._feed_input_shapes,1425 check_batch_axis=False, -> 1426 exception_prefix='input')1427 y = _standardize_input_data(y,self._feed_output_names, 第1428章

~\Anaconda3\lib\site-packages\keras\engine\training.py 在 _standardize_input_data(数据、名称、形状、check_batch_axis、exception_prefix) 68 elif isinstance(数据,列表): 69 data = [x.values if x.class.name == 'DataFrame' else x for x in data] ---> 70 data = [np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data] 其他 71 条: 72 data = data.values if data.class.name == 'DataFrame' else data

~\Anaconda3\lib\site-packages\keras\engine\training.py 在 (.0) 68 elif isinstance(数据,列表): 69 data = [x.values if x.class.name == 'DataFrame' else x for x in data] ---> 70 data = [np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data] 其他 71 条: 72 data = data.values if data.class.name == 'DataFrame' else data

AttributeError: 'list' 对象没有属性 'ndim'

【问题讨论】:

【参考方案1】:

model.fit 期望 xy 是 numpy 数组。好像您传递了一个列表,它试图通过读取 numpy 数组的 ndim 属性来获取输入的形状,但失败了。

您可以使用np.array 简单地对其进行转换:

import numpy as np
...
model.fit(np.array(train_X),np.array(train_Y), epochs=20, batch_size=10)

【讨论】:

这就是问题所在。修复!不过有趣的是,因为即使数据是双矩阵而不是 numpy 数组,Keras 也可以在另一台计算机上运行。感谢您的帮助!【参考方案2】:

我不知道您的训练数据的形状,但我怀疑您的 input_dim 有错误。尝试将其更改为 input_dim=len(X_data),如下所示:

model  = Sequential()
model.add(Dense(5, input_dim=len(X_data), activation='sigmoid' ))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['acc'])
model.fit(X_data, y_data, epochs=20, batch_size=10)

【讨论】:

X_data 有 5 个特征,y_data 有 2 个特征。输出数据可能是原因,但切换到 numpy 数组可以解决问题。【参考方案3】:

当您导入时,您应该使用 tensorflow.keras 而不仅仅是 keras,如下所示:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Dense

因为有一个与keras 模块相关的错误。

参考:here。

【讨论】:

这是用于 tensorflow 2.x 的吗?

以上是关于Keras AttributeError:“列表”对象没有属性“ndim”的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:模块 'keras.utils' 没有属性 'Sequence'

如何修复 AttributeError:模块 'tensorflow' 没有属性 'keras'?

AttributeError:无法导入 keras 和分割模型

AttributeError:模块'tensorflow_core.python.keras.api._v2.keras.activations'没有属性'swish'

AttributeError:模块“tensorflow.keras.layers”没有属性“重新缩放”

AttributeError:模块“tensorflow”在 conda 提示中没有属性“keras”