Reputation: 1482
I'm attempting to train a CNN but the program fails every time but in a random location. The error that's kicking up is OSError: image file is truncated (15 bytes not processed)
. FYI this is dealing with augmented data from a previous step. The code is below:
import os
from keras import backend as K
from keras.layers import Activation, Dense, Dropout
from keras.layers import Conv2D, Flatten, MaxPooling2D
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
cwd = os.getcwd()
# dimensions of our images.
img_width, img_height = 150, 150
train_data_dir = (str(cwd) + r'\augmented\train\\')
validation_data_dir = (str(cwd) + r'\augmented\validation\\')
nb_train_samples = 1000
nb_validation_samples = 500
epochs = 20
batch_size = 10
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height)
else:
input_shape = (img_width, img_height, 3)
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
history = model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
model.save_weights('chips.h5')
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
The CNN starts iterating but usually in epoch 2 somewhere I get this truncated image thing. All the images were augmented the same way though. Anyone have ideas?
Entire traceback is:
Traceback (most recent call last):
File "c:\Users\Mac2\.vscode\extensions\ms-python.python-2019.3.6558\pythonFiles\ptvsd_launcher.py", line 45, in <module>
main(ptvsdArgs)
File "c:\Users\Mac2\.vscode\extensions\ms-python.python-2019.3.6558\pythonFiles\lib\python\ptvsd\__main__.py", line 391, in main
run()
File "c:\Users\Mac2\.vscode\extensions\ms-python.python-2019.3.6558\pythonFiles\lib\python\ptvsd\__main__.py", line 272, in run_file
runpy.run_path(target, run_name='__main__')
File "C:\Users\Mac2\Anaconda3\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Users\Mac2\Anaconda3\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Users\Mac2\Anaconda3\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "c:\Users\Mac2\Desktop\CNN\Chips\train.py", line 119, in <module>
validation_steps=nb_validation_samples // batch_size)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras\legacy\interfaces.py", lineapper
return func(*args, **kwargs)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras\engine\training.py", line 1t_generator
initial_epoch=initial_epoch)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras\engine\training_generator.p81, in fit_generator
generator_output = next(output_generator)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras\utils\data_utils.py", linet
six.reraise(*sys.exc_info())
File "C:\Users\Mac2\Anaconda3\lib\site-packages\six.py", line 693, in reraise
raise value
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras\utils\data_utils.py", linet
inputs = self.queue.get(block=True).get()
File "C:\Users\Mac2\Anaconda3\lib\multiprocessing\pool.py", line 644, in get
raise self._value
File "C:\Users\Mac2\Anaconda3\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras\utils\data_utils.py", linext_sample
return six.next(_SHARED_SEQUENCES[uid])
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras_preprocessing\image\iteratoe 100, in __next__
return self.next(*args, **kwargs)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras_preprocessing\image\iteratoe 112, in next
return self._get_batches_of_transformed_samples(index_array)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras_preprocessing\image\iteratoe 226, in _get_batches_of_transformed_samples
interpolation=self.interpolation)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\keras_preprocessing\image\utils.p26, in load_img
img = img.resize(width_height_tuple, resample)
File "C:\Users\Mac2\Anaconda3\lib\site-packages\PIL\Image.py", line 1763, in resi self.load()
File "C:\Users\Mac2\Anaconda3\lib\site-packages\PIL\ImageFile.py", line 232, in l "(%d bytes not processed)" % len(b))
OSError: image file is truncated (15 bytes not processed)
Upvotes: 1
Views: 961
Reputation: 1179
Your problem seems to be a different sized image, your program seems to crash due to the settings in pillow. Here is the official code of the pillow module, if you search for truncated you can see why this error can be raised. Here the highest voted answer provides code to prevent an import error with the truncated image.
Alternatively you can remove the image, here are people with your problem that simply sort out all images smaller than 50kB. Hope this helps.
Upvotes: 1