ValueError: Cannot feed value of shape (10,) for Tensor ‘Placeholder_1:0‘, which has shape ‘(?, 2)‘

出现这个问题的原因是图片image和标签label的维度不匹配,也就是在取出数据的时候没用进行维度的归一化。
如下,在读取tfrecord文件时:

def read_and_decode(filename,Image_height,Image_width,Image_channel,Batch_size,isTrain):
    # 创建文件名队列并读取
    filename_queue = tf.train.string_input_producer([filename])
    # 内存队列不需要创建,直接使用reader读取文件名即可
    # serialized_example=tf.data.TFRecordDataset(filename_queue)
    reader = tf.TFRecordReader()
    _,serialized_example=reader.read(filename_queue)#返回文件名和文件


    """ 
    serialized:一个标量字符串张量,单个序列化的例子。features:一个字典;
    name:此操作的名称(可选)。
    example_names:(可选)标量字符串张量,关联的名称。
    """
    #最后返回一个字典,映射功能键到 Tensor 和 SparseTensor 值。
    """
    为了解析每个输入样本每一列数据,需要定义一个解析字典。
    tensorflow提供了三种方式:FixedLenFeature、VarLenFeature、FixedLenSequenceFeature,
    分别解析定长特征、变长特征、定长序列特征。
    """
    features=tf.io.parse_single_example(serialized_example,
                            features={
                                'path':tf.io.FixedLenFeature([], tf.string),                                                       
                                'label':tf.io.FixedLenFeature([],tf.int64),#与存储的类型一致
                            })


    """
    将原来编码为字符串类型的变量重新变回来,因为制作图片源数据一般写进tfrecord里,
    用to_bytes的形式,也就是字符串。这里将原始数据取出来 必须制定原始数据的格式,
    原始数据是什么格式这里解析必须是什么格式,要不然会出现形状的不对应问题!
    """
    img=tf.decode_raw(features['path'],tf.uint8) #图片名
    img=tf.reshape(img,shape=[Image_height,Image_width,Image_channel]) #调整大小

    #数据类型的转变,不会改变原始数据的值还有形状
    img = tf.cast(img, tf.float32) * (1.0 / 255.0) #黑白
    # label = tf.cast(features['label'], tf.float32)

    label = features['label']
    label= slim.one_hot_encoding(labels=label, num_classes=2) #对标签进行维度的统一。

    if isTrain:
        #打乱顺序读取数据,先将队列中数据打乱,然后再从队列里读取出来
        img_batch, label_batch = tf.train.shuffle_batch([img, label],
                                            batch_size=Batch_size,
                                            num_threads=1,capacity=1000,
                                            min_after_dequeue=800)
                                        #出队后队列中元素的最小数量,用于确保元素的混合级别
    else:
        # 从队列中按顺序读取队列中的数据
        img_batch,label_batch=tf.train.batch([img,label],batch_size=Batch_size,
                                             num_threads=1,#线程数量,若批次不确定  > 1.
                                             capacity=1000) #队列中元素的最大数量

    return img_batch,label_batch

在上面的代码中,取数据的关键代码如下:

 img=tf.decode_raw(features['path'],tf.uint8) #图片名
    img=tf.reshape(img,shape=[Image_height,Image_width,Image_channel]) #调整大小

    #数据类型的转变,不会改变原始数据的值还有形状
    img = tf.cast(img, tf.float32) * (1.0 / 255.0) #黑白
    # label = tf.cast(features['label'], tf.float32)

    label = features['label']
    label= slim.one_hot_encoding(labels=label, num_classes=2) #对标签进行维度的统一。

这样完成维度统一过后,再在反向传播过程中使用即可。
示例:

img_batch, label_batch = util.read_and_decode(filename, Image_height,
                                                  Image_width, Image_channel, batch_size,
                                                  True)

image,label=sess.run([img_batch,label_batch])
            _,cost,train_accuarcy,yy=sess.run([train_op,loss,accuarcy,y],feed_dict={x:image,y_:label})

这样输入数据就可以使用进行训练了。报错解决。开始训练。

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值