From 084f01974c15140fa84a76d4b531d9791b84ee1c Mon Sep 17 00:00:00 2001 From: talyanskaya <49466926+talyanskaya@users.noreply.github.com> Date: Tue, 11 Jun 2019 00:14:50 +0300 Subject: [PATCH] Add files via upload --- Talyanskaya/Data collection.ipynb | 40 ++ Talyanskaya/Link to model.txt | 1 + Talyanskaya/Training model.ipynb | 1076 +++++++++++++++++++++++++++++ Talyanskaya/predictImages.py | 67 ++ Talyanskaya/requirements.txt | 78 +++ 5 files changed, 1262 insertions(+) create mode 100644 Talyanskaya/Data collection.ipynb create mode 100644 Talyanskaya/Link to model.txt create mode 100644 Talyanskaya/Training model.ipynb create mode 100644 Talyanskaya/predictImages.py create mode 100644 Talyanskaya/requirements.txt diff --git a/Talyanskaya/Data collection.ipynb b/Talyanskaya/Data collection.ipynb new file mode 100644 index 0000000..3e1be8a --- /dev/null +++ b/Talyanskaya/Data collection.ipynb @@ -0,0 +1,40 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data collection\n", + "As it was allowed to use common dataset for the whole group, the duties were ditributed in accordance with each others capabilities.\n", + "All technical part of data collection was processed by Alexandr Marinsky and Anton Anisimov (they used a little bit different approach and their code is available in their repositories), but the final cleaning of dataset was conducted by the forces of the rest of the group who manually checked and deleted all inappropriate images. Many thanks to all who took part in that.\n", + "\n", + "In general, dataset consisted of almost 50 000 images of two classes of approximately the same size: \n", + "- iphones (all existing models since 3rd)\n", + "- non-iphones (all other phone trademarks ditrubuted in accordance with their popularity)\n", + "\n", + "All the images were downloaded from Avito.ru website as a it's the largest source of user-generated content in Russian segment of Internet." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Talyanskaya/Link to model.txt b/Talyanskaya/Link to model.txt new file mode 100644 index 0000000..8fabc47 --- /dev/null +++ b/Talyanskaya/Link to model.txt @@ -0,0 +1 @@ +https://drive.google.com/file/d/1E0BhElLCY2BEqd2BCqA3RdCqaVP7_KN1/view?usp=sharing \ No newline at end of file diff --git a/Talyanskaya/Training model.ipynb b/Talyanskaya/Training model.ipynb new file mode 100644 index 0000000..594951a --- /dev/null +++ b/Talyanskaya/Training model.ipynb @@ -0,0 +1,1076 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Training model\n", + "\n", + "Note: I have tried several models, starting with handmade 8-layer NN, ending with Resnet18, used by my colleagues, however, all of them failed to perform for different reasons (died VMs, some overtraining, other unknown problems). I do admit using different sources in the web as well as a help of my colleague Alexandr Marinsky and other people, thanks to them.\n", + "\n", + "Finally, I ended with this IncenptionV3-based model with some changes as this model showed not very high but stable results. Originally, this model comes from standard Keras models and was trained on well-known Imagenet datadase. \n", + "The algorithm is rather simple: traing the \"Inception part\" of NN on our dataset, when save the results as Numpy-arrays, train with this Numpy-arrays the upper layer and than complile and tune model with blicked inner layers." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from keras.preprocessing.image import ImageDataGenerator\n", + "from keras.models import Sequential, Model\n", + "from keras.applications.inception_v3 import InceptionV3\n", + "from keras.callbacks import ModelCheckpoint\n", + "from keras.optimizers import SGD\n", + "\n", + "from keras import backend as K\n", + "K.set_image_dim_ordering('th')\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import h5py" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "inc_model=InceptionV3(include_top=False, \n", + " weights='imagenet', \n", + " input_shape=(3, 150, 150))" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [], + "source": [ + "import zipfile\n", + "\n", + "local_zip = '//jet/prs/workspace/Dataset_iphone_new.zip'\n", + "zip_ref = zipfile.ZipFile(local_zip, 'r')\n", + "zip_ref.extractall('/home/talyanskaya_marina/Dataset_iphone_new')\n", + "zip_ref.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 24000 images belonging to 2 classes.\n", + "Found 24000 images belonging to 2 classes.\n" + ] + } + ], + "source": [ + "bottleneck_datagen = ImageDataGenerator(rescale=1./255)\n", + " \n", + "train_generator = bottleneck_datagen.flow_from_directory('/home/talyanskaya_marina/Dataset_iphone_new/Dataset_iphone_new/train',\n", + " target_size=(150, 150),\n", + " batch_size=32,\n", + " class_mode=None,\n", + " shuffle=False)\n", + "\n", + "validation_generator = bottleneck_datagen.flow_from_directory('/home/talyanskaya_marina/Dataset_iphone_new/Dataset_iphone_new/validation',\n", + " target_size=(150, 150),\n", + " batch_size=32,\n", + " class_mode=None,\n", + " shuffle=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " os.mkdir('/home/talyanskaya_marina/bottleneck_features')\n", + "except OSError:\n", + " shutil.rmtree('/home/talyanskaya_marina/bottleneck_features')\n", + " os.mkdir('/home/talyanskaya_marina/bottleneck_features')\n", + "\n", + "bottleneck_features_train = inc_model.predict_generator(train_generator, steps = 24000/32)\n", + "np.save(open('/home/talyanskaya_marina/bottleneck_features/bn_features_train.npy', 'wb+'), bottleneck_features_train)\n", + "bottleneck_features_validation = inc_model.predict_generator(validation_generator, steps = 24000/32)\n", + "np.save(open('/home/talyanskaya_marina/bottleneck_features/bn_features_validation.npy', 'wb+'), bottleneck_features_validation)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "train_data = np.load(open('/home/talyanskaya_marina/bottleneck_features/bn_features_train.npy', 'rb'))\n", + "train_labels = np.array([0] * 12000 + [1] * 12000) \n", + "\n", + "validation_data = np.load(open('/home/talyanskaya_marina/bottleneck_features/bn_features_validation.npy', 'rb'))\n", + "validation_labels = np.array([0] * 12000 + [1] * 12000)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from keras.layers.convolutional import Conv2D, MaxPooling2D\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense, Dropout, Flatten" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "fc_model = Sequential()\n", + "fc_model.add(Flatten(input_shape=train_data.shape[1:]))\n", + "fc_model.add(Dense(64, activation='relu', name='dense_one'))\n", + "fc_model.add(Dropout(0.5, name='dropout_one'))\n", + "fc_model.add(Dense(64, activation='relu', name='dense_two'))\n", + "fc_model.add(Dropout(0.5, name='dropout_two'))\n", + "fc_model.add(Dense(1, activation='sigmoid', name='output'))\n", + "\n", + "fc_model.compile(optimizer='rmsprop', \n", + " loss='binary_crossentropy', \n", + " metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " os.mkdir('/home/talyanskaya_marina/bottleneck_features_and_weights/')\n", + "except OSError:\n", + " shutil.rmtree('/home/talyanskaya_marina/bottleneck_features_and_weights/')\n", + " os.mkdir('/home/talyanskaya_marina/bottleneck_features_and_weights/')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/jet/var/python/lib/python3.6/site-packages/ipykernel_launcher.py:3: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 24000 samples, validate on 24000 samples\n", + "Epoch 1/50\n", + "24000/24000 [==============================] - 9s 359us/step - loss: 1.1693 - acc: 0.5064 - val_loss: 0.6886 - val_acc: 0.5092\n", + "Epoch 2/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.7021 - acc: 0.5082 - val_loss: 0.6766 - val_acc: 0.5526\n", + "Epoch 3/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.7030 - acc: 0.5096 - val_loss: 0.6861 - val_acc: 0.5312\n", + "Epoch 4/50\n", + "24000/24000 [==============================] - 8s 332us/step - loss: 0.7024 - acc: 0.5175 - val_loss: 0.6780 - val_acc: 0.5518\n", + "Epoch 5/50\n", + "24000/24000 [==============================] - 8s 335us/step - loss: 0.6988 - acc: 0.5293 - val_loss: 0.6633 - val_acc: 0.5620\n", + "Epoch 6/50\n", + "24000/24000 [==============================] - 7s 310us/step - loss: 0.6852 - acc: 0.5499 - val_loss: 0.6066 - val_acc: 0.5982\n", + "Epoch 7/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.6269 - acc: 0.5981 - val_loss: 0.5505 - val_acc: 0.7205\n", + "Epoch 8/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.5859 - acc: 0.6480 - val_loss: 0.5463 - val_acc: 0.7182\n", + "Epoch 9/50\n", + "24000/24000 [==============================] - 7s 312us/step - loss: 0.5437 - acc: 0.6846 - val_loss: 0.5141 - val_acc: 0.7465\n", + "Epoch 10/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.5200 - acc: 0.7010 - val_loss: 0.4996 - val_acc: 0.7474\n", + "Epoch 11/50\n", + "24000/24000 [==============================] - 8s 313us/step - loss: 0.4992 - acc: 0.7110 - val_loss: 0.5119 - val_acc: 0.7413\n", + "Epoch 12/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.4856 - acc: 0.7175 - val_loss: 0.4963 - val_acc: 0.7568\n", + "Epoch 13/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.4790 - acc: 0.7211 - val_loss: 0.4861 - val_acc: 0.7515\n", + "Epoch 14/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.4767 - acc: 0.7253 - val_loss: 0.4939 - val_acc: 0.7565\n", + "Epoch 15/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.4654 - acc: 0.7290 - val_loss: 0.4920 - val_acc: 0.7580\n", + "Epoch 16/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.4569 - acc: 0.7361 - val_loss: 0.4903 - val_acc: 0.7572\n", + "Epoch 17/50\n", + "24000/24000 [==============================] - 8s 318us/step - loss: 0.4520 - acc: 0.7333 - val_loss: 0.4845 - val_acc: 0.7648\n", + "Epoch 18/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.4482 - acc: 0.7382 - val_loss: 0.5104 - val_acc: 0.7603\n", + "Epoch 19/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.4467 - acc: 0.7360 - val_loss: 0.5332 - val_acc: 0.7476\n", + "Epoch 20/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.4431 - acc: 0.7361 - val_loss: 0.4996 - val_acc: 0.7609\n", + "Epoch 21/50\n", + "24000/24000 [==============================] - 7s 308us/step - loss: 0.4422 - acc: 0.7422 - val_loss: 0.4990 - val_acc: 0.7588\n", + "Epoch 22/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.4398 - acc: 0.7377 - val_loss: 0.5043 - val_acc: 0.7545\n", + "Epoch 23/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.4352 - acc: 0.7577 - val_loss: 0.4944 - val_acc: 0.7608\n", + "Epoch 24/50\n", + "24000/24000 [==============================] - 8s 318us/step - loss: 0.4251 - acc: 0.7613 - val_loss: 0.5256 - val_acc: 0.7556\n", + "Epoch 25/50\n", + "24000/24000 [==============================] - 7s 312us/step - loss: 0.4244 - acc: 0.7680 - val_loss: 0.5180 - val_acc: 0.7597\n", + "Epoch 26/50\n", + "24000/24000 [==============================] - 8s 319us/step - loss: 0.4189 - acc: 0.7709 - val_loss: 0.5167 - val_acc: 0.7631\n", + "Epoch 27/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.4203 - acc: 0.7712 - val_loss: 0.5160 - val_acc: 0.7606\n", + "Epoch 28/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.4111 - acc: 0.7780 - val_loss: 0.5377 - val_acc: 0.7627\n", + "Epoch 29/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.4109 - acc: 0.7800 - val_loss: 0.5652 - val_acc: 0.7664\n", + "Epoch 30/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.4089 - acc: 0.7808 - val_loss: 0.5344 - val_acc: 0.7570\n", + "Epoch 31/50\n", + "24000/24000 [==============================] - 8s 313us/step - loss: 0.4074 - acc: 0.7869 - val_loss: 0.5374 - val_acc: 0.7595\n", + "Epoch 32/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.4029 - acc: 0.7855 - val_loss: 0.6612 - val_acc: 0.7658\n", + "Epoch 33/50\n", + "24000/24000 [==============================] - 8s 315us/step - loss: 0.3991 - acc: 0.7882 - val_loss: 0.6722 - val_acc: 0.7573\n", + "Epoch 34/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.3963 - acc: 0.7907 - val_loss: 0.6105 - val_acc: 0.7577\n", + "Epoch 35/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.3939 - acc: 0.7902 - val_loss: 0.5849 - val_acc: 0.7646\n", + "Epoch 36/50\n", + "24000/24000 [==============================] - 8s 326us/step - loss: 0.3891 - acc: 0.7923 - val_loss: 0.7010 - val_acc: 0.7629\n", + "Epoch 37/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.3886 - acc: 0.7943 - val_loss: 0.6281 - val_acc: 0.7662\n", + "Epoch 38/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.3764 - acc: 0.7992 - val_loss: 0.6210 - val_acc: 0.7489\n", + "Epoch 39/50\n", + "24000/24000 [==============================] - 8s 317us/step - loss: 0.3810 - acc: 0.7967 - val_loss: 0.6037 - val_acc: 0.7420\n", + "Epoch 40/50\n", + "24000/24000 [==============================] - 8s 318us/step - loss: 0.3807 - acc: 0.8000 - val_loss: 0.6978 - val_acc: 0.7586\n", + "Epoch 41/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.3782 - acc: 0.7996 - val_loss: 0.5917 - val_acc: 0.7577\n", + "Epoch 42/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.3814 - acc: 0.7963 - val_loss: 0.7144 - val_acc: 0.7621\n", + "Epoch 43/50\n", + "24000/24000 [==============================] - 8s 316us/step - loss: 0.3806 - acc: 0.7942 - val_loss: 0.6483 - val_acc: 0.7520\n", + "Epoch 44/50\n", + "24000/24000 [==============================] - 7s 304us/step - loss: 0.3775 - acc: 0.8007 - val_loss: 0.7409 - val_acc: 0.7648\n", + "Epoch 45/50\n", + "24000/24000 [==============================] - 8s 333us/step - loss: 0.3743 - acc: 0.8003 - val_loss: 0.5713 - val_acc: 0.7562\n", + "Epoch 46/50\n", + "24000/24000 [==============================] - 8s 334us/step - loss: 0.3717 - acc: 0.8038 - val_loss: 0.6715 - val_acc: 0.7549\n", + "Epoch 47/50\n", + "24000/24000 [==============================] - 8s 318us/step - loss: 0.3713 - acc: 0.8055 - val_loss: 0.6999 - val_acc: 0.7581\n", + "Epoch 48/50\n", + "24000/24000 [==============================] - 8s 318us/step - loss: 0.3752 - acc: 0.8033 - val_loss: 0.7368 - val_acc: 0.7597\n", + "Epoch 49/50\n", + "24000/24000 [==============================] - 7s 312us/step - loss: 0.3629 - acc: 0.8091 - val_loss: 0.7648 - val_acc: 0.7570\n", + "Epoch 50/50\n", + "24000/24000 [==============================] - 8s 314us/step - loss: 0.3680 - acc: 0.8044 - val_loss: 0.7187 - val_acc: 0.7558\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fc_model.fit(train_data, train_labels,\n", + " nb_epoch=50, batch_size=32,\n", + " validation_data=(validation_data, validation_labels))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "fc_model.save_weights('/home/talyanskaya_marina/bottleneck_features_and_weights/fc_inception_iphone_250.hdf5') # сохраняем веса" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "24000/24000 [==============================] - 3s 128us/step\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.71865298407276468, 0.75579166666666664]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fc_model.evaluate(validation_data, validation_labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/jet/var/python/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"ou...)`\n", + " if __name__ == '__main__':\n" + ] + } + ], + "source": [ + "weights_filename='/home/talyanskaya_marina/bottleneck_features_and_weights/fc_inception_iphone_250.hdf5'\n", + "\n", + "x = Flatten()(inc_model.output)\n", + "x = Dense(64, activation='relu', name='dense_one')(x)\n", + "x = Dropout(0.5, name='dropout_one')(x)\n", + "x = Dense(64, activation='relu', name='dense_two')(x)\n", + "x = Dropout(0.5, name='dropout_two')(x)\n", + "top_model=Dense(1, activation='sigmoid', name='output')(x)\n", + "finalModel = Model(input=inc_model.input, output=top_model)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "weights_filename='/home/talyanskaya_marina/bottleneck_features_and_weights/fc_inception_iphone_250.hdf5'\n", + "finalModel.load_weights(weights_filename, by_name=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "for layer in inc_model.layers[:205]:\n", + " layer.trainable = False" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from sklearn.metrics import average_precision_score\n", + "\n", + "def AP(y_true, y_pred):\n", + " return tf.py_func(average_precision_score, (y_true, y_pred), tf.double)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "finalModel.compile(loss='binary_crossentropy',\n", + " optimizer=SGD(lr=1e-4, momentum=0.9),\n", + " metrics=['accuracy', AP])" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " os.mkdir('/home/talyanskaya_marina/new_model_weights/')\n", + "except OSError:\n", + " shutil.rmtree('/home/talyanskaya_marina/new_model_weights/')\n", + " os.mkdir('/home/talyanskaya_marina/new_model_weights/')" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "filepath=\"/home/talyanskaya_marina/new_model_weights/weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5\"\n", + "checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')\n", + "callbacks_list = [checkpoint]" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 24000 images belonging to 2 classes.\n", + "Found 24000 images belonging to 2 classes.\n", + "Found 24000 images belonging to 2 classes.\n" + ] + } + ], + "source": [ + "train_datagen = ImageDataGenerator(\n", + " rescale=1./255,\n", + " rotation_range = 90,\n", + " width_shift_range = 0.25,\n", + " height_shift_range = 0.25,\n", + " brightness_range = [0.3, 1.5], \n", + " shear_range = 0.4,\n", + " zoom_range = 0.2,\n", + " vertical_flip = True,\n", + " horizontal_flip = True)\n", + "\n", + "test_datagen = ImageDataGenerator(rescale=1./255)\n", + "\n", + "\n", + "train_generator = train_datagen.flow_from_directory(\n", + " '/home/talyanskaya_marina/Dataset_iphone_new/Dataset_iphone_new/train',#'/home/talyanskaya_marina/final_dataset/train',\n", + " target_size=(150, 150),\n", + " batch_size=32,\n", + " class_mode='binary')\n", + "\n", + "validation_generator = test_datagen.flow_from_directory(\n", + " '/home/talyanskaya_marina/Dataset_iphone_new/Dataset_iphone_new/validation',#'/home/talyanskaya_marina/final_dataset/validation/',\n", + " target_size=(150, 150),\n", + " batch_size=32,\n", + " class_mode='binary')\n", + "\n", + "\n", + "pred_generator=test_datagen.flow_from_directory('/home/talyanskaya_marina/Dataset_iphone_new/Dataset_iphone_new/validation',#'/home/talyanskaya_marina/final_dataset/validation/',\n", + " target_size=(150,150),\n", + " batch_size=100,\n", + " class_mode='binary')" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/jet/var/python/lib/python3.6/site-packages/ipykernel_launcher.py:7: UserWarning: The semantics of the Keras 2 argument `steps_per_epoch` is not the same as the Keras 1 argument `samples_per_epoch`. `steps_per_epoch` is the number of batches to draw from the generator at each epoch. Basically steps_per_epoch = samples_per_epoch/batch_size. Similarly `nb_val_samples`->`validation_steps` and `val_samples`->`steps` arguments have changed. Update your method calls accordingly.\n", + " import sys\n", + "/jet/var/python/lib/python3.6/site-packages/ipykernel_launcher.py:7: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(