{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pandas as pd","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_labels = pd.read_csv('../input/dog-breed-identification/labels.csv')\ndf_labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_labels.shape\n# train 파일 총 10222개 ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train에 breed의 분포\ndf_labels['breed'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train에 breed가 120개 다 존재하는 지 check\nlabel_name = df_labels['breed'].sort_values().unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(label_name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# breed를 label encoding\n# LabelEncoder 객체 생성 -> fit (기준정보) -> transform(변환)\n\nfrom sklearn.preprocessing import LabelEncoder\n\nencoder = LabelEncoder()  # 객체 생성\nencoder.fit(df_labels['breed'])  # 기준정보\ndf_labels['breed']= encoder.transform(df_labels['breed']) # 변환\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(encoder.classes_)\nprint(encoder.inverse_transform([1,2]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# df_labels['id'] ==> 000bec180eb18c7604dcecc8fe0dba07.jpg 실습해주세요\n\ndf_labels['id'] = df_labels['id'] + '.jpg'\ndf_labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 전략\n# cnn , 데이터 증식, flow_from_dataframe\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator ( \n    rescale =1/255.,\n    rotation_range = 20,\n    width_shift_range = 0.1,\n    height_shift_range =0.1,\n    shear_range = 0.1,\n    zoom_range=0.1,\n    horizontal_flip=True,\n    fill_mode = 'nearest',\n    validation_split=0.2\n)\n\nval_datagen = ImageDataGenerator ( \n    rescale=1/255. ,\n    validation_split=0.2\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# TypeError: If class_mode=\"categorical\", \n# y_col=\"breed\" column values must be type string, list or tuple.\n# [실습]\n\ndf_labels['breed'] = df_labels['breed'].astype(str)\ndf_labels.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = '../input/dog-breed-identification/train'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 어디에서, 소스, 타겟, 타겟의 class_mode, batch_size\ntrain_generator = train_datagen.flow_from_dataframe (\n    dataframe = df_labels,\n    directory = train_dir,\n    x_col = 'id' ,      # filename\n    y_col = 'breed',       # class\n    target_size = (150,150),\n    batch_size = 128,\n    class_mode = 'categorical',    # 예. cats&dog: 'binary'\n    subset = 'training',\n    seed = 7   \n)\n\nval_generator = val_datagen.flow_from_dataframe (\n    dataframe = df_labels,\n    directory = train_dir,\n    x_col = 'id' ,      # filename\n    y_col = 'breed',       # class\n    target_size = (150,150),\n    batch_size = 128,\n    class_mode = 'categorical',    # 예. cats&dog: 'binary'\n    subset = 'validation',\n    seed = 7   \n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_labels.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"0. Sequential 객체 생성\n1. conv layer ( filter 32, kernel size (3,3), activation 'relu' , input_shape = ???? )\n2. pooling layer ( pool_size ( 2,2 ))\n3. conv layer ( filter 64, kernel size (3,3), activation 'relu')\n4. pooling layer ( pool_size ( 2,2 ))\n5. conv layer ( filter 128, kernel size (3,3), activation 'relu')\n6. pooling layer ( pool_size ( 2,2 ))\n7. conv layer ( filter 128, kernel size (3,3), activation 'relu')\n8. pooling layer ( pool_size ( 2,2 ))\n9. flatten layer\n9. Dropout (0.5)\n10. Dense layer 출력 뉴런 수 512개, 활성화 함수 'relu'\n11. Dense layer 출력 뉴런 수 ?????, 활성화 함수'????'"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras import layers, models, optimizers\n\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150,150,3)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(128, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(512, activation='relu'))\nmodel.add(layers.Dense(120, 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":"model.compile(loss='categorical_crossentropy',\n              optimizer='rmsprop',\n              metrics=['accuracy'])\nhistory = model.fit(\n    train_generator,    \n    epochs = 3,     \n    steps_per_epoch=len(train_generator) - 1, # batch_size 128\n    validation_data=val_generator,\n    validation_steps = len(val_generator) - 1    \n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## test data generate\n\nbase_dir = '../input/dog-breed-identification'\n\ntest_datagen = ImageDataGenerator ( \n    rescale=1/255. \n)\n\ntest_generator = test_datagen.flow_from_directory (\n    base_dir,\n    target_size = (150,150),\n    batch_size = 128,\n    classes=['test']\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# predict\npreds = model.predict(test_generator, batch_size=len(test_generator)-1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submission = pd.read_csv(\"../input/dog-breed-identification/sample_submission.csv\")\ndf_submission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"preds.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_name = df_labels['breed'].sort_values().unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_to_num = dict(zip(label_name, range(120)))  # affenpinscher : 0\nfor name in label_name:  \n    df_submission[name] = preds[:,class_to_num[name]]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submission.to_csv('submission_dog_cnn.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}