I'm running a convolutional neural network to classify cats and dogs. Here's my code.
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
)
I'm using the 'Cat and dog' dataset from Kaggle: https://www.kaggle.com/tongpython/cat-and-dog.
When I try to fit the model, (that's this part:
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=15,
steps_per_epoch=22,
validation_steps=22,
verbose=1
)
), TensorFlow throws this error:
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.
I didn't find any similar resources on StackOverflow. I don't know what I'm doing wrong.
Can you help?
CodePudding user response:
First of all your model has an input shape of input_shape=(300,300,3)
and you are reshaping the images to a shape of target_size=(150,150)
.
CodePudding user response:
Turns out the issue was where I defined the Sequential
model, which is this part:
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')
])
In the first Conv2D layer, I set the input_shape
to (300, 300, 3)
, but in the generator, I set the target_size
to be (150,150)
. Looks like these two must be aligned.
So, now, I could either change the model definition or I could change the generator. I chose to do the model, 'cause that came in my way first. So, my Sequential model looks like this now:
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')
])