#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. Я отредактирую ответ с помощью кода изменения размера.