错误:在tensorflow 2中训练inception v3



我是tensorflow(2.3.0版本(的新手。我想用inception v3构建一个基于"oxford_lower102"的图像分类器。我已经准备好了数据集,现在想训练initiation v3网络,但我遇到了一个我不理解的错误。错误代码为:

ValueError:层conv2d的输入0与层不兼容:预期min_ndim=4,实际ndim=3。收到的完整形状:[500667,3]

数据集的预处理似乎很好,当我想用命令将数据馈送到initiation 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)

输入的形状为[none,width,height,channels],不适用于显然是你的[500667,3]。

在"0"的块中;开始训练";,您正在尝试对每个图像和标签使用trainstep。注意:

for images, labels in training_set:
pass

事实上,除了图像之外,您还可以获得图片

for image, label in training_set:
pass

你最好使用多个图像和标签进行训练,如果你真的想每个历元使用一个图像,只需重塑图像和标签。

例如,如果要为一个历元使用一个图像,请使用[500667,3]到[1500667,3]。

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

最新更新