I am trying to train my model (Image classification) using Tensorflow. I keep getting an error when I try to run the following cell:
JavaScript
x
8
1
hist = model.fit(
2
train_generator,
3
epochs=100,
4
verbose=1,
5
steps_per_epoch=steps_per_epoch,
6
validation_data=valid_generator,
7
validation_steps=val_steps_per_epoch).history
8
Error is:
JavaScript
1
99
99
1
Epoch 1/100
2
27/31 [=========================> .] - ETA: 1s - loss: 0.7309 - acc: 0.6181
3
---------------------------------------------------------------------------
4
UnknownError Traceback (most recent call last)
5
<ipython-input-36-b1c104100211> in <module>
6
2 val_steps_per_epoch = np.ceil(valid_generator.samples/valid_generator.batch_size)
7
3
8
----> 4 hist = model.fit(
9
5 train_generator,
10
6 epochs=100,
11
12
/opt/anaconda3/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)
13
1098 _r=1):
14
1099 callbacks.on_train_batch_begin(step)
15
-> 1100 tmp_logs = self.train_function(iterator)
16
1101 if data_handler.should_sync:
17
1102 context.async_wait()
18
19
/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
20
826 tracing_count = self.experimental_get_tracing_count()
21
827 with trace.Trace(self._name) as tm:
22
--> 828 result = self._call(*args, **kwds)
23
829 compiler = "xla" if self._experimental_compile else "nonXla"
24
830 new_tracing_count = self.experimental_get_tracing_count()
25
26
/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
27
853 # In this case we have created variables on the first call, so we run the
28
854 # defunned version which is guaranteed to never create variables.
29
--> 855 return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable
30
856 elif self._stateful_fn is not None:
31
857 # Release the lock early so that multiple threads can perform the call
32
33
/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in __call__(self, *args, **kwargs)
34
2940 (graph_function,
35
2941 filtered_flat_args) = self._maybe_define_function(args, kwargs)
36
-> 2942 return graph_function._call_flat(
37
2943 filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access
38
2944
39
40
/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
41
1916 and executing_eagerly):
42
1917 # No tape is watching; skip to running the function.
43
-> 1918 return self._build_call_outputs(self._inference_function.call(
44
1919 ctx, args, cancellation_manager=cancellation_manager))
45
1920 forward_backward = self._select_forward_and_backward_functions(
46
47
/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in call(self, ctx, args, cancellation_manager)
48
553 with _InterpolateFunctionError(self):
49
554 if cancellation_manager is None:
50
--> 555 outputs = execute.execute(
51
556 str(self.signature.name),
52
557 num_outputs=self._num_outputs,
53
54
/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
55
57 try:
56
58 ctx.ensure_initialized()
57
---> 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
58
60 inputs, attrs, num_outputs)
59
61 except core._NotOkStatusException as e:
60
61
UnknownError: UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x7fc88d55c9a0>
62
Traceback (most recent call last):
63
64
File "/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/ops/script_ops.py", line 249, in __call__
65
ret = func(*args)
66
67
File "/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/autograph/impl/api.py", line 620, in wrapper
68
return func(*args, **kwargs)
69
70
File "/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/data/ops/dataset_ops.py", line 891, in generator_py_func
71
values = next(generator_state.get_iterator(iterator_id))
72
73
File "/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 807, in wrapped_generator
74
for data in generator_fn():
75
76
File "/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 933, in generator_fn
77
yield x[i]
78
79
File "/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py", line 65, in __getitem__
80
return self._get_batches_of_transformed_samples(index_array)
81
82
File "/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py", line 227, in _get_batches_of_transformed_samples
83
img = load_img(filepaths[j],
84
85
File "/opt/anaconda3/lib/python3.8/site-packages/keras_preprocessing/image/utils.py", line 114, in load_img
86
img = pil_image.open(io.BytesIO(f.read()))
87
88
File "/opt/anaconda3/lib/python3.8/site-packages/PIL/Image.py", line 2943, in open
89
raise UnidentifiedImageError(
90
91
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x7fc88d55c9a0>
92
93
94
[[{{node PyFunc}}]]
95
[[IteratorGetNext]] [Op:__inference_train_function_24233]
96
97
Function call stack:
98
train_function
99
I tried changing from loss=’categorical_crossentropy’ to loss=’binary_crossentropy’ but still the issue persists. I wish to train the model but the Epoch keeps getting stuck.
Edit:
The train generator function and where it is used is as follows:
JavaScript
1
25
25
1
IMAGE_SHAPE = (224, 224)
2
TRAINING_DATA_DIR = str(data_root)
3
4
5
datagen_kwargs = dict(rescale=1./255, validation_split=.20)
6
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(**datagen_kwargs)
7
valid_generator = valid_datagen.flow_from_directory(
8
TRAINING_DATA_DIR,
9
subset="validation",
10
shuffle=True,
11
target_size=IMAGE_SHAPE
12
)
13
14
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(**datagen_kwargs)
15
train_generator = train_datagen.flow_from_directory(
16
TRAINING_DATA_DIR,
17
subset="training",
18
shuffle=True,
19
target_size=IMAGE_SHAPE)
20
21
22
for image_batch, label_batch in train_generator:
23
break
24
image_batch.shape, label_batch.shape
25
Output: ((32, 224, 224, 3), (32, 2))
JavaScript
1
7
1
print (train_generator.class_indices)
2
3
labels = 'n'.join(sorted(train_generator.class_indices.keys()))
4
5
with open('labels.txt', 'w') as f:
6
f.write(labels)
7
Output: {‘off’: 0, ‘on’: 1}
Advertisement
Answer
There was an issue with one of the img that was causing an issue and was pointed out by @Lescurel. To view the img you can run the following:
JavaScript
1
11
11
1
import PIL
2
from pathlib import Path
3
from PIL import UnidentifiedImageError
4
5
path = Path("INSERT PATH HERE").rglob("*.jpeg")
6
for img_p in path:
7
try:
8
img = PIL.Image.open(img_p)
9
except PIL.UnidentifiedImageError:
10
print(img_p)
11
You can also do the same for png or other formats. If there is an issue with your image, it will list it as soon as you run it