'_1_shuffle_batch/random_shuffle_queue' is closed and has insufficient elements1



训练网络时;一直出现这种错误,   

TFRecordReader "OutOfRangeError (see above for traceback): RandomShuffleQueue '_1_shuffle_batch/random_shuffle_queue' is closed and has insufficient elements (requested 1, current size 0)" ;

1. tf.decode_raw(features['image_raw'],tf.uint8) 解码时,数据类型有没有错?tf.float32 和tf.uint8有没有弄混???

2. tf.train.string_input_producer([data_file],num_epochs=1) 如果设置num_epochs=1参数,请添加上 tf.local_variables_initializer()


3. 你的数据集通道有没有搞错?真的都是三通道或者都是单通道么?有没有可能单通道图像混在在三通道图像当中呢?

for i in train_img:
    image=Image.open(i)
    if image.mode=='RGB':
       print((image.mode))


4. 图像的大小之前resize了么?前后一直么?

 5.查找资料后终于找到解决办法:因为局部变量(local variables)没有初始化,将初始化变量语句改为

        全局变量初始化:tf.global_variables_initializer().run()

        局部变量初始化:tf.local_variables_initializer().run()

6.看一下图像路径是不是有空格,有空格,也会报这种错误

7

     

一般来说:capacity的计算公式是: capacity=min_after_dequeue+3*batch_size

1.capacity的计算不对会引发这个问题,

2.num_threads=64 也会引发这个问题,解决方法:把这个暂时去掉,原因尚未知

image_batch, label_batch = tf.train.shuffle_batch([image,label],
                                                 batch_size=batch_size,
                                                 # num_threads=64,
                                                 capacity=capacity,
                                                 min_after_dequeue=1000)

解决方法:把num_threads=64 删掉

image_batch, label_batch = tf.train.shuffle_batch([image,label],
                                                 batch_size=batch_size,
                                                 # num_threads=64,
                                                 capacity=capacity,
                                                 min_after_dequeue=1000)



8:图像有损坏,检测是否损坏,用try和except进行异常处理

def get_trainfiles(file_dir,i):
    first = []
    label_first = []
    middle = []
    label_middle = []
    end1 = []
    label_end1 = []
    only = []
    label_only = []
    j=0
    #定义存放各类别数据和对应标签的列表,列表名对应你所需要分类的列别名
    #A5,A6等是我的数据集中要分类图片的名字
    cout=0
    for file in os.listdir(file_dir):
        for file1 in os.listdir(file_dir+'/'+file):
            for file2 in os.listdir(file_dir+'/'+file+'/'+file1): 
                for file3 in os.listdir(file_dir+'/'+file+'/'+file1+'/'+file2): 
                    dir=file_dir+'/'+file+'/'+file1+'/'+file2 +'/'+ file3
                    if 'C.jpg' in file3:
                        #print(Image.open(dir))
                        try:
                           image=Image.open(dir) 
                        except IOError:
                               print(dir)
                               print ("Error: 没有找到文件或读取文件失败")                               
                        else:
                             print(dir)
                             only.append(dir)
                             label_only.append(0)
                             cout=cout+1       
                    elif 'CB.jpg' in file3:
                        try:
                           image=Image.open(dir) 
                        except IOError:
                               print(dir)
                               print ("Error: 没有找到文件或读取文件失败")                               
                        else:
                             print(dir)
                             end1.append(dir)
                             label_end1.append(3)
                             cout=cout+1    
                    elif 'CA.jpg' in file3:
                        try:
                           image=Image.open(dir) 
                        except IOError:
                               print(dir)
                               print ("Error: 没有找到文件或读取文件失败")                              
                        else:
                             print(dir)
                             first.append(dir)
                             label_first.append(1)
                             cout=cout+1 
                    elif('C.jpg' not in file3) and ('CA.jpg' not in file3)and ('CB.jpg' not in file3)and ('.jpg' in file3):
                        try:                           
                           image=Image.open(dir) 
                        except IOError:
                               print(dir)
                               print ("Error: 没有找到文件或读取文件失败")                               
                        else:
                             print(dir)
                             middle.append(dir)
                             label_middle.append(2)
                             cout=cout+1                        
                    else:
                        j=j+1 
                    if cout==i:
                        break                  
    print('There are %d first\nThere are %d middle\nThere are %d end1\nThere are %d only' %(len(first),len(middle),len(end1),len(only)))                
                        
    image_list = np.hstack((first,middle,end1,only)) 
    label_list = np.hstack((label_first,label_middle,label_end1,label_only))
    #用来水平合并数组

    temp = np.array([image_list,label_list])
    temp = temp.transpose()
    np.random.shuffle(temp)

    image_list = list(temp[:,0])
    label_list = list(temp[:,1])
    label_list = [int(i) for i in label_list]  
   
    return  image_list,label_list

总结一下:一般遇到这个错误,代码本身没有问题,基本上都是参数不一致和图像数据集导致的,注意检查各个参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值