Numpy массив теряет измерение, преобразованное в набор данных tf - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь преобразовать массивы numpy в tf.data.Dataset, используя следующий код:

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 данных . Почему это происходит и как я могу это исправить?

Как и предполагалось, я предоставляю 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)

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вам необходимо установить размер batch для набора данных, чтобы он возвращал несколько примеров вместо одного. Это также изменит число измерений на 4.

import tensorflow as tf
import numpy as np
inp = np.random.rand(100, 128, 128, 3)
# *** Had to set the last dim below to 1 to avoid another error with the accuracy
out = 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 below
train_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]
0 голосов
/ 12 февраля 2020

Я предполагаю, что у вас есть 100 изображений размером 128х128, которые являются 3-канальными (RGB). И ваша сеть не может получить все ваши изображения одновременно. Он должен получить одно изображение за один шаг. Таким образом, у вас есть 2 варианта:

  1. использовать для l oop для итерации по вашему набору данных, получить одно входное изображение и одно выходное изображение из набора данных
  2. использовать пакет. Сообщите вашей сети, что вы будете использовать пакеты: tf.keras.layers.InputLayer(input_shape=(None, 128, 128, 3)) - Размер пакета Tensorflow во входном плашдере
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...