UnknownError: OSError: 无法识别图像文件 <_io.BytesIO object at 0x7fc87d222b30> multiprocessing.pool.RemoteTraceback:

问题描述

我正在尝试使用 EfficientNet 进行迁移学习并出现此错误 任何答案请提供详细信息如何解决错误是当我尝试训练模型时。由于某种原因,它有时无法读取图像。

import pickle
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import rcParams
import tensorflow as tf
import keras
from keras import layers,optimizers
get_ipython().run_line_magic('matplotlib','inline')
from keras.models import Sequential,load_model
from keras.layers import Conv2D,MaxPool2D,Dropout,Flatten,Dense 
from keras.layers.normalization import Batchnormalization
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import Callback,EarlyStopping,ModelCheckpoint
from sklearn.metrics import confusion_matrix,classification_report
from skimage.transform import resize
import seaborn as sns
import cv2
import os
import glob
import shutil

batch_size = 48

width = 150
height = 150
epochs = 20
NUM_TRAIN = 2000
NUM_TEST = 1000
dropout_rate = 0.2
input_shape = (height,width,3)

from efficientnet.keras import EfficientNetB0 as Net
from efficientnet.keras import center_crop_and_resize,preprocess_input

conv_base = Net(weights='imagenet',include_top=False,input_shape=input_shape)

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
      rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')
# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # This is the target directory
        train_dir,# All images will be resized to target height and width.
        target_size=(height,width),batch_size=batch_size,# Since we use categorical_crossentropy loss,we need categorical labels
        class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,target_size=(height,class_mode='categorical')

model = Sequential()
model.add(conv_base)
model.add(layers.GlobalMaxPooling2D(name="gap"))
# model.add(layers.Flatten(name="flatten"))
if dropout_rate > 0:
    model.add(layers.Dropout(dropout_rate,name="dropout_out"))
# model.add(layers.Dense(256,activation='relu',name="fc1"))
model.add(layers.Dense(2,activation='softmax',name="fc_out"))

model.compile(loss='categorical_crossentropy',optimizer=optimizers.RMSprop(lr=2e-5),metrics=['acc'])
history = model.fit_generator(
      train_generator,steps_per_epoch= NUM_TRAIN //batch_size,epochs=epochs,validation_data=validation_generator,validation_steps= NUM_TEST //batch_size,verbose=1,use_multiprocessing=True,workers=4)

我遇到了这个错误,我知道它与枕头和阅读图像或张量流有关:

Epoch 1/20
WARNING:tensorflow:multiprocessing can interact badly with TensorFlow,causing nondeterministic deadlocks. For high performance data pipelines tf.data is recommended.
11/41 [=======>......................] - ETA: 15s - loss: 1.9679 - acc: 0.5833
---------------------------------------------------------------------------
UnkNownError                              Traceback (most recent call last)
<ipython-input-21-bbda3a575f01> in <module>
      2               optimizer=optimizers.RMSprop(lr=2e-5),3               metrics=['acc'])
----> 4 history = model.fit_generator(
      5       train_generator,6       steps_per_epoch= NUM_TRAIN //batch_size,/usr/local/lib/python3.8/dist-packages/tensorflow/python/util/deprecation.py in new_func(*args,**kwargs)
    322               'in a future version' if date is None else ('after %s' % date),323               instructions)
