{"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":"import os\nfrom PIL import Image\nimport cv2\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Flatten, Conv2D, MaxPooling2D\nfrom collections import Counter\nfrom sklearn.metrics import precision_recall_curve\nfrom sklearn.metrics import roc_curve, auc\nfrom sklearn.metrics import roc_auc_score\nimport itertools\nfrom pylab import mpl\nimport seaborn as sns\n\nclass Solution():\n    #==================读取图片=================================\n    def read_train_image(self,n):\n        imgs = np.empty(shape=(0,384,384,1))\n        for i in range(n):\n            img = cv2.imread(\"/kaggle/input/bitmoji-faces-gender-recognition/BitmojiDataset/trainimages/\"+str(i).zfill(4)+\".jpg\",cv2.IMREAD_GRAYSCALE)\n            imgs = np.concatenate([imgs, img[np.newaxis, :, :, np.newaxis]], axis=0) # 灰度图\n        return imgs\n    \n    def read_test_image(self,n):\n        imgs = np.empty(shape=(0,384,384,1))\n        for i in range(n):\n            img = cv2.imread(\"/kaggle/input/bitmoji-faces-gender-recognition/BitmojiDataset/testimages/\"+str(i+3000).zfill(4)+\".jpg\",cv2.IMREAD_GRAYSCALE)\n            imgs = np.concatenate([imgs, img[np.newaxis, :, :, np.newaxis]], axis=0) # 灰度图\n        return imgs\n    \n    def read_train_label(self):\n        label = pd.read_csv(\"/kaggle/input/bitmoji-faces-gender-recognition/train.csv\")\n        label_np = label[\"is_male\"].to_numpy().T\n        return label_np\n\n    def CNN_model(self):\n    # ============构建卷积神经网络并保存=========================\n        model = Sequential()\n        model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(384, 384, 1))) # 过滤器个数，卷积核尺寸，激活函数，输入形状\n        model.add(MaxPooling2D((2, 2))) # 池化层\n        model.add(Conv2D(64, (3, 3), activation='relu'))\n        model.add(MaxPooling2D((2, 2)))\n        model.add(Conv2D(64, (3, 3), activation='relu'))\n        model.add(Flatten()) # 降维\n        model.add(Dense(64, activation='relu')) # 全连接层\n        model.add(Dense(2, activation='softmax')) # 2分类\n        #model.Summary() # 显示模型的架构\n        model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n        return model\n\nif __name__=='__main__':\n    #print(tf.__version__)\n    Object1 = Solution()\n    print(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))\n    train_images = Object1.read_train_image(3000)\n    print(train_images.shape)\n    test_images = Object1.read_test_image(1084)\n    print(test_images.shape)\n    train_labels = ((Object1.read_train_label()+1)/2).astype(int)\n    print(train_labels)\n    # #===================训练模型=============\n    with tf.device('/device:GPU:0'):\n        model=Object1.CNN_model()\n        CnnModel=model.fit(train_images, train_labels, epochs=20)\n        out_label = model.predict(test_images)\n        print(out_label)\n\n        # history列表\n        print(CnnModel.history.keys())\n        font = {'family': 'Times New Roman','size': 12,}\n        sns.set(font_scale=1.2)\n\n        plt.plot(CnnModel.history['loss'])\n        plt.title('model loss')\n        plt.ylabel('loss')\n        plt.xlabel('epoch')\n        #plt.savefig('D:\\\\DCTDV2\\\\result\\\\V1\\\\loss' + \"\\\\\" + '%s.tif' % a,bbox_inches='tight',dpi=600)\n        plt.show()\n\n        plt.plot(CnnModel.history['accuracy'])\n        plt.title('model accuracy')\n        plt.ylabel('accuracy')\n        plt.xlabel('epoch')\n        #plt.savefig('D:\\\\DCTDV2\\\\result\\\\V1\\\\accuracy' + \"\\\\\" + '%s.tif' % a,bbox_inches='tight',dpi=600)\n        plt.show()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-31T11:11:03.882418Z","iopub.execute_input":"2022-12-31T11:11:03.882775Z","iopub.status.idle":"2022-12-31T11:50:14.223787Z","shell.execute_reply.started":"2022-12-31T11:11:03.882742Z","shell.execute_reply":"2022-12-31T11:50:14.222856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"names = np.zeros(shape=(1084,1)).astype(np.str_)\nfor i in range(1084):\n    names[i,0] = str(3000 + i) + \".jpg\"\nprint(names)\nout_label_a = np.around(out_label[:,1:])*2-1\nans = pd.DataFrame(np.hstack((names,out_label_a.astype(int))),columns = [\"image_id\",\"is_male\"])\nprint(ans)\nans.to_csv(\"result.csv\", index = False, header = True)","metadata":{"execution":{"iopub.status.busy":"2022-12-31T11:50:19.495439Z","iopub.execute_input":"2022-12-31T11:50:19.495802Z","iopub.status.idle":"2022-12-31T11:50:19.522001Z","shell.execute_reply.started":"2022-12-31T11:50:19.495768Z","shell.execute_reply":"2022-12-31T11:50:19.518929Z"},"trusted":true},"execution_count":null,"outputs":[]}]}