{"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":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-05-30T17:51:29.003511Z","iopub.execute_input":"2021-05-30T17:51:29.003915Z","iopub.status.idle":"2021-05-30T17:51:29.013854Z","shell.execute_reply.started":"2021-05-30T17:51:29.003878Z","shell.execute_reply":"2021-05-30T17:51:29.013008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /kaggle/input/datasciencebowl/train.zip\n!unzip /kaggle/input/datasciencebowl/test.zip","metadata":{"execution":{"iopub.status.busy":"2021-05-30T17:51:33.171521Z","iopub.execute_input":"2021-05-30T17:51:33.172186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nImage.open('train/acantharia_protist/101498.jpg')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nglob.glob('')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.DataFrame({'path': glob.glob('')})\ntrain","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['label'] = train['path'].apply(lambda x: x.split('/')[1].split('.')[0])\ntrain","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.options.display.max_colwidth = 999","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nx_train, x_valid = train_test_split(train, test_size = 0.2, random_state = 42, stratify = train['label'])\n\nx_valid['label'].value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_test = pd.DataFrame({'path': glob.glob('test/*')})\nx_test ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\nidg = ImageDataGenerator()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# tensorflow(= keras), pytorch(딥러닝을 제대로 공부하려면 이 프레임워크를 잘 다루어야 한다)\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras import *\nfrom tensorflow.keras.applications.efficientnet import EfficientNetB0","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# K-Fold CV\nfrom sklearn.model_selection import StratifiedKFold\nskf = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 42)\n\nresult = 0\nfor train_index, valid_index in skf.split(train, train['label']):\n    print(valid_index)\n    x_train = train.iloc[train_index] # iloc함수\n    x_valid = train.iloc[valid_index]\n    idg = ImageDataGenerator(horizontal_flip = True, vertical_flip = True, rotation_range = 30)\n    idg2 = ImageDataGenerator()\n    idg3 = ImageDataGenerator()\n    train_generator = idg.flow_from_dataframe(x_train, x_col = 'path', y_col = 'label', target_size = (100,100), batch_size = 256)\n    valid_generator = idg.flow_from_dataframe(x_train, x_col = 'path', y_col = 'label', target_size = (100,100), batch_size = 256)\n    test_generator = idg.flow_from_dataframe(x_train, x_col = 'path', y_col = None, class_mode = None, shuffle = False, target_size = (100,100), batch_size = 256)\n\n    model = Sequential()\n    model.add(EfficientNetB0(weights = 'imagenet', include_top = False, pooling = 'avg')) # top이 출력층\n    model.add(Dense(121, activation = 'softmax'))  \n    model.compile(metrics = ['acc'], optimizer = 'adam', loss = 'categorical_crossentropy')\n    model.fit(train_generator, validation_data = valid_generator, epochs = 1)\n    \n    result += model.predict(test_generator, verbose = 1) / 5  # ('+='의 의미는 축적)\n    \n    \nx_train\n# x_valid","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input/datasciencebowl/sampleSubmission.csv.zip')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}