首页 > 解决方案 > ValueError:训练 CNN 时对象 __array__ 方法不生成数组

问题描述

我正在尝试运行 Udemy 课程中的 CNN 代码,只是对狗和猫的图像进行分类训练。但是,由于此值错误,我陷入了训练步骤:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-894200829115> in <module>()
----> 1 cnn.fit(x = training_set, validation_data = test_set, epochs = 25)

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in _method_wrapper(self, 
*args, **kwargs)
106   def _method_wrapper(self, *args, **kwargs):
107     if not self._in_multi_worker_mode():  # pylint: disable=protected-access
--> 108       return method(self, *args, **kwargs)
109 
110     # Running inside `run_distribute_coordinator` already.

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, 
batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, 
sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, 
validation_freq, max_queue_size, workers, use_multiprocessing)
1061           use_multiprocessing=use_multiprocessing,
1062           model=self,
-> 1063           steps_per_execution=self._steps_per_execution)
1064 
1065       # Container that configures and calls `tf.keras.Callback`s.

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, 
sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, 
max_queue_size, workers, use_multiprocessing, model, steps_per_execution)
1115         use_multiprocessing=use_multiprocessing,
1116         distribution_strategy=ds_context.get_strategy(),
-> 1117         model=model)
1118 
1119     strategy = ds_context.get_strategy()

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, 
sample_weights, shuffle, workers, use_multiprocessing, max_queue_size, model, **kwargs)
914         max_queue_size=max_queue_size,
915         model=model,
--> 916         **kwargs)
917 
918   @staticmethod

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, 
sample_weights, workers, use_multiprocessing, max_queue_size, model, **kwargs)
786     peek, x = self._peek_and_restore(x)
787     peek = self._standardize_batch(peek)
--> 788     peek = _process_tensorlike(peek)
789 
790     # Need to build the Model on concrete input shapes.

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in _ 
process_tensorlike(inputs)
1019     return x
1020 
-> 1021   inputs = nest.map_structure(_convert_numpy_and_scipy, inputs)
1022   return nest.list_to_tuple(inputs)
1023 

~\Anaconda3\lib\site-packages\tensorflow\python\util\nest.py in map_structure(func, *structure, 
**kwargs)
633 
634   return pack_sequence_as(
--> 635       structure[0], [func(*x) for x in entries],
636       expand_composites=expand_composites)
637 

~\Anaconda3\lib\site-packages\tensorflow\python\util\nest.py in <listcomp>(.0)
633 
634   return pack_sequence_as(
--> 635       structure[0], [func(*x) for x in entries],
636       expand_composites=expand_composites)
637 

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in 
convert_numpy_and_scipy(x)
1014       if issubclass(x.dtype.type, np.floating):
1015         dtype = backend.floatx()
-> 1016       return ops.convert_to_tensor(x, dtype=dtype)
1017     elif scipy_sparse and scipy_sparse.issparse(x):
1018       return _scipy_sparse_to_sparse_tensor(x)

~\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in convert_to_tensor(value, dtype, 
name, as_ref, preferred_dtype, dtype_hint, ctx, accepted_result_types)
1497 
1498     if ret is None:
-> 1499       ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
1500 
1501     if ret is NotImplemented:

~\Anaconda3\lib\site-packages\tensorflow\python\framework\tensor_conversion_registry.py in 
_default_conversion_function(***failed resolving arguments***)
 50 def _default_conversion_function(value, dtype, name, as_ref):
 51   del as_ref  # Unused.
 ---> 52   return constant_op.constant(value, dtype, name=name)
 53 
 54 

 ~\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in constant(value, dtype, 
shape, name)
262   """
263   return _constant_impl(value, dtype, shape, name, verify_shape=False,
--> 264                         allow_broadcast=True)
265 
266 

~\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in _constant_impl(value, 
dtype, shape, name, verify_shape, allow_broadcast)
273       with trace.Trace("tf.constant"):
274         return _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
--> 275     return _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
276 
277   g = ops.get_default_graph()

~\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in _constant_eager_impl(ctx, 
value, dtype, shape, verify_shape)
298 def _constant_eager_impl(ctx, value, dtype, shape, verify_shape):
299   """Implementation of eager constant."""
--> 300   t = convert_to_eager_tensor(value, ctx, dtype)
301   if shape is None:
302     return t

~\Anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in 
 convert_to_eager_tensor(value, ctx, dtype)
 96       dtype = dtypes.as_dtype(dtype).as_datatype_enum
 97   ctx.ensure_initialized()
 ---> 98   return ops.EagerTensor(value, ctx.device_name, dtype)
 99 
100 

ValueError: object __array__ method not producing an array

下面是代码片段:

# Importing the libraries
import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator
tf.__version__

# Part 1 - Data Preprocessing

# Preprocessing the Training set
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

# Preprocessing the Test set
test_datagen = ImageDataGenerator(rescale = 1./255)
test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

# Part 2 - Building the CNN

# Initialising the CNN
cnn = tf.keras.models.Sequential()

# Step 1 - Convolution
cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=[64, 64, 
3]))

# Step 2 - Pooling
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))

# Adding a second convolutional layer
cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))

# Step 3 - Flattening
cnn.add(tf.keras.layers.Flatten())

# Step 4 - Full Connection
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))

# Step 5 - Output Layer
cnn.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

# Part 3 - Training the CNN

# Compiling the CNN
cnn.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Training the CNN on the Training set and evaluating it on the Test set
cnn.fit(x = training_set, validation_data = test_set, epochs = 25) # the line causing problem

如您所见,在训练步骤之前,其他一切正常: 在此处输入图像描述 我正在使用从 Win10 上的 Anaconda3 安装的 Python 3.7.0。我尝试了以下方法:

  1. 在 Jupyter Notebook 和本地 IDE (Spyder) 上运行
  2. 使用不同版本的 Tensorflow,即 v2.3.1、v 2.3.0 和 v2.2.0(讲座中使用的版本)

由于问题仍然存在,上述方法均无效。安装的keras版本是2.4.3。然而,代码在Google Colab上运行流畅,唯一的区别是数据图像是使用命令从 DropBox 加载和解压缩的,因为 Google Colab 没有与主机操作系统文件系统连接。

对于导致错误的原因以及如何解决它,我将不胜感激。

标签: pythontensorflowkerasconv-neural-network

解决方案


在您的模型代码中,如下所示

cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=[64, 64, 
3]))

input_shape 是一个元组而不是一个列表。应该是 input_shape=(64,64)。可能还有其他问题,但请先解决此问题


推荐阅读