![](/img/trans.png)
[英]Keras ImageGenerator : IndexError: list index out of range
[英]IndexError: list index out of range while keras model.predict()
如果我嘗試使用帶有 3 個輸入的 model 使用此代碼進行預測:
predicted_seaLevel = []
prediction = model2.predict(
[[np.array(X[0][0])],[np.array(X[1][0])],[np.array(X[2][0])]],
batch_size=None,
verbose='auto',
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
predicted_seaLevel.append(prediction)
我收到此錯誤:
IndexError Traceback (most recent call last)
Input In [119], in <cell line: 3>()
1 predicted_seaLevel = []
----> 3 prediction = model2.predict(
4 [[np.array(X[0][0])],[np.array(X[1][0])],[np.array(X[2][0])]],
5 batch_size=None,
6 verbose='auto',
7 steps=None,
8 callbacks=None,
9 max_queue_size=10,
10 workers=1,
11 use_multiprocessing=False
12 )
13 predicted_seaLevel.append(prediction)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\training.py:1720, in Model.predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
1714 except ValueError:
1715 warnings.warn('Using Model.predict with '
1716 'MultiWorkerDistributionStrategy or TPUStrategy and '
1717 'AutoShardPolicy.FILE might lead to out-of-order result'
1718 '. Consider setting it to AutoShardPolicy.DATA.')
-> 1720 data_handler = data_adapter.get_data_handler(
1721 x=x,
1722 batch_size=batch_size,
1723 steps_per_epoch=steps,
1724 initial_epoch=0,
1725 epochs=1,
1726 max_queue_size=max_queue_size,
1727 workers=workers,
1728 use_multiprocessing=use_multiprocessing,
1729 model=self,
1730 steps_per_execution=self._steps_per_execution)
1732 # Container that configures and calls `tf.keras.Callback`s.
1733 if not isinstance(callbacks, callbacks_module.CallbackList):
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\data_adapter.py:1383, in get_data_handler(*args, **kwargs)
1381 if getattr(kwargs["model"], "_cluster_coordinator", None):
1382 return _ClusterCoordinatorDataHandler(*args, **kwargs)
-> 1383 return DataHandler(*args, **kwargs)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\data_adapter.py:1138, in DataHandler.__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, distribute)
1135 self._steps_per_execution_value = steps_per_execution.numpy().item()
1137 adapter_cls = select_data_adapter(x, y)
-> 1138 self._adapter = adapter_cls(
1139 x,
1140 y,
1141 batch_size=batch_size,
1142 steps=steps_per_epoch,
1143 epochs=epochs - initial_epoch,
1144 sample_weights=sample_weight,
1145 shuffle=shuffle,
1146 max_queue_size=max_queue_size,
1147 workers=workers,
1148 use_multiprocessing=use_multiprocessing,
1149 distribution_strategy=tf.distribute.get_strategy(),
1150 model=model)
1152 strategy = tf.distribute.get_strategy()
1154 self._current_step = 0
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\data_adapter.py:240, in TensorLikeDataAdapter.__init__(self, x, y, sample_weights, sample_weight_modes, batch_size, epochs, steps, shuffle, **kwargs)
235 (sample_weights, _, _) = training_utils.handle_partial_sample_weights(
236 y, sample_weights, sample_weight_modes, check_all_flat=True)
238 inputs = pack_x_y_sample_weight(x, y, sample_weights)
--> 240 num_samples = set(int(i.shape[0]) for i in tf.nest.flatten(inputs)).pop()
241 _check_data_cardinality(inputs)
243 # If batch_size is not passed but steps is, calculate from the input data.
244 # Default to 32 for backwards compat.
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\data_adapter.py:240, in <genexpr>(.0)
235 (sample_weights, _, _) = training_utils.handle_partial_sample_weights(
236 y, sample_weights, sample_weight_modes, check_all_flat=True)
238 inputs = pack_x_y_sample_weight(x, y, sample_weights)
--> 240 num_samples = set(int(i.shape[0]) for i in tf.nest.flatten(inputs)).pop()
241 _check_data_cardinality(inputs)
243 # If batch_size is not passed but steps is, calculate from the input data.
244 # Default to 32 for backwards compat.
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\framework\tensor_shape.py:896, in TensorShape.__getitem__(self, key)
894 else:
895 if self._v2_behavior:
--> 896 return self._dims[key].value
897 else:
898 return self._dims[key]
IndexError: list index out of range
這是我的 Model:
def simpleFunctional():
input1 = keras.layers.Input(shape=(1,))
input2 = keras.layers.Input(shape=(1,))
input3 = keras.layers.Input(shape=(1,))
merged = keras.layers.Concatenate(axis=1)([input1, input2, input3])
dense1 = keras.layers.Dense(16, input_dim=2, activation=keras.activations.relu, use_bias=True)(merged)
dense2 = keras.layers.Dense(32, input_dim=2, activation=keras.activations.relu, use_bias=True)(dense1)
dense3 = keras.layers.Dense(64, input_dim=2, activation=keras.activations.relu, use_bias=True)(dense2)
dense4 = keras.layers.Dense(32, input_dim=2, activation=keras.activations.relu, use_bias=True)(dense3)
dense5 = keras.layers.Dense(32, input_dim=2, activation=keras.activations.relu, use_bias=True)(dense4)
output = keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True)(dense5)
model = keras.models.Model(inputs=[input1, input2, input3], outputs=output)
#opt = SGD(learning_rate=0.001)
model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=["accuracy"],)
history = model.fit(X_train, Y_train, batch_size=45, epochs=900)
test_scores = model.evaluate(X_test, Y_test, verbose=2)
print("Test loss:", test_scores[0])
print("Test accuracy:", test_scores[1])
model.save("../AI_Lilly")
return model
但這工作得很好:
predicted_seaLevel = []
prediction = model2.predict(
[[np.array([0.21468531468531468])],[np.array([0.4228191581323462])],[np.array([0.17076839761718698])]],
batch_size=None,
verbose='auto',
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
predicted_seaLevel.append(prediction)
盡管:
[[np.array(X[0][0])],[np.array(X[1][0])],[np.array(X[2][0])]] == [[np.array([0.21468531468531468])],[np.array([0.4228191581323462])],[np.array([0.17076839761718698])]]
是真的。
我也試過:
X_0 = []
X_1 = []
X_2 = []
for i in range(54):
X_0.append(np.array(X[0][i]))
X_1.append(np.array(X[1][i]))
X_2.append(np.array(X[2][i]))
predicted_seaLevel = []
prediction = model2.predict(
[[X_0[0]],[X_1[0]],[X_2[0]]],
batch_size=None,
verbose='auto',
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
predicted_seaLevel.append(prediction)
但它給了我同樣的錯誤。
我也試過:
predicted_seaLevel = []
prediction = model2.predict(
[X[0][0],X[1][0],X[2][0]],
batch_size=None,
verbose='auto',
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
predicted_seaLevel.append(prediction)
但它給了我這個錯誤:
Input In [146], in <cell line: 3>()
1 predicted_seaLevel = []
----> 3 prediction = model2.predict(
4 [X[0][0],X[1][0],X[2][0]],
5 batch_size=None,
6 verbose='auto',
7 steps=None,
8 callbacks=None,
9 max_queue_size=10,
10 workers=1,
11 use_multiprocessing=False
12 )
13 predicted_seaLevel.append(prediction)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\training.py:1751, in Model.predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
1749 for step in data_handler.steps():
1750 callbacks.on_predict_batch_begin(step)
-> 1751 tmp_batch_outputs = self.predict_function(iterator)
1752 if data_handler.should_sync:
1753 context.async_wait()
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\def_function.py:885, in Function.__call__(self, *args, **kwds)
882 compiler = "xla" if self._jit_compile else "nonXla"
884 with OptionalXlaContext(self._jit_compile):
--> 885 result = self._call(*args, **kwds)
887 new_tracing_count = self.experimental_get_tracing_count()
888 without_tracing = (tracing_count == new_tracing_count)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\def_function.py:924, in Function._call(self, *args, **kwds)
921 self._lock.release()
922 # In this case we have not created variables on the first call. So we can
923 # run the first trace but we should fail if variables are created.
--> 924 results = self._stateful_fn(*args, **kwds)
925 if self._created_variables and not ALLOW_DYNAMIC_VARIABLE_CREATION:
926 raise ValueError("Creating variables on a non-first call to a function"
927 " decorated with tf.function.")
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\function.py:3038, in Function.__call__(self, *args, **kwargs)
3035 """Calls a graph function specialized to the inputs."""
3036 with self._lock:
3037 (graph_function,
-> 3038 filtered_flat_args) = self._maybe_define_function(args, kwargs)
3039 return graph_function._call_flat(
3040 filtered_flat_args, captured_inputs=graph_function.captured_inputs)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\function.py:3459, in Function._maybe_define_function(self, args, kwargs)
3449 with ag_ctx.ControlStatusCtx(
3450 status=ag_status, options=self._autograph_options):
3451
(...)
3454 # and 2. there's no provided input signature
3455 # and 3. there's been a cache miss for this calling context
3456 if (self._experimental_relax_shapes and
3457 self.input_signature is None and
3458 call_context_key in self._function_cache.missed):
-> 3459 return self._define_function_with_shape_relaxation(
3460 args, kwargs, flat_args, filtered_flat_args, cache_key_context)
3462 self._function_cache.missed.add(call_context_key)
3463 graph_function = self._create_graph_function(args, kwargs)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\function.py:3381, in Function._define_function_with_shape_relaxation(self, args, kwargs, flat_args, filtered_flat_args, cache_key_context)
3374 (relaxed_arg_specs, relaxed_kwarg_specs) = nest.pack_sequence_as(
3375 (args, kwargs), relaxed_arg_specs, expand_composites=False)
3376 (args, kwargs) = nest.pack_sequence_as(
3377 (relaxed_arg_specs, relaxed_kwarg_specs),
3378 flat_args,
3379 expand_composites=True)
-> 3381 graph_function = self._create_graph_function(
3382 args, kwargs, override_flat_arg_shapes=relaxed_arg_shapes)
3383 self._function_cache.arg_relaxed[rank_only_cache_key] = graph_function
3385 return (graph_function, [
3386 t for t in nest.flatten((args, kwargs), expand_composites=True)
3387 if isinstance(t, (ops.Tensor,
3388 resource_variable_ops.BaseResourceVariable))
3389 ])
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\function.py:3298, in Function._create_graph_function(self, args, kwargs, override_flat_arg_shapes)
3293 missing_arg_names = [
3294 "%s_%d" % (arg, i) for i, arg in enumerate(missing_arg_names)
3295 ]
3296 arg_names = base_arg_names + missing_arg_names
3297 graph_function = ConcreteFunction(
-> 3298 func_graph_module.func_graph_from_py_func(
3299 self._name,
3300 self._python_function,
3301 args,
3302 kwargs,
3303 self.input_signature,
3304 autograph=self._autograph,
3305 autograph_options=self._autograph_options,
3306 arg_names=arg_names,
3307 override_flat_arg_shapes=override_flat_arg_shapes,
3308 capture_by_value=self._capture_by_value),
3309 self._function_attributes,
3310 function_spec=self.function_spec,
3311 # Tell the ConcreteFunction to clean up its graph once it goes out of
3312 # scope. This is not the default behavior since it gets used in some
3313 # places (like Keras) where the FuncGraph lives longer than the
3314 # ConcreteFunction.
3315 shared_func_graph=False)
3316 return graph_function
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\framework\func_graph.py:1007, in func_graph_from_py_func(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes, acd_record_initial_resource_uses)
1004 else:
1005 _, original_func = tf_decorator.unwrap(python_func)
-> 1007 func_outputs = python_func(*func_args, **func_kwargs)
1009 # invariant: `func_outputs` contains only Tensors, CompositeTensors,
1010 # TensorArrays and `None`s.
1011 func_outputs = nest.map_structure(convert, func_outputs,
1012 expand_composites=True)
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\eager\def_function.py:668, in Function._defun_with_scope.<locals>.wrapped_fn(*args, **kwds)
664 with default_graph._variable_creator_scope(scope, priority=50): # pylint: disable=protected-access
665 # __wrapped__ allows AutoGraph to swap in a converted function. We give
666 # the function a weak reference to itself to avoid a reference cycle.
667 with OptionalXlaContext(compile_with_xla):
--> 668 out = weak_wrapped_fn().__wrapped__(*args, **kwds)
669 return out
File ~\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\framework\func_graph.py:994, in func_graph_from_py_func.<locals>.wrapper(*args, **kwargs)
992 except Exception as e: # pylint:disable=broad-except
993 if hasattr(e, "ag_error_metadata"):
--> 994 raise e.ag_error_metadata.to_exception(e)
995 else:
996 raise
ValueError: in user code:
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\training.py:1586 predict_function *
return step_function(self, iterator)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\training.py:1576 step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1286 run
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2849 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:3632 _call_for_each_replica
return fn(*args, **kwargs)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\training.py:1569 run_step **
outputs = model.predict_step(data)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\training.py:1537 predict_step
return self(x, training=False)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\base_layer.py:1020 __call__
input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)
C:\Users\FutureSpace\.conda\envs\handwritingNumbersAI\lib\site-packages\keras\engine\input_spec.py:199 assert_input_compatibility
raise ValueError('Layer ' + layer_name + ' expects ' +
ValueError: Layer model_18 expects 3 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=float32>]
我真的不知道如何解決,也無法向自己解釋一件事有效,但另一件事等於第一件事無效。
請幫忙!
您需要為 model 提供 3 個輸入,因此您的預測輸入必須具有如下形狀:
[(None, 1), (None, 1), (None, 1)]
要解決您的問題,只需使用以下命令:
model.predict(
[
np.array([[X[0][0]],]), # inputs of input1
np.array([[X[1][0]],]), # inputs of input2
np.array([[X[2][0]],]), # inputs of input3
],
...
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.