Numpy 数组丢失转换为 tf 数据集的维度

我正在尝试tf.data.Dataset使用以下代码将 numpy 数组转换为 a:


train_dataset = tf.data.Dataset.from_tensor_slices((traininput, train[:, :, :, 1:4]))

但是,我的数据集现在缺少它的第一个维度。numpy 数组都具有 1000、128、128、3 的形状,并且数据集缩减为 128、128、3 的形状。这会在尝试训练我的模型时导致错误:检查输入时出错:expected input_2 to have 4 dimensions, but got array with shape (128, 128, 3) 我已尝试根据加载 numpy 数据的 tensorflow 教程工作。为什么会发生这种情况,我该如何解决?


正如建议的那样,我在下面提供了一个 mcve:


import tensorflow as tf

import numpy as np

inp = np.random.rand(100, 128, 128, 3)

out = np.random.rand(100, 126, 126, 3)

model = tf.keras.Sequential(

    [

        tf.keras.layers.InputLayer(input_shape=(128, 128, 3)),

        tf.keras.layers.Conv2D(

              filters=32, kernel_size=3, strides=(2, 2), activation='relu'),

        tf.keras.layers.Conv2DTranspose(

                      filters=3,

                      kernel_size=3,

                      strides=(2, 2),

                      padding="SAME",

                      activation='relu'),

    ]

)

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

train_dataset = tf.data.Dataset.from_tensor_slices((inp, out))

model_history = model.fit(train_dataset, epochs=10)

它以:Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (128, 128, 3)


阿晨1998
浏览 117回答 2
2回答

噜噜哒

您需要batch在数据集上设置大小,以便它返回多个示例,而不仅仅是一个。这也会将维度数更改为 4。import tensorflow as tfimport numpy as npinp = np.random.rand(100, 128, 128, 3)# *** Had to set the last dim below to 1 to avoid another error with the accuracyout = np.random.rand(100, 126, 126, 1)model = tf.keras.Sequential(    [        tf.keras.layers.InputLayer(input_shape=(128, 128, 3)),        tf.keras.layers.Conv2D(              filters=32, kernel_size=3, strides=(2, 2), activation='relu'),        tf.keras.layers.Conv2DTranspose(                      filters=3,                      kernel_size=3,                      strides=(2, 2),                      padding="SAME",                      activation='relu'),    ])model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])train_dataset = tf.data.Dataset.from_tensor_slices((inp, out))# *** Setting batch size of 10 belowtrain_dataset = train_dataset.batch(10)model_history = model.fit(train_dataset, epochs=10)注意:我必须更改out张量的最后一个维度以避免出现不同的错误:ValueError: Can not squeeze dim[3], expected a dimension of 1, got 3 for 'metrics/accuracy/Squeeze' (op: 'Squeeze') with input shapes: [?,126,126,3]

ibeautiful

我假设您有 100 张尺寸为 128x128 的图像,它们是 3 通道(RGB)。而且您的网络无法一次获取所有图像。它应该一步获得一张图像。所以你有2个选择:使用 for 循环遍历数据集,从数据集中获取一张图像输入和一张输出图像使用批处理。告诉您网络您将使用批次:tf.keras.layers.InputLayer(input_shape=(None, 128, 128, 3))-输入占位符中的 Tensorflow 批次大小
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python