{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom keras.preprocessing.image import load_img, ImageDataGenerator\nimport os\nimport random \nimport zipfile ","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"with zipfile.ZipFile('../input/dogs-vs-cats/train.zip', 'r') as Z:\n    Z.extractall('.')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = os.listdir('./train')\nfilename = random.choice(filenames)\n\nimg = load_img('./train/' + filename)\n\nplt.imshow(img)\nplt.axis('off')\n\nprint('Image shape: {}\\nImage channel: {}'.format(img.size, img.mode))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"categories = []\n\nfor filename in filenames:\n    if 'dog' in filename:\n        categories.append('dog')\n    else:\n        categories.append('cat')\n        \ndf = pd.DataFrame({\n    'filenames': filenames,\n    'categories':categories\n})\n\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_df, validate_df = train_test_split(df, test_size=0.2, random_state=1)\ntrain_df = train_df.reset_index(drop=True)\nvalidate_df = validate_df.reset_index(drop=True)\n\ntrain_datagen = ImageDataGenerator(\n    rotation_range=15,\n    rescale=1/255,\n    shear_range=0.1,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\n\ntrain_generater = train_datagen.flow_from_dataframe(\n    train_df,\n    './train',\n    x_col='filenames',\n    y_col='categories',\n    target_size=(224,224),\n    class_mode='categorical',\n    batch_size=32\n)\n\nvalidate_datagen = ImageDataGenerator(\n    rescale=1/255\n)\n\nvaildate_generater = validate_datagen.flow_from_dataframe(\n    validate_df,\n    './train',\n    x_col='filenames',\n    y_col='categories',\n    target_size=(224,224),\n    class_mode='categorical',\n    batch_size=32\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Layer, Conv2D, AveragePooling2D,\\\n                            BatchNormalization, Dense,\\\n                             serialize, Input, Flatten,\\\n                              Add\nfrom keras.layers.core import Activation\nfrom keras.activations import serialize as a_serialize\nfrom keras.models import Model\nfrom keras.optimizers import Nadam\n\nclass BatchNormDense(Layer):\n    def __init__(self, x, kernel_initializer='he_normal', **kwargs):\n        super().__init__(**kwargs)\n        self.x = x\n        self.kernel_initializer = kernel_initializer\n        self.dense = Dense(self.x, kernel_initializer=self.kernel_initializer)\n        self.batch_norm = BatchNormalization()\n        self.activation = Activation('elu')\n    \n    def call(self, inputs):\n        Z = self.dense(inputs)\n        Z = self.batch_norm(Z)\n        Z = self.activation(Z)\n        \n        return Z\n    \n    def get_config(self):\n        base_config = super().get_config()\n        return {**base_config, 'units': self.x,\n                'kernel_initializer': self.kernel_initializer,\n                'activation': a_serialize(self.activation),\n                'batch_norm': serialize(self.batch_norm),\n                'layer': serialize(self.dense)\n               }\n    \nclass BatchNormConv2D(Layer):\n    def __init__(self, x, kernel_size=(3,3), strides=1,\n                 padding='same', kernel_initializer='he_normal', **kwargs):\n        super().__init__(**kwargs)\n        self.x = x\n        self.kernel_size = kernel_size\n        self.strides = strides\n        self.padding = padding\n        self.kernel_initializer = kernel_initializer\n        \n        self.conv = Conv2D(self.x, kernel_size=self.kernel_size,\n                  strides=self.strides, padding=self.padding,\n                  kernel_initializer=self.kernel_initializer)\n        self.batch_norm = BatchNormalization()\n        \n        self.activation = Activation('relu')\n        \n    def call(self, inputs):\n        Z = self.conv(inputs)\n        Z = self.batch_norm(Z)\n        Z = self.activation(Z)\n        \n        return Z\n    \n    def get_config(self):\n        base_config = super().get_config()\n        return {**base_config, 'units': self.x,\n                'kernel_size': self.kernel_size,\n                'kernel_initializer': self.kernel_initializer,\n                'strides': self.strides,\n                'padding': self.padding,\n                'activation': a_serialize(self.activation),\n                'batch_norm': serialize(self.batch_norm),\n                'layer': serialize(self.conv)\n               }\n\n# residual unit作成\nclass ResidualLayer(Layer):\n    def __init__(self,units, **kwargs):\n        super().__init__(**kwargs)\n        self.unit1, self.unit2 = units\n        \n        self.conv1 = BatchNormConv2D(x=self.unit1, kernel_size=(1,1))\n        self.conv2 = BatchNormConv2D(x=self.unit2)\n        self.conv3 = BatchNormConv2D(x=self.unit2, kernel_size=(1,1))\n        \n        self.shortcut = BatchNormConv2D(x=self.unit2, kernel_size=(1,1))\n        self.activation = Activation('relu')\n        self.add = Add()\n    def call(self, inputs):\n        x = self.conv1(inputs)\n        x = self.conv2(x)\n        x = self.conv3(x)\n        \n        short = self.shortcut(inputs)\n        \n        return self.activation(self.add([x, short]))\n        \n    def get_config(self):\n        base_config = super().get_config()\n        return {**base_config,\n                'unit1': self.unit1,\n                'unit1, 2, short': self.unit2,\n                'conv1': serialize(self.conv1),\n                'conv2': serialize(self.conv2),\n                'conv3': serialize(self.conv3),\n                'shortcut': serialize(self.shortcut),\n                'Add': serialize(self.add),\n                'activation': a_serialize(self.activation)\n        }\n\ndef create_baseresnet(ImageS):\n    layer_in = Input(shape=ImageS)\n    \n    Z = ResidualLayer([64, 64])(layer_in)\n    Z = ResidualLayer([64, 64])(Z)\n    \n    for x in range(2):\n        Z = ResidualLayer([64, 64])(Z)\n        \n    #for x in range(2):\n    #    Z = ResidualLayer([128, 256])(Z)\n    \n    Z = AveragePooling2D(pool_size=(7,7))(Z)\n    Z = Flatten()(Z)\n    Z = BatchNormDense(100)(Z)\n    output = Dense(2, activation='softmax', name='main')(Z)\n    \n    model = Model(inputs=layer_in, outputs=output)\n    \n    return model\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import EarlyStopping, ReduceLROnPlateau,\\\n                              ModelCheckpoint\n\ncb_er = EarlyStopping(monitor='val_loss', patience=3)\ncb_rl = ReduceLROnPlateau(monitor='val_loss', patience=2, factor=0.5)\ncb_cp = ModelCheckpoint('resnet.h5', save_best_only=True)\n\ncallbacks = [cb_er, cb_rl, cb_cp]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"    \nmodel = create_baseresnet((224,224,3))\n    \nmodel.compile(optimizer=Nadam(lr=0.01), \n                  loss='categorical_crossentropy',\n                  metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(train_generater, epochs=50, \n                    validation_data=vaildate_generater ,callbacks=callbacks)","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}