{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"099296ea-c65c-9f15-2985-dc57b3c8ce81"},"outputs":[],"source":"from PIL import Image\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os \nimport random\nimport csv\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Activation, Flatten, Dropout, MaxPooling2D, Conv2D\nfrom keras.regularizers import l2\nfrom keras.utils.np_utils import to_categorical\nfrom keras.optimizers import RMSprop\nfrom keras.callbacks import  Callback\n%matplotlib inline"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"acf7101f-214f-85d0-5314-e87f433a8d3f"},"outputs":[],"source":"train_path = '../input/train/'\ntest_path = '../input/test/'\n\nfile_name = os.listdir(train_path)\ni = random.randint(0,len(file_name))\n\nprint ('编号:',i)\nif 'cat' in file_name[i]: \n    print ('标签:Cat')\n    \nelif 'dog' in file_name[i]:\n    print ('标签:Dog')\n    \nimg = Image.open(train_path+file_name[i]) \nplt.axis('off')\nplt.imshow(img)\nplt.show()\nprint ('分辨率是', img.size)"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"d38b5f85-0645-a8dd-d1ba-58a19aef7bb1"},"outputs":[],"source":"train_images = []\nerror_images = []\n\n\nfor i in os.listdir(train_path):\n    i = train_path+i\n    img = Image.open(i)\n    if img.size[0] < 120 or img.size[1] <120:\n        error_images=[i]\n        continue\n    train_images.append(i)\n\nrandom.shuffle(train_images)\n\n#train_images = train_images[:400]\n\nlis=[]\nfor i in range(len(os.listdir(test_path))):\n    i+=1\n    lis.append(i)\n\ntest_images =  [test_path+str(i)+'.jpg' for i in lis]\n\nlen_train=len(train_images)\n\nlen_test  =len(test_images)\n#print (len_train)\n#print (len_test)\n\n#print (train_images)\n\nimg = Image.open(error_images[0])\nplt.axis('off')\nplt.imshow(img)\nplt.show()\nprint ('其中一张异常图片, 分辨率是', img.size)"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"0a1cba5f-3516-9b4d-2d39-eb5a2c5c95fd"},"outputs":[],"source":"labels=[]\nfor i in train_images:\n    if 'dog' in i:\n        labels.append(1)\n    elif 'cat' in i:\n        labels.append(0)\nprint (len(labels))"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"762692c0-d97e-4168-b8e6-13f9f9f962ce"},"outputs":[],"source":"def resize_image(path_name):\n    image = Image.open(path_name) \n    image = image.resize((120,120))\n    return image\n\nnew_train_images = np.ndarray((len_train,120,120,3), dtype = np.uint8)\nnew_test_images = np.ndarray((len_test,120,120,3), dtype = np.uint8)\n\nfor i ,path_name in enumerate(train_images):\n    new_train_image = resize_image(path_name)\n    new_train_images[i]= np.array(new_train_image)\n\n\nfor i ,path_name in enumerate(test_images):\n    new_test_image = resize_image(path_name)\n    new_test_images[i]= np.array(new_test_image)\n\nX_train, X_test, y_train, y_test =train_test_split(new_train_images, labels, test_size=0.3, random_state=4)\n\nprint ('训练集的长度是', len(X_train))\nprint ('测试集的长度是', len(y_train))\n\n\nprint ('输出一张分辨率转换后的图片!')\ni = random.randint(0,len(new_train_images)) \nplt.axis('off')\nplt.imshow(new_train_images[i])\nplt.show()"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"cbf4eb22-578b-37cf-4184-a22b9f21e3ca"},"outputs":[],"source":"model = Sequential()\nmodel.add(Conv2D(32, (3, 3),padding='same', input_shape=(120,120,3), activation='relu'))\nmodel.add(Conv2D(32,(3, 3), padding='same', activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Conv2D(64, (3, 3), padding='same', activation='relu'))\nmodel.add(Conv2D(64, (3, 3), padding='same', activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n    \nmodel.add(Conv2D(128, (3, 3), padding='same', activation='relu'))\nmodel.add(Conv2D(128, (3, 3), padding='same', activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n    \nmodel.add(Conv2D(256, (3, 3), padding='same', activation='relu'))\nmodel.add(Conv2D(256, (3, 3), padding='same', activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(Flatten())\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dropout(0.5))\n    \nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(1))\nmodel.add(Activation('sigmoid'))\n\n\nmodel.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=1e-4), metrics=['accuracy'])\n\nprint ('Model is Generated!')"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"750fd7a6-35f1-a3bb-fcb0-48eb42bab2a4"},"outputs":[],"source":"class LossHistory(Callback):\n    def on_train_begin(self, logs={}):\n        self.losses = []\n        self.acc = []\n        \n    def on_epoch_end(self, batch, logs={}):\n        self.losses.append(logs.get('loss'))\n        self.acc.append(logs.get('acc'))\n\nhistory = LossHistory()\n\nmodel.fit(X_train, y_train, epochs=10, batch_size=32 ,callbacks=[history])"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"a3387da7-9d05-a99f-c581-648ea8ad10d3"},"outputs":[],"source":""}],"metadata":{"_change_revision":0,"_is_fork":false,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.0"}},"nbformat":4,"nbformat_minor":0}