--> 324       return func(*args,**kwargs)
    325     return tf_decorator.make_decorator(
    326         func,new_func,'deprecated',/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/engine/training.py in fit_generator(self,generator,steps_per_epoch,epochs,verbose,callbacks,validation_data,validation_steps,validation_freq,class_weight,max_queue_size,workers,use_multiprocessing,shuffle,initial_epoch)
   1813     """
   1814     _keras_api_gauge.get_cell('fit_generator').set(True)
-> 1815     return self.fit(
   1816         generator,1817         steps_per_epoch=steps_per_epoch,/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/engine/training.py in _method_wrapper(self,*args,**kwargs)
    106   def _method_wrapper(self,**kwargs):
    107     if not self._in_multi_worker_mode():  # pylint: disable=protected-access
--> 108       return method(self,**kwargs)
    109 
    110     # Running inside `run_distribute_coordinator` already.

/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/engine/training.py in fit(self,x,y,batch_size,validation_split,sample_weight,initial_epoch,validation_batch_size,use_multiprocessing)
   1096                 batch_size=batch_size):
   1097               callbacks.on_train_batch_begin(step)
-> 1098               tmp_logs = train_function(iterator)
   1099               if data_handler.should_sync:
   1100                 context.async_wait()

/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/def_function.py in __call__(self,**kwds)
    778       else:
    779         compiler = "nonXla"
--> 780         result = self._call(*args,**kwds)
    781 
    782       new_tracing_count = self._get_tracing_count()

/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/def_function.py in _call(self,**kwds)
    805       # In this case we have created variables on the first call,so we run the
    806       # defunned version which is guaranteed to never create variables.
--> 807       return self._stateless_fn(*args,**kwds)  # pylint: disable=not-callable
    808     elif self._stateful_fn is not None:
    809       # Release the lock early so that multiple threads can perform the call

/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py in __call__(self,**kwargs)
   2827     with self._lock:
   2828       graph_function,args,kwargs = self._maybe_define_function(args,kwargs)
-> 2829     return graph_function._filtered_call(args,kwargs)  # pylint: disable=protected-access
   2830 
   2831   @property

/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py in _filtered_call(self,kwargs,cancellation_manager)
   1841       `args` and `kwargs`.
   1842     """
-> 1843     return self._call_flat(
   1844         [t for t in nest.flatten((args,kwargs),expand_composites=True)
   1845          if isinstance(t,(ops.Tensor,/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py in _call_flat(self,captured_inputs,cancellation_manager)
   1921         and executing_eagerly):
   1922       # No tape is watching; skip to running the function.
-> 1923       return self._build_call_outputs(self._inference_function.call(
   1924           ctx,cancellation_manager=cancellation_manager))
   1925     forward_backward = self._select_forward_and_backward_functions(

/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py in call(self,ctx,cancellation_manager)
    543       with _InterpolateFunctionError(self):
    544         if cancellation_manager is None:
--> 545           outputs = execute.execute(
    546               str(self.signature.name),547               num_outputs=self._num_outputs,/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name,num_outputs,inputs,attrs,name)
     57   try:
     58     ctx.ensure_initialized()
---> 59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle,device_name,op_name,60                                         inputs,num_outputs)
     61   except core._NotOkStatusException as e:

UnkNownError:  OSError: cannot identify image file <_io.BytesIO object at 0x7fc87d222b30>
multiprocessing.pool.RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/pool.py",line 125,in worker
    result = (True,func(*args,**kwds))
  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/utils/data_utils.py",line 679,in get_index
    return _SHARED_SEQUENCES[uid][i]
  File "/home/zion/.local/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py",line 65,in __getitem__
    return self._get_batches_of_transformed_samples(index_array)
  File "/home/zion/.local/lib/python3.8/site-packages/keras_preprocessing/image/iterator.py",line 227,in _get_batches_of_transformed_samples
    img = load_img(filepaths[j],File "/home/zion/.local/lib/python3.8/site-packages/keras_preprocessing/image/utils.py",line 114,in load_img
    img = pil_image.open(io.BytesIO(f.read()))
  File "/usr/local/lib/python3.8/dist-packages/PIL/Image.py",line 2818,in open
    raise IOError("cannot identify image file %r" % (filename if filename else fp))
OSError: cannot identify image file <_io.BytesIO object at 0x7fc87d222b30>
"""


The above exception was the direct cause of the following exception:


Traceback (most recent call last):

  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/ops/script_ops.py",line 244,in __call__
    ret = func(*args)

  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/autograph/impl/api.py",line 302,in wrapper
    return func(*args,**kwargs)

  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/data/ops/dataset_ops.py",line 827,in generator_py_func
    values = next(generator_state.get_iterator(iterator_id))

  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/engine/data_adapter.py",line 814,in wrapped_generator
    for data in generator_fn():

  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/utils/data_utils.py",line 900,in get
    six.reraise(*sys.exc_info())

  File "/home/zion/.local/lib/python3.8/site-packages/six.py",line 703,in reraise
    raise value

  File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/utils/data_utils.py",line 891,in get
    inputs = self.queue.get(block=True,timeout=5).get()

  File "/usr/lib/python3.8/multiprocessing/pool.py",line 771,in get
    raise self._value

OSError: cannot identify image file <_io.BytesIO object at 0x7fc87d222b30>


     [[{{node PyFunc}}]]
     [[IteratorGetNext]] [Op:__inference_train_function_30570]

Function call stack:
train_function

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)