【发布时间】:2020-05-17 19:22:01
【问题描述】:
我需要 3 张图像作为 CNN 的输入,我使用 ImageGenerator 和 flow_from_dataframe 对其进行预处理:
idg = ImageDataGenerator(rescale = 1./255)
A_gen = idg.flow_from_dataframe(df,directory = path,x_col = 'A',y_col = 'class',target_size = (IMG_HEIGHT,IMG_WIDTH),
class_mode = 'binary',seed=1,batch_size=batch_size)
B_gen = idg.flow_from_dataframe(df,directory = path,x_col = 'taste1',y_col = 'class',target_size = (IMG_HEIGHT,IMG_WIDTH),
class_mode = 'binary',seed=1,batch_size=batch_size)
C_gen = idg.flow_from_dataframe(df,directory = path,x_col = 'taste2',y_col = 'class',target_size = (IMG_HEIGHT,IMG_WIDTH),
class_mode = 'binary',seed=1,batch_size=batch_size)
然后,我将所有 3 个生成器合二为一,使用:
def combine(A,B,C):
while True:
X1i = A.next()
X2i = B.next()
X3i = C.next()
yield [X1i[0], X2i[0],X3i[0]], X1i[1]
inputgenerator = combine(A_gen,B_gen,C_gen)
我的 CNN 的开头是这样的:
def simple_cnn():
pic_input1 = Input(shape=(IMG_HEIGHT, IMG_WIDTH, 3))
pic_input2 = Input(shape=(IMG_HEIGHT, IMG_WIDTH, 3))
pic_input3 = Input(shape=(IMG_HEIGHT, IMG_WIDTH, 3))
cnn1 = BatchNormalization()(pic_input1)
cnn2 = BatchNormalization()(pic_input2)
cnn3 = BatchNormalization()(pic_input3)
... (rest is not relevant I guess)
然后,我使用以下方法拟合我的模型:
model.fit(inputgenerator,steps_per_epoch=len(df) / batch_size, epochs=4)
到这里为止,一切都完美无缺。 (我知道,我需要使用验证集等,但首先我想确保我知道如何处理多个生成器)
但是,当我想进行预测时,我的测试生成器是:
idg2 = ImageDataGenerator(rescale = 1./255)
D_gen = idg2.flow_from_dataframe(df2,directory = path,x_col = 'D',y_col = 'None',target_size = (IMG_HEIGHT,IMG_WIDTH),
class_mode = None,seed=1,batch_size=1)
E_gen = idg2.flow_from_dataframe(df2,directory = path,x_col = 'E',y_col = 'None',target_size = (IMG_HEIGHT,IMG_WIDTH),
class_mode = None,seed=1,batch_size=1)
F_gen = idg2.flow_from_dataframe(df2,directory = path,x_col = 'F',y_col = 'None',target_size = (IMG_HEIGHT,IMG_WIDTH),
class_mode = None,seed=1,batch_size=1)
testgenerator = combine_test(D_gen,E_gen,F_gen)
pred = model.predict(testgenerator)
def combine_test(A,B,C):
while True:
X1i = A.next()
X2i = B.next()
X3i = C.next()
yield [X1i[0], X2i[0],X3i[0]]
我收到以下错误:
Traceback (most recent call last):
File "/home/maeul/Documents/ETHZ/2ndSemester/IntroToMachineLearning/Task4/Task4.py", line 228, in <module>
pred = model.predict(testgenerator)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py", line 1013, in predict
use_multiprocessing=use_multiprocessing)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 498, in predict
workers=workers, use_multiprocessing=use_multiprocessing, **kwargs)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 426, in _model_iteration
use_multiprocessing=use_multiprocessing)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 706, in _process_inputs
use_multiprocessing=use_multiprocessing)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/data_adapter.py", line 767, in __init__
dataset = standardize_function(dataset)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 684, in standardize_function
return dataset.map(map_fn, num_parallel_calls=dataset_ops.AUTOTUNE)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 1591, in map
self, map_func, num_parallel_calls, preserve_cardinality=True)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3926, in __init__
use_legacy_function=use_legacy_function)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3147, in __init__
self._function = wrapper_fn._get_concrete_function_internal()
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2395, in _get_concrete_function_internal
*args, **kwargs)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2389, in _get_concrete_function_internal_garbage_collected
graph_function, _, _ = self._maybe_define_function(args, kwargs)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2703, in _maybe_define_function
graph_function = self._create_graph_function(args, kwargs)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 2593, in _create_graph_function
capture_by_value=self._capture_by_value),
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py", line 978, in func_graph_from_py_func
func_outputs = python_func(*func_args, **func_kwargs)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3140, in wrapper_fn
ret = _wrapper_helper(*args)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3082, in _wrapper_helper
ret = autograph.tf_convert(func, ag_ctx)(*nested_args)
File "/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/autograph/impl/api.py", line 237, in wrapper
raise e.ag_error_metadata.to_exception(e)
ValueError: in converted code:
/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py:677 map_fn
batch_size=None)
/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py:2410 _standardize_tensors
exception_prefix='input')
/home/maeul/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_utils.py:573 standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking input: expected input_10 to have 4 dimensions, but got array with shape (None, None, None)
我猜这与单个生成器的批量大小有关,但我不知道如何通过在生成的每个图像中添加一个微不足道的维度来“欺骗”model.predict...
提前感谢您的帮助!
【问题讨论】:
标签: image keras generator predict