如何将 mnist 数据转换为 RGB 格式?
How can i convert mnist data to RGB format?
我正在尝试将 MNIST 数据集转换为 RGB 格式,每张图像的实际形状是 (28, 28),但我需要 (28, 28, 3)。
import numpy as np
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, _), (x_test, _) = mnist.load_data()
X = np.concatenate([x_train, x_test])
X = X / 127.5 - 1
X.reshape((70000, 28, 28, 1))
tf.image.grayscale_to_rgb(
X,
name=None
)
但是我收到以下错误:
ValueError: Dimension 1 in both shapes must be equal, but are 84 and 3. Shapes are [28,84] and [28,3].
如果您在 tf.image.grayscale_to_rgb 之前打印 X 的形状,您将看到输出尺寸为 (70000, 28, 28)。 tf.image.grayscale 的输入必须具有大小 1 作为最终维度。
扩展 X 的最终维度以使其与函数兼容
tf.image.grayscale_to_rgb(tf.expand_dims(X, axis=3))
您应该将整形后的 3D [28x28x1] 图像存储在一个数组中:
X = X.reshape((70000, 28, 28, 1))
转换时,将另一个数组设置为tf.image.grayscale_to_rgb()
函数的return值:
X3 = tf.image.grayscale_to_rgb(
X,
name=None
)
最后,用 matplotlib
和 tf.session()
从生成的张量图像中绘制出一个示例:
import matplotlib.pyplot as plt
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
image_to_plot = sess.run(image)
plt.figure()
plt.imshow(image_to_plot)
plt.grid(False)
完整代码:
import numpy as np
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, _), (x_test, _) = mnist.load_data()
X = np.concatenate([x_train, x_test])
X = X / 127.5 - 1
# Set reshaped array to X
X = X.reshape((70000, 28, 28, 1))
# Convert images and store them in X3
X3 = tf.image.grayscale_to_rgb(
X,
name=None
)
# Get one image from the 3D image array to var. image
image = X3[0,:,:,:]
# Plot it out with matplotlib.pyplot
import matplotlib.pyplot as plt
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
image_to_plot = sess.run(image)
plt.figure()
plt.imshow(image_to_plot)
plt.grid(False)
除了@DMolony 和@Aqwis01 的答案之外,另一个简单的解决方案可能是使用 numpy.repeat
方法多次复制张量的最后一个维度:
X = X.reshape((70000, 28, 28, 1))
X = X.repeat(3, -1) # repeat the last (-1) dimension three times
X_t = tf.convert_to_tensor(X)
assert X_t.shape == (70000, 28, 28, 3)
我正在尝试将 MNIST 数据集转换为 RGB 格式,每张图像的实际形状是 (28, 28),但我需要 (28, 28, 3)。
import numpy as np
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, _), (x_test, _) = mnist.load_data()
X = np.concatenate([x_train, x_test])
X = X / 127.5 - 1
X.reshape((70000, 28, 28, 1))
tf.image.grayscale_to_rgb(
X,
name=None
)
但是我收到以下错误:
ValueError: Dimension 1 in both shapes must be equal, but are 84 and 3. Shapes are [28,84] and [28,3].
如果您在 tf.image.grayscale_to_rgb 之前打印 X 的形状,您将看到输出尺寸为 (70000, 28, 28)。 tf.image.grayscale 的输入必须具有大小 1 作为最终维度。
扩展 X 的最终维度以使其与函数兼容
tf.image.grayscale_to_rgb(tf.expand_dims(X, axis=3))
您应该将整形后的 3D [28x28x1] 图像存储在一个数组中:
X = X.reshape((70000, 28, 28, 1))
转换时,将另一个数组设置为tf.image.grayscale_to_rgb()
函数的return值:
X3 = tf.image.grayscale_to_rgb(
X,
name=None
)
最后,用 matplotlib
和 tf.session()
从生成的张量图像中绘制出一个示例:
import matplotlib.pyplot as plt
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
image_to_plot = sess.run(image)
plt.figure()
plt.imshow(image_to_plot)
plt.grid(False)
完整代码:
import numpy as np
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, _), (x_test, _) = mnist.load_data()
X = np.concatenate([x_train, x_test])
X = X / 127.5 - 1
# Set reshaped array to X
X = X.reshape((70000, 28, 28, 1))
# Convert images and store them in X3
X3 = tf.image.grayscale_to_rgb(
X,
name=None
)
# Get one image from the 3D image array to var. image
image = X3[0,:,:,:]
# Plot it out with matplotlib.pyplot
import matplotlib.pyplot as plt
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
image_to_plot = sess.run(image)
plt.figure()
plt.imshow(image_to_plot)
plt.grid(False)
除了@DMolony 和@Aqwis01 的答案之外,另一个简单的解决方案可能是使用 numpy.repeat
方法多次复制张量的最后一个维度:
X = X.reshape((70000, 28, 28, 1))
X = X.repeat(3, -1) # repeat the last (-1) dimension three times
X_t = tf.convert_to_tensor(X)
assert X_t.shape == (70000, 28, 28, 3)