Как я могу конвертировать данные mnist в формат RGB? - PullRequest
2 голосов
/ 09 ноября 2019

Я пытаюсь преобразовать набор данных 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].

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Вы должны сохранить измененные 3D [28x28x1] изображения в массиве:

X = X.reshape((70000, 28, 28, 1))

При преобразовании установите другой массив в значение, возвращаемое функцией tf.image.grayscale_to_rgb():

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)
0 голосов
/ 09 ноября 2019

В дополнение к ответам @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)
0 голосов
/ 09 ноября 2019

Если вы напечатаете форму X до tf.image.grayscale_to_rgb, вы увидите выходной размер (70000, 28, 28). В качестве конечного размера входные данные для tf.image.grayscale должны иметь размер 1.

Разверните окончательный размер X, чтобы сделать его совместимым с функцией

tf.image.grayscale_to_rgb(tf.expand_dims(X, axis=3))
...