выходные данные прогнозирования тензорного потока меняются каждый раз, когда я тренируюсь

#python #tensorflow #deep-learning #neural-network

#python #тензорный поток #глубокое обучение #нейронная сеть

Вопрос:

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

     #Imports
import os
from PIL import Image
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from tensorflow.keras import layers
from tensorflow.keras.utils import to_categorical
import numpy as np
import matplotlib.pyplot as plt
import csv
import pathlib
from IPython.display import display
import random
plt.style.use('fivethirtyeight')


batchsize = 64
imagewidth = 32
imageheight = 32

def define_model():
    model = Sequential()
    model.add(layers.experimental.preprocessing.Rescaling(1./255, input_shape=(imageheight, imageheight, 3)))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2, 2)))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    # compile model
    model.compile(optimizer='adam', loss = 'binary_crossentropy', metrics=['accuracy'])
    return model


dataseturl = 'E:AI\'

data_dir = pathlib.Path("")
print(data_dir)
print("0101")



train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(imageheight, imagewidth),
  batch_size=batchsize)
#random.shuffle(train_ds)

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(imageheight, imagewidth),
  batch_size=batchsize)
class_names = train_ds.class_names
model = define_model()
#model.load_weights("trained.ckpt")
#model.compile(loss = 'binary_crossentropy', optimizer= 'adam', metrics = ['accuracy'])
epochs=10
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs,
  batch_size = 32
)
img = keras.preprocessing.image.load_img(
    "Test3.jpg", target_size=(imageheight, imagewidth)
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = img_array / 255.0
print(img_array.shape)
img_array = tf.expand_dims(img_array, 0) # Create a batch

predictions = model.predict(img_array)
score = predictions[0]
print(class_names)
print(score)
print(
    "This image most likely belongs to {} with a {:.2f} percent confidence."
    .format(class_names[np.argmax(predictions[0])], 100 * np.max(predictions[0]))
)
model.save_weights("trained.ckpt")
 

Этот код либо привязывается к одному выходу, например, к прогнозу cat для всех изображений, либо неверно предсказывает изображение, например, прогнозируется, что кошка — это собака, и наоборот

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

1. Сколько примеров в обучающем наборе? Если обучающий набор слишком мал, это вполне может быть переоснащение старой доброй модели. Ваша модель, вероятно, «запомнила» каждую картинку в обучающем наборе и понятия не имеет, как на самом деле выглядит собака или кошка.

Ответ №1:

Я пока не могу публиковать комментарии, поэтому пишу ответ.

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

Сколько изображений имеет ваш обучающий набор? Вы проверяли, соответствуют ли значения переменных class_names вашим изображениям? Я имею в виду, попробуйте отобразить несколько изображений вашего набора данных с вашими метками, чтобы убедиться, что вы правильно устанавливаете метки для своих изображений.

Следите за своими показателями точности обучения и проверки. Если ваш результат проверки меньше, а точность вашего обучения огромна, есть вероятность, что ваша модель перегружена. Используйте методы регуляризации, чтобы избежать переобучения. (Например, добавьте выпадающий слой или используйте kernel_regularizer).

Посмотрите на этот пост и посмотрите, сможете ли вы получить результаты

https://machinelearningmastery.com/how-to-develop-a-convolutional-neural-network-to-classify-photos-of-dogs-and-cats/

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

1. Хорошо, но как я могу добавить больше сверточных слоев. Я видел этот код в учебнике, поэтому он мне понравился, но он не сработал по причинам, которые вы назвали. Извините за задержку