Advertisement
Stan_

cats_and_dogs_recognition

Dec 18th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.54 KB | None | 0 0
  1. # cats and dogs recognition
  2. # https://www.asozykin.ru/courses/nnpython-lab4
  3. from keras.preprocessing import image
  4. from keras.models import Model, model_from_json
  5. from keras.layers import Dense, GlobalAveragePooling2D
  6. from keras import applications
  7. from keras.preprocessing.image import ImageDataGenerator
  8. import numpy
  9. from keras.applications.vgg16 import preprocess_input
  10.  
  11. # Размер изображений
  12. img_width, img_height = 224, 224
  13. # Путь к каталогу с изображениями для обучения
  14. train_data_dir = 'data/train'
  15. # Количество эпох
  16. epochs = 8
  17. # Размер выборки
  18. batch_size = 1
  19.  
  20. # Загружаем сеть VGG16 без части, которая отвечает за классификацию
  21. base_model = applications.VGG16(weights='imagenet', include_top=False)
  22.  
  23. # Добавляем слои классификации
  24. x = base_model.output
  25. x = GlobalAveragePooling2D()(x)
  26. x = Dense(1024, activation='relu')(x)
  27. # Выходной слой с двумя нейронами для классов "кот" и "собака"
  28. predictions = Dense(2, activation='softmax')(x)
  29.  
  30. # Составляем сеть из двух частей
  31. model = Model(inputs=base_model.input, outputs=predictions)
  32.  
  33. # "Замораживаем" сверточные уровни сети VGG16
  34. # Обучаем только вновь добавленные слои
  35. for layer in base_model.layers:
  36.     layer.trainable = False
  37.  
  38. # Компилируем модель
  39. model.compile(optimizer='rmsprop', loss='categorical_crossentropy',
  40.               metrics=['accuracy'])
  41.  
  42. # Создаем генератор данных для обучения
  43. datagen = ImageDataGenerator(rescale=1. / 255, validation_split = 0.1)
  44. train_generator = datagen.flow_from_directory(
  45.     train_data_dir,
  46.     target_size=(img_width, img_height),
  47.     batch_size=batch_size,
  48.     class_mode= 'categorical',
  49.     subset='training')
  50.  
  51. # Создаем генератор данных для валидации
  52. validation_generator = datagen.flow_from_directory(
  53.     train_data_dir,
  54.     target_size=(img_width, img_height),
  55.     batch_size=batch_size,
  56.     class_mode= 'categorical',
  57.     subset='validation')
  58.  
  59. ## Количество изображений для обучения
  60. nb_train_samples = train_generator.samples
  61. ## Количество изображений для валидации
  62. nb_validation_samples = validation_generator.samples
  63.  
  64. # Обучаем модель с помощью генератора
  65. model.fit_generator(
  66.     train_generator,
  67.     steps_per_epoch=nb_train_samples,
  68.     epochs=epochs,
  69.     validation_data=validation_generator,
  70.     validation_steps=nb_validation_samples)
  71.  
  72. #%%
  73. # Сохраняем нейронную сеть
  74. print("Сохранить обученную нейросеть?")
  75. symbol_2 = "a"
  76. while symbol_2 != "y" and symbol_2 != "n":
  77.     symbol_2 = input("Нажмите y, если хотите сохранить результаты обучения нейросети, либо n в противном случае\n")
  78. if symbol_2 == "y":
  79.     model_json = model.to_json()
  80.     neuronet_filenames = input("Введите название для двух файлов, куда сохранится информация по нейросети\n>>")
  81.     json_file = open("%s.json" % neuronet_filenames, "w")
  82.     json_file.write(model_json)
  83.     json_file.close()
  84.     model.save_weights("%s.h5" % neuronet_filenames)
  85.  
  86. #%%
  87. # Список классов
  88. classes = ['cats', 'dogs']
  89. neuronet_name = input("Enter filename for both .json and .h5 files\n>>")
  90. json_file = open("%s.json" % neuronet_name, "r")
  91. loaded_model_json = json_file.read()
  92. json_file.close()
  93. loaded_model = model_from_json(loaded_model_json)
  94. loaded_model.load_weights("%s.h5" % neuronet_name)
  95. #                    Компилируем модель
  96. loaded_model.compile(optimizer='rmsprop', loss='categorical_crossentropy',
  97.                      metrics=['accuracy'])
  98. #%%
  99. #                     Загружаем изображение для распознавания
  100. img_name = input("Enter test image filename\n>>")
  101. img = image.load_img("data/test/%s" % img_name, target_size=(224, 224))
  102.  
  103. x = image.img_to_array(img)
  104. x = numpy.expand_dims(x, axis=0)
  105. x = preprocess_input(x)
  106. #                      Запускаем распознавание
  107.  
  108. prediction = loaded_model.predict(x)
  109.  
  110. print(["%d%%" % i for i in numpy.round(prediction * 100)[0]])
  111. print(classes[numpy.argmax(prediction)])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement