{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"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# Tensorflow.Keras\n#-----------------------------------------------------------#\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Model,Sequential  #用來啟動 NN\nfrom keras.layers import Conv2D  # Convolution Operation\nfrom keras.layers import Dense # Fully Connected Networks\nfrom keras.layers import Dropout, GlobalAveragePooling2D,Input,BatchNormalization\nfrom keras.optimizers import Adam\nfrom keras.callbacks import ReduceLROnPlateau,EarlyStopping\n\nfrom keras.applications import EfficientNetB2\n\n# from keras.layers import MaxPooling2D # Pooling\n# from keras.layers import Flatten\n#-----------------------------------------------------------#\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":"2023-08-31T08:27:14.350565Z","iopub.execute_input":"2023-08-31T08:27:14.351109Z","iopub.status.idle":"2023-08-31T08:27:23.991728Z","shell.execute_reply.started":"2023-08-31T08:27:14.351071Z","shell.execute_reply":"2023-08-31T08:27:23.990750Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### submission","metadata":{}},{"cell_type":"code","source":"submission = pd.read_csv(r'/kaggle/input/face-recognition-xt122/SampleSubmission.csv')\nsubmission.head()","metadata":{"execution":{"iopub.status.busy":"2023-08-31T08:27:23.996303Z","iopub.execute_input":"2023-08-31T08:27:23.999027Z","iopub.status.idle":"2023-08-31T08:27:24.032426Z","shell.execute_reply.started":"2023-08-31T08:27:23.998988Z","shell.execute_reply":"2023-08-31T08:27:24.031195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### 把labelname匯入","metadata":{}},{"cell_type":"code","source":"labelnames = pd.read_csv(r'/kaggle/input/face-recognition-xt122/ClassMap.csv')\nlabelnames.head()","metadata":{"execution":{"iopub.status.busy":"2023-08-31T08:43:44.220052Z","iopub.execute_input":"2023-08-31T08:43:44.220435Z","iopub.status.idle":"2023-08-31T08:43:44.239865Z","shell.execute_reply.started":"2023-08-31T08:43:44.220405Z","shell.execute_reply":"2023-08-31T08:43:44.238942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labelnames.to_dict()['classe_name']","metadata":{"execution":{"iopub.status.busy":"2023-08-31T08:47:35.707581Z","iopub.execute_input":"2023-08-31T08:47:35.707943Z","iopub.status.idle":"2023-08-31T08:47:35.714738Z","shell.execute_reply.started":"2023-08-31T08:47:35.707914Z","shell.execute_reply":"2023-08-31T08:47:35.713763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clss = list(labelnames.to_dict()['classe_name'].values())\nclss","metadata":{"execution":{"iopub.status.busy":"2023-08-31T08:47:36.506226Z","iopub.execute_input":"2023-08-31T08:47:36.506917Z","iopub.status.idle":"2023-08-31T08:47:36.513564Z","shell.execute_reply.started":"2023-08-31T08:47:36.506884Z","shell.execute_reply":"2023-08-31T08:47:36.512347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# labelnames = {y: x for x, y in labelnames.to_dict()['classe_name'].items()}","metadata":{"execution":{"iopub.status.busy":"2023-08-28T03:26:30.451268Z","iopub.execute_input":"2023-08-28T03:26:30.451711Z","iopub.status.idle":"2023-08-28T03:26:30.456625Z","shell.execute_reply.started":"2023-08-28T03:26:30.451670Z","shell.execute_reply":"2023-08-28T03:26:30.455650Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# list(labelnames.keys())","metadata":{"execution":{"iopub.status.busy":"2023-08-28T03:26:30.880824Z","iopub.execute_input":"2023-08-28T03:26:30.881314Z","iopub.status.idle":"2023-08-28T03:26:30.886385Z","shell.execute_reply.started":"2023-08-28T03:26:30.881263Z","shell.execute_reply":"2023-08-28T03:26:30.885356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 把訓練資料匯入","metadata":{}},{"cell_type":"code","source":"datagen = ImageDataGenerator(\n    rescale=1/255.,\n    rotation_range=30,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    brightness_range=(0,3),\n    shear_range=0.2,\n    zoom_range=0.2,\n    fill_mode='nearest',\n    horizontal_flip=True,\n    validation_split=0.3,\n)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T08:47:47.654856Z","iopub.execute_input":"2023-08-31T08:47:47.655203Z","iopub.status.idle":"2023-08-31T08:47:47.661607Z","shell.execute_reply.started":"2023-08-31T08:47:47.655175Z","shell.execute_reply":"2023-08-31T08:47:47.660660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"width = 224\nheight = 224\nbatch_size = 64\nseed = 123\n\ntrain_generator = datagen.flow_from_directory(\n    r'/kaggle/input/face-recognition-xt122/Train',  # 訓練資料目錄的路徑\n    target_size=(width, height),  # 調整影像大小\n    batch_size=batch_size,\n    seed=seed,\n    classes = clss,\n    class_mode='categorical',  # 分類模式，可以是 'binary' 或 'categorical'\n    subset='training'\n)\n\nvalidation_generator = datagen.flow_from_directory(\n    r'/kaggle/input/face-recognition-xt122/Train',\n    target_size=(width, height),\n    batch_size=batch_size,\n    seed=seed,\n    classes = clss,\n    class_mode='categorical',  # 或 'binary'\n    subset='validation'\n)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:36:19.563149Z","iopub.execute_input":"2023-08-31T09:36:19.564138Z","iopub.status.idle":"2023-08-31T09:36:19.601835Z","shell.execute_reply.started":"2023-08-31T09:36:19.564091Z","shell.execute_reply":"2023-08-31T09:36:19.600937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_generator.class_indices)\nprint(validation_generator.class_indices)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:36:22.042917Z","iopub.execute_input":"2023-08-31T09:36:22.044570Z","iopub.status.idle":"2023-08-31T09:36:22.050462Z","shell.execute_reply.started":"2023-08-31T09:36:22.044527Z","shell.execute_reply":"2023-08-31T09:36:22.049418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 建立模型","metadata":{}},{"cell_type":"code","source":"def model_build(mdl=EfficientNetB2) :\n    inpt = mdl(include_top=False, weights='imagenet', input_tensor=None,\n                    input_shape= (width,height,3),\n                    classifier_activation='softmax')\n    \n    x = inpt.output\n    x = GlobalAveragePooling2D()(x)\n#     x = Dropout(0.3)(x)\n    x = Dense(1024, activation='relu')(x)\n    x = BatchNormalization()(x)\n    x = Dropout(0.5)(x)\n    x = Dense(512, activation='relu')(x)\n    x = BatchNormalization()(x)\n#     x = Dropout(0.5)(x)\n    oupt = Dense(5, activation=\"softmax\", name=\"output_layer\")(x)\n    \n    model = Model(inpt.inputs,oupt)\n\n    model.compile(optimizer=Adam(learning_rate=0.00001),\n                  loss='CategoricalCrossentropy', metrics=['accuracy'])\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:28:46.564060Z","iopub.execute_input":"2023-08-31T09:28:46.564447Z","iopub.status.idle":"2023-08-31T09:28:46.575008Z","shell.execute_reply.started":"2023-08-31T09:28:46.564416Z","shell.execute_reply":"2023-08-31T09:28:46.573981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = model_build(mdl=EfficientNetB2)\n# model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:28:47.396142Z","iopub.execute_input":"2023-08-31T09:28:47.396522Z","iopub.status.idle":"2023-08-31T09:28:50.221011Z","shell.execute_reply.started":"2023-08-31T09:28:47.396491Z","shell.execute_reply":"2023-08-31T09:28:50.220047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# callback\nreduce_lr = ReduceLROnPlateau(monitor='val_accuracy', factor=0.5,patience=5, mode='auto',verbose=1,min_lr=1e-15)\n# earlystop = EarlyStopping(monitor='val_loss',\n#                           min_delta=0,\n#                           patience=20,\n#                           verbose=1,\n#                           mode='auto',\n#                          )","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:43:34.501614Z","iopub.execute_input":"2023-08-31T09:43:34.501975Z","iopub.status.idle":"2023-08-31T09:43:34.507643Z","shell.execute_reply.started":"2023-08-31T09:43:34.501945Z","shell.execute_reply":"2023-08-31T09:43:34.506687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batchsize = 64\nhistory = model.fit(train_generator, \n                    steps_per_epoch=train_generator.samples/batchsize, epochs=10,\n                    validation_data=validation_generator,\n                    validation_steps=validation_generator.samples/batchsize,\n                    callbacks=[reduce_lr], use_multiprocessing=True,workers=-1)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:46:24.461890Z","iopub.execute_input":"2023-08-31T09:46:24.462261Z","iopub.status.idle":"2023-08-31T09:49:20.819423Z","shell.execute_reply.started":"2023-08-31T09:46:24.462229Z","shell.execute_reply":"2023-08-31T09:49:20.818392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras import Model\nfrom keras.layers import Flatten\n\ndef build_model(preModel=ResNet50, num_classes=5):\n    inpt = preModel(include_top=False, weights='imagenet', input_tensor=None,\n                    input_shape= (width,height,3),\n                    classifier_activation='softmax')\n    x = inpt.output\n    \n    x = Flatten()(x)\n    x = BatchNormalization()(x)\n#     x = Dropout(0.2)(x)\n    \n    x = Dense(1024, activation='relu')(x)\n    \n    x = BatchNormalization()(x)\n    x = Dropout(0.5)(x)\n#     x = Dense(512, activation='relu')(x)\n    # output\n    output_layer = Dense(\n        5, activation=\"softmax\", name=\"output_layer\")(x)\n\n    model = Model(\n        inpt.inputs,\n        output_layer)\n\n    model.compile(optimizer=Adam(learning_rate=0.0001),\n                  loss='CategoricalCrossentropy', metrics=['accuracy'])\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:46:13.522736Z","iopub.execute_input":"2023-08-31T09:46:13.523136Z","iopub.status.idle":"2023-08-31T09:46:13.532193Z","shell.execute_reply.started":"2023-08-31T09:46:13.523102Z","shell.execute_reply":"2023-08-31T09:46:13.531075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = build_model(preModel=ResNet50, num_classes=5)","metadata":{"execution":{"iopub.status.busy":"2023-08-31T09:46:17.599327Z","iopub.execute_input":"2023-08-31T09:46:17.600202Z","iopub.status.idle":"2023-08-31T09:46:19.353602Z","shell.execute_reply.started":"2023-08-31T09:46:17.600155Z","shell.execute_reply":"2023-08-31T09:46:19.352626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}],"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"}}