I trained the neuron, loaded it, gave the file to predict and in return I always get [[1.]], as I understand it, it is connected with one neuron on the last layer, but I don’t understand how she learned in that case or how to fix . Neuron is a banal teaching example for the definition of a dog and a cat.
learning and preservation:
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator from tensorflow.python.keras.models import Sequential from tensorflow.python.keras.layers import Conv2D, MaxPooling2D from tensorflow.python.keras.layers import Activation, Dropout, Flatten, Dense # Каталог с данными для обучения train_dir = 'C:\Projects\python\dogorcat\cats_vs_dogs/train' # Каталог с данными для проверки val_dir = 'C:\Projects\python\dogorcat\cats_vs_dogs/val' # Каталог с данными для тестирования test_dir = 'C:\Projects\python\dogorcat\cats_vs_dogs/test' # Размеры изображения img_width, img_height = 150, 150 # Размерность тензора на основе изображения для входных данных в нейронную сеть # backend Tensorflow, channels_last input_shape = (3, img_width, img_height) # Количество эпох epochs = 30 # Размер мини-выборки batch_size = 16 # Количество изображений для обучения nb_train_samples = 17500 # Количество изображений для проверки nb_validation_samples = 3750 # Количество изображений для тестирования nb_test_samples = 3750 model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=input_shape)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) prediction = model.predict(input_shape) print() datagen = ImageDataGenerator(rescale=1. / 255) train_generator = datagen.flow_from_directory( train_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') val_generator = datagen.flow_from_directory( val_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') test_generator = datagen.flow_from_directory( test_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary') model.fit_generator( train_generator, steps_per_epoch=nb_train_samples // batch_size, epochs=epochs, validation_data=val_generator, validation_steps=nb_validation_samples // batch_size) scores = model.evaluate_generator(test_generator, nb_test_samples // batch_size) print("Сохраняем сеть") # Сохраняем сеть для последующего использования # Генерируем описание модели в формате json model_json = model.to_json() json_file = open("cvd_model.json", "w") # Записываем архитектуру сети в файл json_file.write(model_json) json_file.close() # Записываем данные о весах в файл model.save_weights("cvd_model.h5") print("Сохранение сети завершено") loading from file and use:
from keras.models import model_from_json from keras.preprocessing import image import matplotlib.pyplot as plt from keras import utils import numpy as np # Загружаем данные об архитектуре сети из файла json json_file = open("cvd_model.json", "r") loaded_model_json = json_file.read() json_file.close() # Создаем модель на основе загруженных данных loaded_model = model_from_json(loaded_model_json) # Загружаем веса в модель loaded_model.load_weights("cvd_model.h5") loaded_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print() img_path = input('input path to image\n') img = image.load_img(img_path, target_size=(150, 150), grayscale=False) plt.imshow(img, cmap='gray') plt.show() img_arr = image.img_to_array(img) img_arr /= 255 img_arr = np.expand_dims(img_arr, axis=0) prediction = loaded_model.predict(img_arr) prediction = utils.to_categorical(prediction) print(prediction)