«Ввод 0 слоя sequential_1 несовместим со слоем» с помощью tf.data.Набор данных

#python #tensorflow #machine-learning #keras #deep-learning

#python #тензорный поток #машинное обучение #keras #глубокое обучение

Вопрос:

Я получаю

Ошибка значения: ввод 0 слоя sequential_1 несовместим со слоем: : ожидаемый min_ndim=4, найденный ndim= 3. Получена полная форма: [300, 300, 3]. Сводка модели показывает 4 ввода, но в ней указано 3.

 import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import tensorflow_datasets as tfds
import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)
from tensorflow.keras.preprocessing.image import ImageDataGenerator

(train_dataset, test_dataset), metadata = tfds.load('rock_paper_scissors',split=['train', 'test'], as_supervised=True, with_info=True)

class_names = ['rock','paper','scissors']

num_train_examples = metadata.splits['train'].num_examples
num_test_examples = metadata.splits['test'].num_examples
print("Number of training examples: {}".format(num_train_examples))
print("Number of test examples:     {}".format(num_test_examples))

get_label_name = metadata.features['label'].int2str
print(get_label_name(0))
print(get_label_name(1))
print(get_label_name(2))

def format_example(image, label):
    # Make image color values to be float.
    image = tf.cast(image, tf.float32)
    # Make image color values to be in [0..1] range.
    image = image / 255.
    return image, label

dataset_train = train_dataset.map(format_example)
dataset_test =test_dataset.map(format_example)

l1 = tf.keras.layers.Conv2D(32, (3,3), activation = 'relu', input_shape=(300,300,3))
l2 = tf.keras.layers.MaxPooling2D(2,2)

l3 = tf.keras.layers.Conv2D(64, (3,3), activation='relu')
l4 = tf.keras.layers.MaxPooling2D(2,2)

l5 = tf.keras.layers.Conv2D(128, (3,3), activation='relu')
l6 = tf.keras.layers.MaxPooling2D(2,2)

l7 = tf.keras.layers.Flatten()
l8 = tf.keras.layers.Dense(512, activation='relu')
l9 = tf.keras.layers.Dense(3, activation='softmax')

model = tf.keras.Sequential([l1,l2,l3,l4,l5,l6,l7,l8,l9])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy,
              metrics=['accuracy'])

model.summary()

epochs = 10
batch_size = 32

history = model.fit(
    dataset_train,
    validation_data = dataset_test,
    steps_per_epoch = int(np.ceil(num_train_examples/float(batch_size))),
    validation_steps = int(np.ceil(num_test_examples/float(batch_size))),
    epochs = epochs
)
  

Где я ошибаюсь?
Я не сталкивался с этой ошибкой с набором данных cats и dogs.

Комментарии:

1. Ваша модель принимает тензор 4D, тогда как вы предоставляете ему тензор 3D. Вы можете просто расширить его с помощью np.expand_dims(a, axis=1) .

Ответ №1:

Вам необходимо выполнить пакетную обработку вашего набора данных, чтобы получить правильную форму:

 dataset_train = train_dataset.map(format_example).batch(1)
dataset_test =test_dataset.map(format_example).batch(1)
  

Когда вы не выполняете пакетную обработку, (h, w, c) будет возвращено изображение с формой. Если вы выполните пакетную обработку, вы получите (n, h, w, c) то, что ожидает Keras. Проведите тест самостоятельно:

 import tensorflow as tf

images = tf.random.uniform(shape=(10, 224, 224, 3), maxval=256, dtype=tf.int32)

ds = tf.data.Dataset.from_tensor_slices(images)

for pic in ds:
    print(pic.shape)
    break
  
 (224, 224, 3)
  

С пакетной обработкой:

 for pic in ds.batch(4):
    print(pic.shape)
    break
  
 (4, 224, 224, 3)
  

Комментарии:

1. Спасибо, чувак, я был бы очень признателен, если бы ты мог дать небольшое объяснение того, как работает batch (1)?

2. Я добавил некоторые детали. Дайте мне знать, если вам нужны какие-либо другие подробности, я с удовольствием добавлю их в ответ.