Точность и потери при обучении в тензорном потоке отличаются от оценки одного и того же набора данных - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь тренировать модель Tensorflow с двумя классами. Мои данные тренинга сбалансированы (~ 11 тыс. Изображений для обоих классов). Я использую Tranferlearning и пытаюсь продолжить на модели InceptionV3 со следующим кодом:

BUFFER_SIZE = 1000
BATCH_SIZE = 32

def get_label(file_path, class_names):
  # convert the path to a list of path components
  parts = tf.strings.split(file_path, os.path.sep)
  # The second to last is the class-directory
  return parts[-2] == class_names

def parse_image(filename):
    parts = tf.strings.split(filename, "\\")
    label = get_label(filename, CLASS_NAMES)

    image = tf.io.read_file(filename)
    image = tf.image.decode_png(image, channels=3)
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.image.resize(image, [299,299])/255.0
    return image, label

datasetFilePath = "Path\To\BalancedData"
IMAGESIZE = 299
AUTOTUNE = tf.data.experimental.AUTOTUNE
datasetPath = pathlib.Path(datasetFilePath)
list_ds = tf.data.Dataset.list_files(str(datasetPath/"*/*"))

CLASS_NAMES = np.array([item.name for item in datasetPath.glob('*')])

# labeled_ds = list_ds.map(process_path)

images_ds = list_ds.map(parse_image, num_parallel_calls=AUTOTUNE)
images_ds = images_ds.shuffle(BATCH_SIZE)

dataset = images_ds.batch(BATCH_SIZE, drop_remainder=True)

for image_batch, label_batch in dataset.take(1):
    pass

def build_and_compile_model():
    base_model =tf.keras.applications.InceptionV3(include_top=False, weights = "imagenet", input_shape=(IMAGESIZE,IMAGESIZE,3))
    feature_batch = base_model(image_batch)
    print(feature_batch.shape)

    base_model.trainable = False
    x = base_model.output
    x = tf.keras.layers.GlobalAveragePooling2D(name="avg_pool")(x)
    x = tf.keras.layers.Dense(256, activation="relu")(x)
    predictions = tf.keras.layers.Dense(2, activation="softmax")(x)
    model = tf.keras.models.Model(inputs=base_model.input, outputs=predictions)

    base_learning_rate = 0.00001
    model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate),
                 loss="categorical_crossentropy",
                 metrics=["accuracy"])
    return model


multi_worker_model = build_and_compile_model()
tensorboard = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
history = multi_worker_model.fit(dataset, epochs=2, callbacks=[tensorboard])

=>Epoch 1/2
=>711/711 [==============================] - 176s 247ms/step - loss: 0.3309 - accuracy: 0.8945
=>Epoch 2/2
=>711/711 [==============================] - 166s 233ms/step - loss: 0.1410 - accuracy: 0.9632

predictions = multi_worker_model.evaluate(dataset)
=>711/711 [==============================] - 150s 212ms/step - loss: 0.7538 - accuracy: 0.4999

Так что в целом моя модель просто предсказывает, что все относится к классу 1, и я не понимаю, почему это так, и в основном почему он утверждает, что имеет точность обучения 96%

. Это может быть проблемой данных, но опять же, я бы ожидал, что точность обучения также составляет ~ 50%, так как и обучение, и оценка происходят в одном наборе данных .

Любая помощь будет принята с благодарностью, и если вам нужна дополнительная информация, дайте мне знать!

1 Ответ

0 голосов
/ 08 января 2020

Хорошо, после нескольких часов поисков у меня может возникнуть проблема. InceptionV3 использует

def preprocess_input(x):
    x /= 255.
    x -= 0.5
    x *= 2.
    return x

в качестве функции предварительной обработки. И я делаю только часть х / = 255, которой недостаточно. Разница в точности может заключаться в том, что в функции .fit автоматически выполняется предварительная обработка, а с другой стороны, .evaluate не может этого сделать.

Я не уверен на 100%, что это правильный ответ, но это мое лучшее предположение. И это также работает с установкой base_model.trainable = False на base_model.trainable = True. Я думаю, что это позволяет модели обучаться с моей собственной предварительной обработкой, и поэтому оценка также работает, потому что она получает мою предварительную обработку.

Я надеюсь, что это может помочь кому-то с подобной проблемой. Но я все еще рад любой информации от людей, которые могут дать лучшее представление о топи c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...