{"cells":[{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import cv2#机器视觉库，opencv \nimport numpy as np \nimport os #系统库\nfrom random import shuffle #随机数据库\nfrom tqdm import tqdm #输出进度库\nimport matplotlib.pyplot as plt ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8aae4c3843ef7dd7fc5bd95bbe1bdad025256b29"},"cell_type":"code","source":"train_dir='../input/train/'\ntest_dir='../input/test/'\nimg_size=50\nlr=1e-3","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"fa81bb025f7a25402a3ebc77582eed00449a3de8"},"cell_type":"markdown","source":"将label变成每个类别的概率（类似于哑变量）"},{"metadata":{"trusted":true,"_uuid":"ab73705383a2d372e985961b9720781f900ad56d"},"cell_type":"code","source":"def label_img(img):\n    word_label=img.split('.')[-3]\n    if word_label=='cat':return [1,0]\n    elif word_label=='dog':return [0,1]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4cf7f9f4434af7d25a9331f34acf2b956a021896"},"cell_type":"markdown","source":"处理训练数据，大约需要30秒"},{"metadata":{"trusted":true,"_uuid":"cb010a9b5c6837331a264e248a741ca6b94ea9c9"},"cell_type":"code","source":"def create_train_data():\n    training_data=[]\n    for img in tqdm(os.listdir(train_dir)):\n        if (not img.endswith('.jpg')):\n            continue\n        label=label_img(img)\n        path=os.path.join(train_dir,img)\n        img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)#读入灰度图\n        img=cv2.resize(img,(img_size,img_size))#将图片变为统一的大小\n        training_data.append([np.array(img),np.array(label)])\n    shuffle(training_data)\n    return training_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d61398b23c3c38be47eca7825c75ea8441db85b4"},"cell_type":"code","source":"train_data=create_train_data()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"792ec5786068e7f39d471223b7985004afb6707b"},"cell_type":"markdown","source":"处理测试数据,注意没有label信心"},{"metadata":{"trusted":true,"_uuid":"70f8a2d76a28666ce4d2579aca6384ae81594d78"},"cell_type":"code","source":"def process_test_data():\n    testing_data = []\n    for img in tqdm(os.listdir(test_dir)):\n        if (not img.endswith('.jpg')):\n            continue\n        path = os.path.join(test_dir,img)\n        img_num = img.split('.')[0]\n        img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)\n        img = cv2.resize(img, (img_size, img_size))\n        testing_data.append([np.array(img), img_num])\n        \n    shuffle(testing_data)\n    return testing_data","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5156b380b43099f38297369595b511fcb2fcaf2b"},"cell_type":"markdown","source":"导入基于Tensorflow的高级深度学习库tflearn"},{"metadata":{"trusted":true,"_uuid":"8621569a0205b3cb1e067f70cbb89c9e53de2f85"},"cell_type":"code","source":"import tflearn","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9b4346e1de115b6fc97f5ad3c95f0e66b5f1f94c"},"cell_type":"code","source":"from tflearn.layers.conv import conv_2d,max_pool_2d#2维CNN以及最大采样\nfrom tflearn.layers.core import input_data,dropout,fully_connected #输入层，dropout，全连接层\nfrom tflearn.layers.estimator import regression #cross entropy","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"138b92cfaf966aeaf709e89c8683919d74220b15"},"cell_type":"markdown","source":"注意：如果多次运行不同的网络结构图，每次需要先清空图"},{"metadata":{"trusted":true,"_uuid":"1e61dc7ad3a88151f54f0fc5f96029e8ee9d060a"},"cell_type":"code","source":"import tensorflow as tf\ntf.reset_default_graph()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2a71498d31133679c3b53493fe1ec2283642d979"},"cell_type":"code","source":"convnet=input_data(shape=[None,img_size,img_size,1],name='input')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1e8f6c3055662ca98521218061c44b52002ae227"},"cell_type":"markdown","source":"3个CNN及2个max pooling层  \n--conv_2d(convnet,32,5,activation='relu')表示建立32个filter，每一个大小都是5x5xchannel，因为默认使用‘’SAME‘padding，加了0使得每个点都可以对应filter左上角  \n--max_pool_2d(convnet,5)表示对于输出的每个5x5的区域求最大值"},{"metadata":{"trusted":true,"_uuid":"8eebafc9fb83802ef067299d92c5c569c0a2e03c"},"cell_type":"code","source":"convnet = conv_2d(convnet, 32, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 64, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 128, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 64, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)\n\nconvnet = conv_2d(convnet, 32, 5, activation='relu')\nconvnet = max_pool_2d(convnet, 5)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ff73696a454cf2e17ba1a0e6bec9e82e35564070"},"cell_type":"markdown","source":"两个全连接层与预测层"},{"metadata":{"trusted":true,"_uuid":"3f0f6a16f3d98cb0ff3ec5dd9f47683fa90c8d5d"},"cell_type":"code","source":"convnet=fully_connected(convnet,1024,activation='relu')\nconvnet=dropout(convnet,0.8)\nconvnet=fully_connected(convnet,2,activation='softmax')\nconvnet=regression(convnet,optimizer='adam',learning_rate=lr,loss='categorical_crossentropy',name='targets')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cb88587ee7bdb976c9931553442e600bddb7b427"},"cell_type":"code","source":"model=tflearn.DNN(convnet,tensorboard_dir='log')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ebd5f8ff0c133b88a7e1c0d70b2dfcb19b64b1c1"},"cell_type":"code","source":"train=train_data[:-500]\ntest=train_data[-500:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0447172d07aea9ea7139d69af0088584695db754"},"cell_type":"code","source":"X = np.array([i[0] for i in train], dtype=np.float64).reshape(-1, img_size, img_size, 1)\ny = np.array([i[1] for i in train], dtype=np.float64)\nXtest = np.array([i[0] for i in test], dtype=np.float64).reshape(-1, img_size, img_size, 1)\nytest = np.array([i[1] for i in test], dtype=np.float64)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1713c73e04215a1fe872e3774a7f230010d4bf62"},"cell_type":"code","source":"model.fit({'input':X},{'targets':y},n_epoch=3,validation_set=({'input':Xtest},{'targets':ytest}),snapshot_step=500,show_metric=True,run_id='model')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ea120a8d8759748a5a40b64ccd2ce547769159e4"},"cell_type":"code","source":"test_data=process_test_data()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c2531ff4cb4787a2f10ca252d419b9bca5762bcc"},"cell_type":"markdown","source":"输出测试数据上一些例子的预测"},{"metadata":{"trusted":true,"_uuid":"219171a75d31ae89c6b630c6c31ea6587a27456e"},"cell_type":"code","source":"fig=plt.figure()\nfor num,data in enumerate(test_data[:16]):\n    img_num=data[1]\n    img_data=data[0]\n    y=fig.add_subplot(4,4,num+1)\n    orig=img_data\n    data=img_data.reshape(img_size,img_size,1)\n    model_out=model.predict([data])[0]\n    if np.argmax(model_out)==1:\n        label='Dog'\n    else:\n        label=\"Cat\"\n    y.imshow(orig,cmap='gray')\n    plt.title(label)\n    y.axes.get_xaxis().set_visible(False)\n    y.axes.get_yaxis().set_visible(False)\nplt.tight_layout()\nplt.show()\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"476c4eec70c339611d4a04e7b536421976a20a8c"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}