损失函数震荡不收敛可能原因:tf.train.shuffle_batch

​ 在制作tfrecords数据集的时候,比如说将cifar数据转换成tfrecords数据集,一般会用到tf.train.shuffle_batch函数,而损失函数震荡不收敛的原因就可能就是数据集制作出现问题。

​ Cifar-10数据集包含了airlane、automobile、bird、cat、deer、dog、frog、horse、ship、truck,10种分类 ,分别放在十个文件夹中。共60000张图片,其中训练集50000张,测试集10000张。

在这里插入图片描述

​ 开始在制作数据集的时候,我是先将一个文件夹中的所有图片写入tfrecords,这样制作的问题就是:将同一类的图片按照顺序写入到了tfrecords中,然而后面再读取tfrecords时,使用到了tf.train.shuffle_batch,此函数只是在batch_size中reshuffle,总体的顺序并没有改变,所以喂入网络的数据都是同一类的图片,并不能起到训练网络的效果。

​ 正确的做法是:应该将这些图片打乱之后写入到tfrecords中。我采取的方法是:因为每个文件夹中图片数量是固定的,所以将这些图片名称全部读取出来,存储到字典中,因为batch_size为200,所以依次从十个文件夹中读取20张图片写入到tfrecords中,这样再训练的时候,取出的数据就不再会是同一类的图片。

def write_tfRecord(tfRecordName, image_path, label_path):
    writer = tf.python_io.TFRecordWriter(tfRecordName)  
    num_pic = 0 
    dirs = os.listdir(image_path)
    # print(dirs)
    contents = {}
    for _dir in dirs:
        temp_path = os.path.join(image_path, _dir)
        temp = os.listdir(temp_path)
        contents[_dir] = temp
        # print(len(contents[_dir]))
    # print(contents)

    for i in range(int(len(contents[dirs[0]]) / 20)):
        for index in range(len(dirs)):
            for j in range(i*20, i*20+20):
                ima_path = os.path.join(image_path, dirs[index], contents[dirs[index]][j])
                img = Image.open(ima_path)
                img_raw = img.tobytes()
                labels = [0] * 10
                labels[index] = 1

                example = tf.train.Example(features=tf.train.Features(feature={
                        'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw])),
                        'label': tf.train.Feature(int64_list=tf.train.Int64List(value=labels))
                        })) 
                writer.write(example.SerializeToString())
                num_pic += 1 
                print ("the number of picture:", num_pic)
      
    writer.close()
    print("write tfrecord successful")
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值