{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nfrom tensorflow.keras import utils\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten\nfrom tensorflow.keras.layers import Dropout, BatchNormalization, SpatialDropout2D, GaussianDropout\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, AveragePooling2D\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\nfrom tensorflow.keras.datasets import cifar10\nimport matplotlib.pyplot as plt\n%matplotlib inline \n(X_train, y_train), (X_test, y_test) = cifar10.load_data()\nclasses=['самолет', 'автомобиль', 'птица', 'кот', 'олень', 'собака', 'лягушка', 'лошадь', 'корабль', 'грузовик']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Размер мини-выборки\n\"\"\"может повлиять на изменение качества обучения и скорость обучения\"\"\"\nbatch_size = 169\n# Количество классов изображений\nnb_classes = 10\n# Количество эпох для обучения\n\"\"\"можно не менять, если будете использовать callbacks\"\"\"\nnb_epoch = 40\n# Размер изображений\n\"\"\"настроить под ваши изображения\"\"\"\nimg_rows, img_cols = 32, 32\n# Количество каналов в изображении: RGB\nimg_channels = 3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n = 101\nplt.imshow(X_train[n])\nplt.show()\nprint(\"Номер класса:\", y_train[n])\nprint(\"Тип объекта:\", classes[y_train[n][0]])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_train = utils.to_categorical(y_train, nb_classes)\nY_test = utils.to_categorical(y_test, nb_classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\n# Создаем последовательную модель\nmodel = Sequential()\n# Первый сверточный слой\n# padding='same' - не будет меняться размер картинки. padding='valid'\nmodel.add(Conv2D(filters=32, kernel_size=(3, 3), padding='valid',\n                        input_shape=(img_rows, img_cols, img_channels), activation='elu'))\n# Второй сверточный слой\nmodel.add(Conv2D(32, (3, 3), activation='elu', padding='same'))\n# # Первый слой подвыборки\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# # Первый слой нормализации данных\nmodel.add(BatchNormalization())\n# # Первый Слой регуляризации Dropout\nmodel.add(Dropout(0.2))\n\n# Третий сверточный слой\nmodel.add(Conv2D(64, (3, 3), padding='same', activation='elu'))\n# Четвертый сверточный слой\nmodel.add(Conv2D(64, (3, 3), padding='same', activation='elu'))\n# Второй слой подвыборки\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# # Второй слой нормализации данных\nmodel.add(BatchNormalization())\n#  # Второй Слой регуляризации Dropout\nmodel.add(Dropout(0.3))\n\n# # Пятый сверточный слой\nmodel.add(Conv2D(128, (3, 3), padding='same', activation='elu'))\n# # Шестой сверточный слой\nmodel.add(Conv2D(128, (3, 3), padding='same', activation='elu'))\n# # Третий слой подвыборки\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# # Третий слой нормализации данных\nmodel.add(BatchNormalization())\n# # Третий Слой регуляризации Dropout\nmodel.add(Dropout(0.4))\n\n\n# Слой преобразования данных из 2D представления в плоское\nmodel.add(Flatten())\n# Полносвязный слой для классификации\nmodel.add(Dense(512, activation='relu'))\n# # Четвертый слой нормализации данных\n# model.add(BatchNormalization()) \n# # Четвертый Слой регуляризации Dropout\nmodel.add(Dropout(0.75))\n# Выходной полносвязный слой\nmodel.add(Dense(nb_classes, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ncallbacks_list = [EarlyStopping(monitor='val_loss', patience=4),\n                  ModelCheckpoint(filepath='my_model.h5',\n                                  monitor='val_accuracy',\n                                  save_best_only=True),\n                  ReduceLROnPlateau(monitor='val_loss', factor=0.3, patience=2)\n                  ] \n# экспериментируйте с optimizer\nmodel.compile(loss='categorical_crossentropy',\n              optimizer='adam',\n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nhistory = model.fit(X_train, Y_train,\n              batch_size=batch_size,\n              epochs=nb_epoch,\n              callbacks=callbacks_list,\n              validation_split=0.1,\n              verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Оцениваем качество обучения модели на тестовых данных\nscores = model.evaluate(X_test, Y_test, verbose=1)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Доля верных ответов на тестовых данных, в процентах:\", round(scores[1] * 100, 4))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['accuracy'], \n         label='Доля правильных ответов на обучающем наборе')\nplt.plot(history.history['val_accuracy'], \n         label='Доля правильных ответов на проверочном наборе')\nplt.xlabel('Эпоха обучения')\nplt.ylabel('Доля правильных ответов')\nplt.legend()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['loss'], \n         label='Оценка потерь на обучающем наборе')\nplt.plot(history.history['val_loss'], \n         label='Оценка потерь на проверочном наборе')\nplt.xlabel('Эпоха обучения')\nplt.ylabel('Оценка потерь')\nplt.legend()\nplt.show()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}