我正在尝试读取用于训练的自定义映射数据集。但在我使用py_function映射数据集后,我得到了未知的形状,比如:
def process_path(file_path):
label = get_label(file_path)
img = tf.io.read_file(file_path)
img = decode_img(img)
print('image shape:', img.shape) #this print correctly: image shape: (180, 180, 3)
print('label shape:', label.shape) #this print correctly: label shape: ()
return img, label
train_ds = train_ds.map(lambda x: tf.py_function(process_path, [x], (tf.float32, tf.int32)))
print(train_ds)
# this print unknown shape <PrefetchDataset shapes: (<unknown>, <unknown>), types: (tf.float32, tf.int32)>
这将使model.fit((失败,所以我想将数据集重塑为正确的形状,如:
<BatchDataset shapes: ((None, 180, 180, 3), (None,)), types: (tf.float32, tf.int32)>
使用:
train_ds = tf.reshape(train_ds, ((None, 180, 180, 3), (None,)))
但这会产生一个错误:
ValueError: Attempt to convert a value (<MapDataset shapes: (<unknown>, <unknown>), types: (tf.float32, tf.int32)>) with an unsupported type (<class 'tensorflow.python.data.ops.dataset_ops.MapDataset'>) to a Tensor.
在此步骤中,我如何正确分配(图像、标签(形状?
此处不需要py_function
。假设您有一个名为/dogs
的文件夹,里面装满了jpg
。您可以使用这两个小函数来加载和解码。
如果文件名(例如'dogs\dog1.jpg'
(在dogs文件夹中,则第一个返回1
,否则返回0
。
第二个函数还获取一个文件名,并将其转换为0和1之间的浮点值。然后,它还会调整图片的大小。
如果有什么不清楚的地方,请告诉我。
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
from glob2 import glob
os.chdir('c:/users/nicol/pictures')
files = glob('*/*jpg')
def get_label(file_path):
split = tf.strings.split(file_path, sep=os.sep)[0]
equal = tf.equal(split, 'dogs')
cast = tf.cast(equal, tf.int32)
return cast
def process_path(file_path):
label = get_label(file_path)
img = tf.io.read_file(file_path)
img = tf.image.decode_jpeg(img, channels=3)
img = tf.image.convert_image_dtype(img, tf.float32)
img = tf.image.resize(img, size=(180, 180))
return img, label
train_ds = tf.data.Dataset.from_tensor_slices(files).map(process_path)
next(iter(train_ds))
(<tf.Tensor: shape=(180, 180, 3), dtype=float32, numpy=
array([[[1.41176477e-01, 9.41176564e-02, 1.33333340e-01],
[1.41176477e-01, 9.41176564e-02, 1.33333340e-01],
[1.41176477e-01, 9.41176564e-02, 1.33333340e-01],
...,
[2.63300300e-01, 2.76176542e-01, 4.67582583e-01],
[2.46176332e-01, 2.59706050e-01, 4.50785339e-01],
[2.54726082e-01, 2.68909693e-01, 4.59662050e-01]]], dtype=float32)>,
<tf.Tensor: shape=(), dtype=int32, numpy=1>)
get_label
应该返回一个整数,如果不是这样的话。