Python 获取操作错误:[Errno 16]设备或资源正忙:';使用tf.keras.models.Sequential.fit_生成器时

Python 获取操作错误:[Errno 16]设备或资源正忙:';使用tf.keras.models.Sequential.fit_生成器时,python,tensorflow,keras,Python,Tensorflow,Keras,我修改了我在这里找到的代码: 因此,它可以与tf.keras一起工作,但是当我使用fit_generator时,会出现设备或资源忙的错误。 我尝试了tf.keras.models.Sequential.fit,但没有得到这个错误 from __future__ import print_function import numpy as np import os from keras.datasets import cifar100 from tensorflow.keras.preproces

我修改了我在这里找到的代码: 因此,它可以与
tf.keras
一起工作,但是当我使用
fit_generator
时,会出现设备或资源忙的错误。 我尝试了
tf.keras.models.Sequential.fit
,但没有得到这个错误

from __future__ import print_function
import numpy as np
import os

from keras.datasets import cifar100
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPool2D, BatchNormalization
from tensorflow.keras import optimizers
from tensorflow.keras import regularizers

import tensorflow as tf
import tensorflow.keras as keras

def build_model(): 

def normalize(x,y):

def main():
    batch_size = 128
    maxepochs = 250
    learning_rate = 0.1
    lr_decay = 1e-6
    lr_drop = 20

    tf.logging.set_verbosity(tf.logging.INFO)
    os.environ["CUDA_VISIBLE_DEVICES"] = '0'

    (x_train, y_train), (x_test, y_test) = cifar100.load_data()
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train, x_test = normalize(x_train, x_test)

    y_train = keras.utils.to_categorical(y_train, num_classes)
    y_test = keras.utils.to_categorical(y_test, num_classes)

    model = build_model()

    def lr_scheduler(epoch):
        return learning_rate * (0.5 ** (epoch // lr_drop))

    reduce_lr = keras.callbacks.LearningRateScheduler(lr_scheduler)

    datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=False,  # apply ZCA whitening
        rotation_range=15,  # randomly rotate images in the range (degrees, 0 to 180)
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=True,  # randomly flip images
        vertical_flip=False)  # randomly flip images

    datagen.fit(x_train)


    sgd = optimizers.SGD(lr=learning_rate, decay=lr_decay, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

    model.fit_generator(datagen.flow(x_train, y_train,
                                 batch_size=batch_size),
                    steps_per_epoch=None,
                    epochs=maxepochs,
                    use_multiprocessing=False,
                    validation_data=(x_test, y_test), callbacks=[reduce_lr], verbose=1)
这是我在培训结束时(250个纪元之后)遇到的错误:


它试图删除一些用于进程间通信的临时目录,但该目录是通过NFS装载的,其中的一些文件是打开的。NFS不支持在文件打开时取消链接的其他常见Unix习惯用法,因此NFS客户端通过重命名文件来模拟该文件,并在文件关闭后真正将其删除

当然,递归删除也会尝试删除重命名的文件,从而克服这一问题。在某些情况下,它只是再次重命名它(如果递归删除最终尝试
rmdir
,则生成
enotery
),但您得到了
EBUSY
(可能表示文件正在执行?)


在某些情况下,它可能是由交互活动引起的,但如果这不是问题所在,请确保在让自动清理运行之前,已清理所有资源并加入进程。

它正在尝试删除用于进程之间通信的一些临时目录,但是目录是通过NFS挂载的,其中的一些文件是打开的。NFS不支持在文件打开时取消链接的其他常见Unix习惯用法,因此NFS客户端通过重命名文件来模拟该文件,并在文件关闭后真正将其删除

当然,递归删除也会尝试删除重命名的文件,从而克服这一问题。在某些情况下,它只是再次重命名它(如果递归删除最终尝试
rmdir
,则生成
enotery
),但您得到了
EBUSY
(可能表示文件正在执行?)


在某些情况下,这可能是由交互活动引起的,但如果这不是问题所在,请确保在让自动清理运行之前,已清理所有资源并加入进程。

感谢您澄清此问题。然而,我不太清楚你所说的“你的资源被清理,你的流程被加入”是什么意思。你能详细解释一下吗?@ShadiRahimian:我没有你所有的代码,而且可能对TensorFlow了解不够,无法准确地说出来,但是回溯显示解释器正在关闭,我们知道一个文件仍然打开。后者的罪魁祸首可能是
ImageDataGenerator
,因为
fit_generator
希望它无限期地生成数据。您还可以使用
pdb
获取目录名,这可能表明哪个子系统正在尝试清理。或者在
.nfs…
上运行
文件
,以识别其类型。感谢您澄清此问题。然而,我不太清楚你所说的“你的资源被清理,你的流程被加入”是什么意思。你能详细解释一下吗?@ShadiRahimian:我没有你所有的代码,而且可能对TensorFlow了解不够,无法准确地说出来,但是回溯显示解释器正在关闭,我们知道一个文件仍然打开。后者的罪魁祸首可能是
ImageDataGenerator
,因为
fit_generator
希望它无限期地生成数据。您还可以使用
pdb
获取目录名,这可能表明哪个子系统正在尝试清理。或者在
.nfs…
上运行
文件
,以识别其类型。
Traceback (most recent call last):

 File "/BS/work/anaconda3/envs/gpu/lib/python3.6/multiprocessing/util.py", line 262, in _run_finalizers
    finalizer()

File "/BS/work/anaconda3/envs/gpu/lib/python3.6/multiprocessing/util.py", line 186, in __call__
    res = self._callback(*self._args, **self._kwargs)

File "/BS/work/anaconda3/envs/gpu/lib/python3.6/shutil.py", line 486, in rmtree
    _rmtree_safe_fd(fd, path, onerror)

File "/BS/work/anaconda3/envs/gpu/lib/python3.6/shutil.py", line 444, in _rmtree_safe_fd
    onerror(os.unlink, fullname, sys.exc_info())

File "/BS/work/anaconda3/envs/gpu/lib/python3.6/shutil.py", line 442, in _rmtree_safe_fd
    os.unlink(name, dir_fd=topfd)

OSError: [Errno 16] Device or resource busy: '.nfs00000000000890d30000a675'