无法将 Python 列表转换为 Tensorflow 数据集(InvalidArgumentError:所有输入的形状必须匹配...)



我正在尝试制作一个神经网络(使用YT指南,但我必须更改数据输入代码),我需要批处理数据集的火车功能正常工作(idk为什么,不是事件确定)。但是,当我尝试使用tensorflow.data.Dataset.from_tensor_slices(train_data))将列车数据列表转换为数据集时,我收到一条错误消息:

InvalidArgumentError
{{function_node __wrapped__Pack_N_3_device_/job:localhost/replica:0/task:0/device:GPU:0}} Shapes of all inputs must match: values[0].shape = [105,105,3] != values[2].shape = [1] [Op:Pack] name: 0

train_data列表由560个列表组成,每个列表包含3个元素:

<tf.Tensor: shape=(105, 105, 3), dtype=float32, numpy = array([[["105x105 3-dimensional image with my face"]]]. dtype=float32)>
<tf.Tensor: shape=(105, 105, 3), dtype=float32, numpy = array([[["different image with the same properties"]]] dtype=float32)>
<tf.Tensor: shape=(1,), dtype=float32, numpy=array(["1. or 0. (float), a label, showing if these pictures are actually the pictures of the same person"], dtype=float32)>

我很确定train_data列表中的所有形状都与描述的完全相同。

关于使用.shape方法的形状的一些数据

train_data.shape #"AttributeError: 'list' object has no attribute 'shape'" - main list
train_data[0].shape #"AttributeError: 'list' object has no attribute 'shape'" - sublist, with 3 elements
train_data[0][0].shape #"TensorShape([105, 105, 3])" - first image
train_data[0][0][0].shape #"TensorShape([105, 3])" - first row of image pixels, ig
train_data[0][0][0][0].shape #"TensorShape([3])" - pixel in the left upper corner

这就是我想做的:图像对的标签(1。或者0)之前只是一个整数。然后,我收到一个错误,说这里的一切都应该是相同类型的float32。然后,我试图将其转换为张量,但它没有改变什么,除了当前错误信息的最后一部分,它原来是"值[2]。Shape = []"之前。

我真的不知道是什么导致了这个错误。我没有任何使用Tensorflow的经验。

对不起,如果我的英语不好

编辑:这是将图像从某个目录中取出的代码。可能导致眼睛出血

for i in os.listdir("t"):
for ii in os.listdir(os.path.join("t", i)):
td.append([
[
tensorflow.expand_dims(
tensorflow.io.decode_jpeg(
tensorflow.io.read_file(os.path.join("t", i, ii) + "\" + os.listdir(os.path.join("t", i, ii))[0])) / 255, 0), 
tensorflow.expand_dims(
tensorflow.io.decode_jpeg(
tensorflow.io.read_file(os.path.join("t", i, ii) + "\2.jpeg")) / 255, 0)],
tensorflow.convert_to_tensor(
float(
os.listdir(os.path.join("t", i, ii))[0][0]
)
)
])

我添加了一些空格,以使它更易于阅读。Td = train_data。是啊,我可能搞砸了。

编辑2:回答Mohammad的问题,有他们给我的代码的输出数据形状:

td.shape #AttributeError: 'list' object has no attribute 'shape' - main list
td[0].shape #AttributeError: 'list' object has no attribute 'shape' - sublist, with a list and a label
td[0][0].shape #AttributeError: 'list' object has no attribute 'shape' - subsublist, with 2 images
td[0][1].shape #TensorShape([]) - label
td[0][0][0].shape #TensorShape([1, 105, 105, 3]) - first image
td[0][0][1].shape #TensorShape([1, 105, 105, 3]) - second image

可以表示为:

train_data = [  [[x1, x2], y],  [[x1, x2], y], ... ]

复制问题:

x1 = tf.random.normal((105,105,3))
x2 = tf.random.normal((105,105,3))
y = tf.random.normal((1,))
array_list = [[x1, x2, y]] * 560
tf.data.Dataset.from_tensor_slices(array_list)
#InvalidArgumentError ... values[0].shape = [105,105,3] != values[2].shape = [1]

修复:

#flatten to a single list
flatten_list = sum(array_list, [])
#Separate features and labels 
X = tf.squeeze(tf.stack(flatten_list[::3]))
y = tf.squeeze(tf.stack(flatten_list[2::3]))
#construct dataset iterator
ds = tf.data.Dataset.from_tensor_slices((X, y))
for data in ds.take(1):
print(data)

您的数据现在是这个形状…

x1 = tf.random.normal((105, 105, 3))
x2 = tf.random.normal((105, 105, 3))
y = tf.random.normal((1,))
train_list = [[[x1,x2] , y] , [[x1,x2] , y] , [[x1,x2] , y] , [[x1,x2] , y]]
x1 = [train_list[x][:1][0][0] for x in range(len(train_list))]
x2 = [train_list[x][:1][0][1] for x in range(len(train_list))]
y = [train_list[x][1:] for x in range(len(train_list))]
tf.data.Dataset.from_tensor_slices(((x1 , x2) , y))
<TensorSliceDataset element_spec=((TensorSpec(shape=(105, 105, 3), dtype=tf.float32, name=None), TensorSpec(shape=(105, 105, 3), dtype=tf.float32, name=None)), TensorSpec(shape=(1, 1), dtype=tf.float32, name=None))>

Or Change the Code when you are Loading Images and Labels from Disks这将节省时间

x1 = []
x2 = []
y = []
for i in os.listdir("t"):
for ii in os.listdir(os.path.join("t", i)):
x1.append(
tensorflow.expand_dims(
tensorflow.io.decode_jpeg(
tensorflow.io.read_file(os.path.join("t", i, ii) + "\" + os.listdir(os.path.join("t", i, ii))[0])) / 255, 0))
x2.append(tensorflow.expand_dims(
tensorflow.io.decode_jpeg(
tensorflow.io.read_file(os.path.join("t", i, ii) + "\2.jpeg")) / 255, 0)
)
y.append(tensorflow.convert_to_tensor(
float(
os.listdir(os.path.join("t", i, ii))[0][0]
)
))
tf.data.Dataset.from_tensor_slices(((x1 , x2) , y))

相关内容

  • 没有找到相关文章