{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\ndf_label = pd.read_csv('../input/dog-breed-identification/labels.csv')\ndf_label.head()\nlabel_name = df_label['breed'].sort_values().unique() # 유일한 \nfrom sklearn.preprocessing import LabelEncoder","execution_count":null,"outputs":[]},{"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":"# labels 살펴보기\ndf_label = pd.read_csv('../input/dog-breed-identification/labels.csv')\ndf_label.head()\n\n# 전략1 cnn\n# 1. 이미지 read -> 벡터 (입력 텐서) -> ImageDataGenerator\n# 2. 라벨 -> 1차원 벡터 \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 총 몇 건일까요?\ndf_label.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# breed별 분포 ( 건수 ) 종류별로 얼마나 있는지 \ndf_label['breed'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 120개 종류를 출력 \n\ndf_label['breed'].sort_values().unique() # 유일한 ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nlabel_name = df_label['breed'].sort_values().unique() # 유일한 \nprint(label_name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# label_name 의 건수, type\n\nprint(len(label_name), type(label_name), label_name.dtype)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# dog bleed string을 숫자로 변환\n# label encoding (정수), one-hot encoding \n# LabelEncoder 객체 -> fit(df_label['breed']) -> transform(df_label['breed'])\n\nfrom sklearn.preprocessing import LabelEncoder\n\nencoder = LabelEncoder()\nencoder.fit(df_label['breed'])  # 기준정보  120개 120개 - 100개 (20개)\ndf_label['breed'] = encoder.transform(df_label['breed'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_label.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_label.info()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# id 에 .jpg 파일이름으로 변환\ndf_label['id'] = df_label['id'] + '.jpg'\ndf_label.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# ImageDataGenerator \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\n# 증식 사용하면 안됨\nval_datagen  = ImageDataGenerator (\n    rescale = 1/255.,\n    validation_split = 0.2    \n)\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = '../input/dog-breed-identification/train'\ndf_label['breed'] = df_label['breed'].astype(str)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe = df_label,\n    directory = train_dir,\n    x_col = 'id'  ,      # filename\n    y_col = 'breed' ,    # label정보\n    target_size = (150,150),\n    class_mode = 'categorical',\n    batch_size = 128,\n    subset = \"training\",\n    seed = 7\n)\n\nval_generator = val_datagen.flow_from_dataframe(\n    dataframe = df_label,\n    directory = train_dir,\n    x_col = 'id'  ,      # filename\n    y_col = 'breed' ,    # label정보\n    target_size = (150,150),\n    class_mode = 'categorical',\n    batch_size = 128,\n    subset = \"validation\",\n    seed = 7\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"d, l = next(train_generator)\nl.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_label.head()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"################## 모델 생성 cnn\nSequential 객체 생성\nconv layer ( filter 32, kernel size (3,3), activation 'relu' , input_shape = ???? )\npooling layer ( pool_size ( 2,2 ))\nconv layer ( filter 64, kernel size (3,3), activation 'relu')\npooling layer ( pool_size ( 2,2 ))\nconv layer ( filter 128, kernel size (3,3), activation 'relu')\npooling layer ( pool_size ( 2,2 ))\nconv layer ( filter 128, kernel size (3,3), activation 'relu')\npooling layer ( pool_size ( 2,2 ))\nflatten layer\nDropout (0.5)\nDense layer 출력 뉴런 수 512개, 활성화 함수 'relu'\nDense layer 출력 뉴런 수 ?????, 활성화 함수'????'\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# 모델 생성 -> compile -> fit -> predict -> submission 파일 만들기\n# 전략: cnn, pretrained 사전학습된 vgg16 - 빠른 추출 (현업 batch), 일반적 방법\n\nfrom 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":"len(train_generator)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# compile -> fit -> predict -> submission 파일 만들기\nmodel.compile(loss='categorical_crossentropy',\n              optimizer=optimizers.RMSprop(lr=2e-5),\n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# fit\nhistory = model.fit(\n      train_generator,\n      steps_per_epoch=len(train_generator) - 1,\n      epochs=5,\n      validation_data=val_generator,\n      validation_steps=len(val_generator) - 1\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# predict -> submission 파일 만들기\n\nbase_dir = '../input/dog-breed-identification/'\n\ntest_datagen = ImageDataGenerator(rescale=1/255.)\n\ntest_generator = test_datagen.flow_from_directory(base_dir,\n                                                  target_size=(150,150),\n                                                  batch_size=128,\n                                                  classes=['test'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## predict \n\npreds = model.predict(test_generator)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(preds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(test_generator)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"preds[-1]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# submit \ndf_submit = pd.read_csv('../input/dog-breed-identification/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submit.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_to_num = dict(zip(label_name, range(120))) # 알파벳순, 0~119\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_to_num['affenpinscher']   # dog breed의 index값 (알파벳순 )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for name in label_name:\n    df_submit[name] = preds[:,class_to_num[name]]  \n\n# name = 'affenpinscher'\n# df_submit['affenpinscher'] \n# preds[:,0]          <- class_to_num['affenpinscher'] = 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submit.to_csv('submission_dog.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}