{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom scipy.signal import correlate2d\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\nimport matplotlib.pyplot as plt\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ntest_df = pd.read_csv(\"../input/digit-recognizer/test.csv\")\nsample_df = pd.read_csv(\"../input/digit-recognizer/sample_submission.csv\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train_df.iloc[:, 1:].values.reshape((-1, 28, 28)) / 255\ny = np.eye(10)[train_df[\"label\"].values].astype(int)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.imshow(X[0])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y[0]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Conv2D:\n    def __init__(self, num_filters, filter_size):\n        self.num_filters = num_filters\n        self.filter_size = filter_size\n        self.filters = np.random.randn(num_filters, filter_size, filter_size) / 9\n\n    def forward(self, input):\n        self.input = input\n        h, w = input.shape\n        self.last_output = np.zeros((self.num_filters, h - self.filter_size + 1, w - self.filter_size + 1))\n        for i in range(self.num_filters):\n            self.last_output[i] = correlate2d(input, self.filters[i], mode='valid')\n        return self.last_output","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"conv = Conv2D(7, 5)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x1 = conv.forward(X[0])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.imshow(x1[5, :, :])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def maxpool(x, size=2, stride=2):\n    n_channels, h, w = x.shape\n    out_h = (h - size) // stride + 1\n    out_w = (w - size) // stride + 1\n    out = np.zeros((n_channels, out_h, out_w))\n    for c in range(n_channels):\n        for i in range(0, h - size + 1, stride):\n            for j in range(0, w - size + 1, stride):\n                out[c, i // stride, j // stride] = np.max(x[c, i:i+size, j:j+size])\n    return out","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x1_m = maxpool(x1)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.imshow(x1_m[5, :, :])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}