2

我将使用 tf.keras 和 MNIST 手写数字数据集制作一些 GAN 模型测试器。因为我的模型将用于 128x128 的图像,所以我将 MNIST 数据集的大小调整为 128x128x1。但是,该程序会出现一些我从未见过的错误。

(x_train, _), (_, _) = mnist.load_data()
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
x_train = tf.image.resize_images(x_train, [128, 128])

idx = np.random.randint(0, x_train.shape[0], batch_size)  # picks some data, count is batch_size=32.
imgs = x_train[idx]  # This line made errors

最后一行犯了两个错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError:形状必须为 1 级,但对于“strided_slice_1”(操作:“StridedSlice”)为 2 级,输入形状为:[60000,128,128,1]、[1,32]、[1 ,32],[1]。

和,

ValueError:形状必须为 1 级,但对于输入形状为 [60000,128,128,1]、[1,32]、[1,32]、[1] 的“strided_slice_1”(操作:“StridedSlice”)为 2 级。

我认为数字'32'表示batch_size(= 32)。

我试图找到这个错误,但我找不到这个错误。

我没有任何想法来解决这个问题(因为我一周前开始使用 keras,在我使用 pytorch 之前)。

4

1 回答 1

3

上面的代码有更多问题,但导致错误的主要原因是 tensorflow 不支持 numpy 类型的高级切片。实际上,错误消息是因为 tensorflow 尝试在他的跨步切片中对齐您的输入数组:

跨步切片的示例:

7x8x9 张量上的 foo[5:,:,:3] 等价于 foo[5:7,0:8,0:3]。foo[::-1] 反转形状为 8 的张量。

不幸的是,目前 Tensorflow 中只有基本的类型索引可用。高级类型索引正在开发中。

第二个问题,您的调整大小不合适。Tensorflow 假设是 3D 或 4D 输入。您尝试将 2D 图像传递给 `tf.image.resize_images(),它不会返回所需的新图像尺寸。所以我们必须像这样重塑原始图像:

x_train = x_train.reshape((-1, x_train.shape[1], x_train.shape[1], 1))

只有这样我们才能将它们传递给:

`x_train = tf.image.resize_images(x_train, [128, 128])

然后它将返回正确的尺寸:

print(x_train.shape)

出去:

(60000, 128, 128, 1)

所以总结一下整个解决方案,目前你可以这样做:

import numpy as np
import tensorflow as tf

batch_size = 32

mnist = tf.keras.datasets.mnist

(x_train, _), (_, _) = mnist.load_data()

x_train = x_train.reshape((-1, x_train.shape[1], x_train.shape[1], 1))
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
x_train = tf.image.resize_images(x_train, [128, 128])

idx = np.random.randint(0, x_train.shape[0], batch_size)

imgs = [x_train[i,:,:,:] for i in idx]

这是一个非常混乱的“解决方案”。

其他,实际上是一个真正的解决方案,通过重新排列原始代码,我们可以实现我们的目标,作为 tensorflow 索引问题的解决方法:

import numpy as np
import tensorflow as tf

batch_size = 32

mnist = tf.keras.datasets.mnist

(x_train, _), (_, _) = mnist.load_data()

x_train = (x_train.astype(np.float32) - 127.5) / 127.5
idx = np.random.randint(0, x_train.shape[0], batch_size)
x_train = x_train[idx]

x_train = x_train.reshape((-1, x_train.shape[1], x_train.shape[1], 1))
x_train = tf.image.resize_images(x_train, [128, 128])

print(x_train.shape)

出去:

(32, 128, 128, 1)

而已!

或者,代替 tf.image.resize_images() 您可以使用其他图像工具,例如scikit-image中的skimage.transform.resize(),它返回 numpy 数组类型数据。

于 2018-11-13T00:11:27.410 回答