reshape 的输入是一个有 8434176 个值的张量,但请求的形状需要 78400 的倍数
Input to reshape is a tensor with 8434176 values, but the requested shape requires a multiple of 78400
我是 运行 一个卷积神经网络,用于对猫狗进行分类。这是我的代码。
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(
loss='binary_crossentropy',
optimizer=RMSprop(lr=0.001)
)
train_datagen = ImageDataGenerator(rescale=1/255)
train_generator = train_datagen.flow_from_directory(
'training_set',
target_size=(150,150),
batch_size=456,
class_mode='binary'
)
validation_datagen = ImageDataGenerator(rescale=1/255)
validation_generator = validation_datagen.flow_from_directory(
'test_set',
target_size=(150,150),
batch_size=456,
class_mode='binary'
)
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=15,
steps_per_epoch=22,
validation_steps=22,
verbose=1
)
我正在使用来自 Kaggle 的 'Cat and dog' 数据集:https://www.kaggle.com/tongpython/cat-and-dog。
当我尝试拟合模型时,(就是这部分:
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=15,
steps_per_epoch=22,
validation_steps=22,
verbose=1
)
),TensorFlow 抛出此错误:
InvalidArgumentError Traceback (most recent call last)
/var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_2168/2235557206.py in <module>
----> 1 history = model.fit(
2 train_generator,
3 validation_data=validation_generator,
4 epochs=15,
5 steps_per_epoch=22,
~/miniforge3/envs/aiml/lib/python3.8/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)
1098 _r=1):
1099 callbacks.on_train_batch_begin(step)
-> 1100 tmp_logs = self.train_function(iterator)
1101 if data_handler.should_sync:
1102 context.async_wait()
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
826 tracing_count = self.experimental_get_tracing_count()
827 with trace.Trace(self._name) as tm:
--> 828 result = self._call(*args, **kwds)
829 compiler = "xla" if self._experimental_compile else "nonXla"
830 new_tracing_count = self.experimental_get_tracing_count()
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
886 # Lifting succeeded, so variables are initialized and we can run the
887 # stateless function.
--> 888 return self._stateless_fn(*args, **kwds)
889 else:
890 _, _, _, filtered_flat_args = \
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in __call__(self, *args, **kwargs)
2940 (graph_function,
2941 filtered_flat_args) = self._maybe_define_function(args, kwargs)
-> 2942 return graph_function._call_flat(
2943 filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access
2944
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
1916 and executing_eagerly):
1917 # No tape is watching; skip to running the function.
-> 1918 return self._build_call_outputs(self._inference_function.call(
1919 ctx, args, cancellation_manager=cancellation_manager))
1920 forward_backward = self._select_forward_and_backward_functions(
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in call(self, ctx, args, cancellation_manager)
553 with _InterpolateFunctionError(self):
554 if cancellation_manager is None:
--> 555 outputs = execute.execute(
556 str(self.signature.name),
557 num_outputs=self._num_outputs,
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
57 try:
58 ctx.ensure_initialized()
---> 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
60 inputs, attrs, num_outputs)
61 except core._NotOkStatusException as e:
InvalidArgumentError: Input to reshape is a tensor with 8434176 values, but the requested shape requires a multiple of 78400
[[node sequential/flatten/Reshape (defined at var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_2168/2235557206.py:1) ]]
[[MLCSubgraphOp_0_0]] [Op:__inference_train_function_747]
Function call stack:
train_function.
我在 Whosebug 上没有找到任何类似的资源。我不知道我做错了什么。
你能帮忙吗?
原来问题出在我定义 Sequential
模型的地方,也就是这部分:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
在第一个 Conv2D 层中,我将 input_shape
设置为 (300, 300, 3)
,但在生成器中,我将 target_size
设置为 (150,150)
。看起来这两个必须对齐。
所以,现在,我可以更改模型定义或更改生成器。我选择做模特,因为那首先影响了我。所以,我的顺序模型现在看起来像这样:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
首先,您的模型的输入形状为 input_shape=(300,300,3)
,您正在将图像重塑为 target_size=(150,150)
的形状。
我是 运行 一个卷积神经网络,用于对猫狗进行分类。这是我的代码。
import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(
loss='binary_crossentropy',
optimizer=RMSprop(lr=0.001)
)
train_datagen = ImageDataGenerator(rescale=1/255)
train_generator = train_datagen.flow_from_directory(
'training_set',
target_size=(150,150),
batch_size=456,
class_mode='binary'
)
validation_datagen = ImageDataGenerator(rescale=1/255)
validation_generator = validation_datagen.flow_from_directory(
'test_set',
target_size=(150,150),
batch_size=456,
class_mode='binary'
)
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=15,
steps_per_epoch=22,
validation_steps=22,
verbose=1
)
我正在使用来自 Kaggle 的 'Cat and dog' 数据集:https://www.kaggle.com/tongpython/cat-and-dog。
当我尝试拟合模型时,(就是这部分:
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=15,
steps_per_epoch=22,
validation_steps=22,
verbose=1
)
),TensorFlow 抛出此错误:
InvalidArgumentError Traceback (most recent call last)
/var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_2168/2235557206.py in <module>
----> 1 history = model.fit(
2 train_generator,
3 validation_data=validation_generator,
4 epochs=15,
5 steps_per_epoch=22,
~/miniforge3/envs/aiml/lib/python3.8/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)
1098 _r=1):
1099 callbacks.on_train_batch_begin(step)
-> 1100 tmp_logs = self.train_function(iterator)
1101 if data_handler.should_sync:
1102 context.async_wait()
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
826 tracing_count = self.experimental_get_tracing_count()
827 with trace.Trace(self._name) as tm:
--> 828 result = self._call(*args, **kwds)
829 compiler = "xla" if self._experimental_compile else "nonXla"
830 new_tracing_count = self.experimental_get_tracing_count()
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
886 # Lifting succeeded, so variables are initialized and we can run the
887 # stateless function.
--> 888 return self._stateless_fn(*args, **kwds)
889 else:
890 _, _, _, filtered_flat_args = \
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in __call__(self, *args, **kwargs)
2940 (graph_function,
2941 filtered_flat_args) = self._maybe_define_function(args, kwargs)
-> 2942 return graph_function._call_flat(
2943 filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access
2944
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
1916 and executing_eagerly):
1917 # No tape is watching; skip to running the function.
-> 1918 return self._build_call_outputs(self._inference_function.call(
1919 ctx, args, cancellation_manager=cancellation_manager))
1920 forward_backward = self._select_forward_and_backward_functions(
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in call(self, ctx, args, cancellation_manager)
553 with _InterpolateFunctionError(self):
554 if cancellation_manager is None:
--> 555 outputs = execute.execute(
556 str(self.signature.name),
557 num_outputs=self._num_outputs,
~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
57 try:
58 ctx.ensure_initialized()
---> 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
60 inputs, attrs, num_outputs)
61 except core._NotOkStatusException as e:
InvalidArgumentError: Input to reshape is a tensor with 8434176 values, but the requested shape requires a multiple of 78400
[[node sequential/flatten/Reshape (defined at var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_2168/2235557206.py:1) ]]
[[MLCSubgraphOp_0_0]] [Op:__inference_train_function_747]
Function call stack:
train_function.
我在 Whosebug 上没有找到任何类似的资源。我不知道我做错了什么。
你能帮忙吗?
原来问题出在我定义 Sequential
模型的地方,也就是这部分:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
在第一个 Conv2D 层中,我将 input_shape
设置为 (300, 300, 3)
,但在生成器中,我将 target_size
设置为 (150,150)
。看起来这两个必须对齐。
所以,现在,我可以更改模型定义或更改生成器。我选择做模特,因为那首先影响了我。所以,我的顺序模型现在看起来像这样:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
首先,您的模型的输入形状为 input_shape=(300,300,3)
,您正在将图像重塑为 target_size=(150,150)
的形状。