出现这个问题的原因是图片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})
这样输入数据就可以使用进行训练了。报错解决。开始训练。