Ошибка: начало обучения v3 в tensorflow 2

#python #tensorflow #tensorflow2.0

#python #tensorflow #tensorflow2.0

Вопрос:

Я новичок в tensorflow (версия 2.3.0). Я хочу создать классификатор изображений на основе ‘oxford_flower102’ с помощью inception v3. Я подготовил набор данных и теперь хочу обучить сеть inception v3, но я получаю ошибку, которую я не понимаю. Код ошибки:

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

Предварительная обработка наборов данных, похоже, в порядке, ошибка возникает, когда я хочу передать данные в сеть inception v3 с помощью команды

предсказания = модель (изображения, обучение = Истина)

Здесь вы можете найти весь мой код:

 import warnings
import tensorflow as tf
import tensorflow_datasets as tfds
tfds.disable_progress_bar()
import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)

import os
import tensorflow as tf
warnings.filterwarnings('ignore')
EPOCHS = 50
BATCH_SIZE = 8
NUM_CLASSES = 102
image_height = 299
image_width = 299
channels = 3
save_model_dir = os.getcwd()


def get_model():
    model = tf.keras.applications.InceptionV3(include_top=True,weights=None,classes=NUM_CLASSES)
    model.build(input_shape=(None, image_height, image_width, channels))
    return model

def get_loss_object():
    return tf.keras.losses.SparseCategoricalCrossentropy()


def get_optimizer():
    return tf.keras.optimizers.Adadelta()

def get_train_loss():
    return tf.keras.metrics.Mean(name='train_loss')

def get_train_accuracy():
    return tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

def get_valid_loss():
    return tf.keras.metrics.Mean(name='valid_loss')
def get_valid_accuracy():
    return tf.keras.metrics.SparseCategoricalAccuracy(name='valid_accuracy')

if __name__ == '__main__':
    dataset, dataset_info = tfds.load('oxford_flowers102', with_info=True, as_supervised=True)
    dataset_info

    test_set, training_set, validation_set = dataset['test'], dataset['train'], dataset['validation']

    num_training_examples = 0
    num_validation_examples = 0
    num_test_examples = 0

    for example in training_set:
        num_training_examples  = 1

    for example in validation_set:
        num_validation_examples  = 1

    for example in test_set:
        num_test_examples  = 1



    model =get_model()
    loss_object = get_loss_object()
    optimizer=get_optimizer()
    train_loss= get_train_loss()
    train_accuracy=get_train_accuracy()
    valid_loss=get_valid_loss()
    valid_accuracy=get_valid_accuracy()

    @tf.function
    def train_step(images, labels):
        with tf.GradientTape() as tape:
            predictions = model(images, training=True) #here I get the error

    # start training
    for epoch in range(EPOCHS):
        train_loss.reset_states()
        train_accuracy.reset_states()
        valid_loss.reset_states()
        valid_accuracy.reset_states()
        step = 0
        for images, labels in training_set:
            step  = 1
            train_step(images,labels)
   
 

Ответ №1:

Форма ввода [none, width, height, channels], которые, по-видимому, несовместимы с вашими [500, 667, 3] .

В блоке «начать обучение» вы пытаетесь использовать train_step для каждого изображения и метки. Обратите внимание, что :

 for images, labels in training_set:
    pass
 

действительно, вы получаете изображение, отличное от изображений:

 for image, label in training_set:
    pass
 

Вам лучше использовать несколько изображений и меток для обучения, если вы действительно хотите использовать одно изображение для каждой эпохи, просто измените изображение и метку.

Например, от [500, 667, 3] до [1, 500, 667, 3], если вы хотите использовать одно изображение для эпохи.

Ответ №2:

Модели Keras ожидают пакеты экземпляров в качестве входных данных. Вы загружаете изображения одно за другим. Если вы хотите обучить модель, я рекомендую вам пакетировать набор данных. Вы можете сделать это следующим образом:

 dataset, dataset_info = tfds.load('oxford_flowers102', with_info=True, as_supervised=True)
    dataset_info

def resize_im(im, label):
  return tf.image.resize(im, [224, 224]), label

test_set, training_set, validation_set = dataset['test'], dataset['train'], dataset['validation']

training_set = training_set.map(resize_im)
test_set = test_set.map(resize_im)
validation_set = validation_set.map(resize_im)

training_set = training_set.batch(32)
test_set = test_set.batch(32)
validation_set = validation_set.batch(32)

# Then feed the images to the model

for images, labels in training_set:
  train_step(images, labels)
 

Ссылка: https://www.tensorflow.org/tutorials/load_data/images

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

1. Это потому, что вам нужно изменить размер каждого изображения в наборе данных до одинакового размера. Я рекомендую вам использовать изображения 224×224. Я отредактирую ответ с помощью кода изменения размера.