{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"![image.png](attachment:3193500e-2316-4482-9940-b1b90bc46978.png)","metadata":{},"attachments":{"3193500e-2316-4482-9940-b1b90bc46978.png":{"image/png":"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bzltdwddoFqN6BzV8aK7C4fEdydXa87CCogAjoURsh46/KK1ZbsUvPaQ8pMESOAtINBJAKl0j0iQ+5B9L7EB1JG/JaERevykdR+xd2iw7iPufXXPvM+EQohYi4rUSv5b1j07FMLwrQzKgT94JAI6i7izA0QIIe2eKlbJfWVa9hRW7Q9jQpxjjrklpJ12whiddveNV/cOj+C1VvI7+dvbZTfRr5+dxlvujVm7r7Zu8gjeOAqb5sIyYRuOpc2F+dJhdV/WvcGaV1diuO16Q2GMJlvswAEJhZE4cldXDN/S2lC7NJihMmpsRyaQcXayChh3R4MFhed0f2x7J3jtGaVc4+33YrWzBn6+eImygRWae80F78962L0MD5uvhQH2aWcvXfvEET6Fq73hxBGKtctqv3oIynPctKC6dPHbrt6gsvq5lymr18NjEiABEvhdErBDCY7S+SOUkWu0Z698Xzttr+HSzlHucUewy2fGW/j1mBrl0Mxb7N/skGzffttxd+rQDro0tr0XvJrNPCQBIaALXhIhARIgARIgARIggV4ToODtNWHW30RALWrwB7435eIJEiABEiABEiABEugOAQre7nBkLSRAAiRAAiRAAiRAAn1KgIK3TweGZpEACZAACZAACZAACXSHAAVvdziyFhIgARIgARIgARIggT4lQMHbpwNDs0iABEiABEiABEiABLpDgIK3OxxZCwmQAAmQAAmQAAmQQJ8SoODt04GhWSRAAiRAAiRAAiRAAt0hQMHbHY6shQRIgARIgARIgARIoE8JnNip1cB/ZMA5wDnAOcA5wDnAOcA5wDnwts4Benj79EmEZpEACZAACZAACZAACXSHAAVvdziyFhIgARIgARIgARIggT4lQMHbpwNDs0iABEiABEiABEiABLpDgIK3OxxZCwmQAAmQAAmQAAmQQJ8SoODt04GhWSRAAiRAAiRAAiRAAt0hQMHbHY6shQRIgARIgARIgARIoE8JUPD26cDQLBIgARIgARIgARIgge4QoODtDkfWQgIkQAIkQAIkQAIk0KcEKHj7dGBoFgmQAAmQAAmQAAmQQHcIUPB2hyNrIQESIAESIAESIAES6FMCFLx9OjA0iwRIgARIgARIgARIoDsEKHi7w5G1kAAJkAAJkAAJkAAJ9CkBCt4+HRiaRQIkQAIkQAIkQAIk0B0Cr1Dw1rGy9BCZ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"}}},{"cell_type":"code","source":"import cv2\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport pandas as pd\nimport tensorflow\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.applications import NASNetLarge\nfrom tensorflow.keras.applications.nasnet import preprocess_input\nfrom tensorflow.keras.optimizers import SGD\nimport h5py\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## dirs","metadata":{}},{"cell_type":"code","source":"train_dir = \"../input/dog-breed-identification/train\"\ntest_dir = \"../input/dog-breed-identification/test\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## jpg\n\nOpen file with labels and add \".jpg\" to filenames","metadata":{}},{"cell_type":"code","source":"labels = pd.read_csv(\"../input/dog-breed-identification/labels.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_id = [el +\".jpg\" for el in labels[\"id\"]]\nlabels[\"id\"] = new_id","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ImageDataGenerator\n\ncustomization of generator","metadata":{}},{"cell_type":"code","source":"generator = ImageDataGenerator(\n    validation_split=0.02,\n    horizontal_flip = True,\n    preprocessing_function = preprocess_input\n)\n\n\nBATCH_SIZE = 32\nimage_size=(331,331)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## flow_from_dataframe\n\nload photo/images from dataframe","metadata":{}},{"cell_type":"code","source":"train_generator = generator.flow_from_dataframe(\n    dataframe=labels,\n    directory=train_dir,\n    x_col=\"id\",\n    y_col=\"breed\",\n    target_size=image_size,\n    batch_size=32,\n    subset=\"training\",\n)\n\nvalid_generator = generator.flow_from_dataframe(\n    dataframe=labels,\n    directory=train_dir,\n    x_col=\"id\",\n    y_col=\"breed\",\n    target_size=image_size,\n    batch_size=32,\n    subset=\"validation\",\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## NASNetLarge","metadata":{}},{"cell_type":"code","source":"nas_model=NASNetLarge(\n    include_top=False, \n    weights='imagenet', \n    input_shape=(331,331,3),\n)\n\nnas_model.trainable = False\n    \nmodel = tensorflow.keras.Sequential(\n    [\n        nas_model,   \n        layers.GlobalAveragePooling2D(),\n        tensorflow.keras.layers.Dense(120, activation='softmax')\n    ]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## compile and train\ncustomization of model for getting weights and fiting it","metadata":{}},{"cell_type":"code","source":"opt = SGD(lr=1e-3, momentum=0.9)\nmodel.compile(\n    optimizer = opt, \n    loss=\"categorical_crossentropy\", \n    metrics=[\"accuracy\"]\n)\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early = tensorflow.keras.callbacks.EarlyStopping(\n    patience=2, \n    min_delta=0.001, \n    restore_best_weights=True\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID = valid_generator.n//valid_generator.batch_size\nhistory = model.fit(\n    train_generator, \n    steps_per_epoch=STEP_SIZE_TRAIN, \n    validation_data=valid_generator, \n    validation_steps=STEP_SIZE_VALID, \n    epochs=25, \n    batch_size=32, \n    callbacks=[early], \n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## test datagen","metadata":{}},{"cell_type":"code","source":"test_df = pd.read_csv(\"/kaggle/input/dog-breed-identification/sample_submission.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_id = [el +\".jpg\" for el in test_df[\"id\"]]\ntest_df[\"id\"] = new_id","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen=ImageDataGenerator(\n    preprocessing_function = preprocess_input,\n)\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe=test_df,\n    directory=test_dir,\n    x_col=\"id\",\n    y_col=None,\n    target_size=image_size,\n    batch_size=32,\n    class_mode=None,\n    shuffle=False,\n    \n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## prediction","metadata":{}},{"cell_type":"code","source":"y_pred = model.predict(test_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub = pd.read_csv('/kaggle/input/dog-breed-identification/sample_submission.csv')\ndf_sub.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sub.iloc[:,1:] = y_pred\ndf_sub.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_df = df_sub.set_index('id')\nfinal_df.to_csv('dog_breed_identification_1.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}