{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%%capture\n!pip install lightning","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:11:28.305154Z","iopub.execute_input":"2026-08-30T04:11:28.305987Z","iopub.status.idle":"2026-08-30T04:11:34.149015Z","shell.execute_reply.started":"2026-08-30T04:11:28.305939Z","shell.execute_reply":"2026-08-30T04:11:34.148173Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### test late submission for this model -- Quite Good with baseline 🤗\n![Screenshot 2026-08-30 at 11.56.21.png](attachment:45a10f13-379b-4b6b-9950-23f326c6d87e.png)","metadata":{},"attachments":{"45a10f13-379b-4b6b-9950-23f326c6d87e.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAByQAAAEWCAYAAAAn/iAJAAABUmlDQ1BJQ0MgUHJvZmlsZQAAGJV1kL1LQmEUxn+aIZlQQ0REkINEg0aYgasKSdAgVlANwfVqGvhxuRrR0FbUKDQFDWX/QFOtDe0NfQwRzTVHLiW382qlFh14OD8envdw3gN2NMPIOYB8oWwmYhHP0vKKx/lCL8MM4iGo6SUjHI/PSYTv3lm1e2yq3/jVLJfdcTd6YoVW97b9z7Geyt98R7lS6ZIu/UM0rhtmGWxe4fhm2VAsYsCUpYT3FWeafKQ42eSzRmYhERW+Eu7Xs1pK+FbYl2zzM22cz23oXzuo7d3pwuK86qIRYgQIMiP/D/yTCzZyUYoYbGGyToYsZXkRFscgR1p4lgI6E/jUJCZF0+q+v+/W8opVCL1BV6XlJQ/hYheGHlqe9xj6duD82tBM7eeatpqjtDYVaLI7At1PlvU6Bs4DqFcs671qWfVTmf8Il4VPlhdg6ZeiAZIAAACKZVhJZk1NACoAAAAIAAQBGgAFAAAAAQAAAD4BGwAFAAAAAQAAAEYBKAADAAAAAQACAACHaQAEAAAAAQAAAE4AAAAAAAAAkAAAAAEAAACQAAAAAQADkoYABwAAABIAAAB4oAIABAAAAAEAAAckoAMABAAAAAEAAAEWAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdPstsf4AAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHXaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI3ODwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xODI4PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CjczH6cAAAAcaURPVAAAAAIAAAAAAAAAiwAAACgAAACLAAAAiwAAPlrcRtRhAAA+JklEQVR4AezdB5gTRRvA8ReUKgoWRKoiioiFrtgVCyj2rmBBehFBmvSjd0EEpQk2sIsIKliwKygofBaQXkVpUqS3b97BiZvc5i654+Lt3X95uCSb2d3Z30ySfebdmclRrHjJQ8KCAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIZIBADgKSGaDKLhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwAoQkKQiIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAhgkQkMwwWnaMAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIEJKkDCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQYQIEJDOMlh0jgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAABSeoAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghkmAAByQyjZccIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIEBAkjqAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIZJkBAMsNo2TECCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCBCQpA4ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECGCRCQzDBadowAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgQkqQMIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIJBhAgQkM4yWHSOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAFJ6gACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCGSYAAHJDKNlxwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAA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IIAAAggggAACCCCAAAIIIIBA9hZIeECyYMFC2Vucs0cAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgGwls3bolrrNNdw9JApJxeZMYAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQOAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgUALEJAMdPGReQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQytwABycxdPuQukwhUrVZN7rrrLpkzZ468+cYbcujQoYTmLH/+/FKv3iNS+OTCMmH8eFm5cmVCj8/BEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIG0ChCQTKsc22WYQPPmLaTG1TXs/v/8809p1rRphh0rlh2ffPLJMnHSJMmRI4dNPmbMGHn9tddi2fSIpenXr79Uu6Ca3d+uXbvkphtvPGL7ZkcIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEYKEJDMSF32nSaBQYMHS6VKley2mSH4dmH16tKnT5/QuXz77bfStUuX0OtEPNGAaJEiReyhtHfmjbVry549exJxaI6BAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCKRLgIBkuvjYOCMEMltAUs/x2dGj5cwzzpDt2/+Wli0fldWrVmXEqUfd55VXXiXtn+ggRx91tHz00YcyaODAqGl5AwEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDITAIEJDNTaZAXK5AZA5KasZw5c8rBgwf/01LSYWMTPX/lf3rCHBwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQCL0BAMvBFmLgTyJUrl1SqXFkqVKggZ5jegps3b5aFCxbIN998Ixs2bAjLSMlSpeTmm28+vO6QyOjRo2T//v1haerUrSuFChWy62bNmiVz58yxz/0Cknq8q2rUsMedP3++vPfee7J1y5aw/emL2++4Q4oWLWrXf/bZZ/LLzz/LLbfeKtUvrC65cucSHW71rTffDG13zrnnyjXXXCNlypSRZcuWycyZM+V/Zv/eRYOATZs1C80hqcdesXy5N4kULFhQqlStKhXOryBFixWTNatXy8+//CzfGhsddtZvicfzoosukspVqtjdrF+/Xt54/XW/XUrVatXk8ssvl1OKnCK7du+WVatWyuTJk2Xzpk3J0nv3uXTpUpn+wQdy+umnyy233GrPYfHiRfLJxx9bl2Qbx7hC7Wqb+S7PNc4nnniibNy4URYvWiRTp06Vffv2Rd1L+fLlpaIZtlcftd4sXLhQ5nz/vSxZsiS0jZrXfeCB0Ouvv/pK5s2bF3rtnpQxdadWrVrupbz91luybt260GueIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQMYKEJCM1TdPTslR8CiR4w7/z6GPZjm07YDIP/8PbTXP9/y3PehiPZ1405133nnSt39/yZc3b7JNtcfe6yZANnbMmNB7t912uzRv0Tz0+o7bb5etW7eGXuuTD6bPkFy5jrbrvvjiS+nZI8k+jwxIvvPOO3LffffZ97x/lixZKk0aN/KuknemTJECBQrYdR/O+FDKn1NeSpQoEZbm118XSMtHW0i79u2lZs2aYe/piw9MYG6ImcfSLblz55b3zTq3jBs7Vl599VX3Uu666y5p2Kix6UGZI7TOPdm7d6/069tPvvzyC7fKPsbrOXDQYKlcOfq8mhqcGztunJxwwglhx3Evpk+fLoMHDXIv7aPXee3a3+W72bPltttvC0ujL3744Udp365tsvWprdB5QPv26x8qY2/6ffv2y0svviiTJk30rpbChQvLk0OHmaDyKWHr3QsNOHbu1MnOn5kvXz551wQ2Neipy5o1a+Xhhx50SUOPg4cMkYoVK4Ze161TR/7444/Qa54ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAxgrEG5D8PwAAAP//W4618QAAQABJREFU7d0HmFRF1sbxMwGGnCXnJKIoYEJBBUUMJEHJIsEAZkXdVUG/1cUc1oioSAZJSpRkAEExgwiKknPOOcwwX50a6nK7p2foZqZxkH89j/SNdW//Ouw+8/apiilZqkyyZKDlz18gA2ef4lMLxUvsebkkRv+rkEMk9gTXPyqSvOKgJC/cL0fNf7I98QQnnB67q1atKu/26SMxMTHp3vDQoUNl4IAB9pgWLVrKvffd6x1/c8uWsmvXLm9dF6ZMnSbZssXbbbNmzZZnn/mPXX7l1VelVq1adjk5OTnd6/7040/yxBOP22P1n3Hjx0uePHnsemJiksTHx3n7/Avff/+91KlTx78pYLnPu+/Kp59+ardlz55dJk+Z4u3v9+GHMmLECLt+W6dOctttt3n70lro3q2bLF261O4+Gc+XX3lVatdOMTlw4IA0bdLEu1RCQoIMHTZMChYs6G0LtTBmzBjp+9573i6/c3pWesK0adPklZdf9s490UKlypWlj3nPxMWF9nfn9/+ovwwfPsytWmf1Tq8tWbJE7u7e3R7yXt++UqVKFbus75XmzZrJ/v3ms+dr/vfZpk2bpEP79r69LCKAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEC0BXbt2hnRJWLOhEAy5oLcEntNfokplX4wciK55HWH5eiXuyR5/r4THZql9/fs1UsaNGjg3ePkyZNF/6t+zjnSuUtXyZUrp913+MgRaXzDDaLBUGYFku6iGzZslO+//04qVKgo559/vsTGHg9H333nXRk7NiU89AeSeu7Bg4fk669nmvMq2OAqOFRdvHixLFu23ISTlwYEeosWLZL777vPXj69QHLEyJFSpEgRe1xSUpIM6N9f5s6bJ1dccYW0adPWu8+lS5dJ92532eNOxjO9QPKj/gOkXLmytm/9Z/PmLTJr1tdSokRJueSSS7zQV/e98cYbMmniRF0UfyBpN5h/li1bJmvXrpWLL77Ee11134GDB6Vp48busHQf8+bNKyNHj5bs2bJ5xy0xYezsWbOkbNmycs0113ghs5o1vvFGSUxMlLp168ozzz7rnfPXX3/JABNw586VS27r1DngOd5z992ir139+g2k11O9vHMGDRwkQ4YM9taD+/SHyd5BLCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEBUBQgkfbwxlXJIbJOCElM2wbc144vJqw/J0Uk7JHnZwYx39jf0MHLUaClcuJC98v79B6RZ0+PVeVrt1+ORR2XJksUyd+5cmTljRqYHkqtWrZbbu3bxnvnVJtB68sknvfWFCxfKQw8+aNf9geTRo8mm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BBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhcgkIzcjDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBMAQLJMKE4DAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEIhf4f69jERjVZo3CAAAAAElFTkSuQmCC"}}},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom pathlib import Path\nimport cv2\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\n# Torch and Torch lightning\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader, random_split\nfrom torchvision.transforms import Compose,ToTensor, Resize, Normalize\nimport torchvision.models as models\nimport lightning as L\nfrom lightning.pytorch import LightningModule\nfrom lightning.pytorch.callbacks import ModelCheckpoint, EarlyStopping, LearningRateMonitor\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nROOT = Path(\"/kaggle/input/competitions/histopathologic-cancer-detection\")\nprint(ROOT)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:11:34.150834Z","iopub.execute_input":"2026-08-30T04:11:34.151254Z","iopub.status.idle":"2026-08-30T04:11:59.641447Z","shell.execute_reply.started":"2026-08-30T04:11:34.151221Z","shell.execute_reply":"2026-08-30T04:11:59.640770Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CancerDetectionDataset(Dataset):\n    def __init__(self, root: str, train: bool = True, transform = None):\n        super().__init__()\n        self.root = Path(root)\n        self.transform = transform\n        self.image_paths = []\n        self.labels = []\n        \n        if train:\n            mode = \"train\"\n            label_paths = pd.read_csv(self.root / \"train_labels.csv\")\n            image_dir = self.root / mode\n            for _, row in label_paths.iterrows():\n                img_path = image_dir / f\"{row['id']}.tif\"\n                self.image_paths.append(img_path)\n                self.labels.append(row[\"label\"])\n        else:\n            mode = \"test\"\n            image_dir = self.root / mode\n            sub_df = pd.read_csv(self.root / \"sample_submission.csv\")\n            for image_id in sub_df['id']:\n                img_path = image_dir / f\"{image_id}.tif\"\n                self.image_paths.append(img_path)\n                self.labels.append(0)\n\n    def __len__(self):\n        return len(self.image_paths)\n\n    def __getitem__(self, item):\n        img_path = self.image_paths[item]\n        image = Image.open(img_path)\n        label = self.labels[item]\n        if self.transform:\n            image = self.transform(image)\n        return image, label","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:42:06.474941Z","iopub.execute_input":"2026-08-30T04:42:06.476420Z","iopub.status.idle":"2026-08-30T04:42:06.485701Z","shell.execute_reply.started":"2026-08-30T04:42:06.476335Z","shell.execute_reply":"2026-08-30T04:42:06.484800Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_transform = Compose([\n    Resize((224, 224)),\n    ToTensor(),\n    Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225])\n])\n\ntest_transform = Compose([\n    Resize((224, 224)),\n    ToTensor(),\n    Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225])\n])\n\ntrain_data = CancerDetectionDataset(\n    root = ROOT,\n    train = True,\n    transform = train_transform\n)\ntest_data = CancerDetectionDataset(\n    root = ROOT,\n    train = False,\n    transform = test_transform\n)\n\ntrain_size = int(0.9 * len(train_data))\nval_size = len(train_data) - train_size\nsub_train_data, val_data = random_split(train_data, [train_size, val_size])\n\n# dataloader\ntrain_loader = DataLoader(\n    sub_train_data,\n    batch_size = 128,\n    num_workers = 2,\n    shuffle = True,\n    drop_last = True\n)\n\nval_loader = DataLoader(\n    val_data,\n    batch_size = 128,\n    num_workers = 2,\n    shuffle = False,\n    drop_last = False,\n)\n\ntest_loader = DataLoader(\n    test_data, \n    batch_size=128, \n    num_workers=2, \n    shuffle=False, \n    drop_last=False\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:42:31.563794Z","iopub.execute_input":"2026-08-30T04:42:31.564098Z","iopub.status.idle":"2026-08-30T04:42:42.224397Z","shell.execute_reply.started":"2026-08-30T04:42:31.564074Z","shell.execute_reply":"2026-08-30T04:42:42.223382Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image, label = train_data[26]\nprint(f\"Label: {label}\")\nplt.figure(figsize=(4, 4))\nplt.imshow(image.permute(1, 2, 0)) \nplt.title(f\"Label: {label}\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:12:12.379528Z","iopub.execute_input":"2026-08-30T04:12:12.379822Z","iopub.status.idle":"2026-08-30T04:12:12.853145Z","shell.execute_reply.started":"2026-08-30T04:12:12.379796Z","shell.execute_reply":"2026-08-30T04:12:12.852254Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class LitCancerDetectionModel(LightningModule):\n    def __init__(self, num_classes=2, lr=1e-4):\n        super().__init__()\n        self.save_hyperparameters()\n        self.lr = lr\n        \n        self.backbone = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)\n        in_features = self.backbone.fc.in_features\n        self.backbone.fc = nn.Linear(in_features, 1) \n\n        self.criterion = nn.BCEWithLogitsLoss()\n\n    def forward(self, x):\n        return self.backbone(x)\n\n    def training_step(self, batch, batch_idx):\n        images, labels = batch\n        labels = labels.float().unsqueeze(1)\n        outputs = self(images)\n        loss = self.criterion(outputs, labels)\n\n        preds = (torch.sigmoid(outputs) > 0.5).float()\n        acc = (preds == labels).float().mean()\n        \n        self.log(\"train_loss\", loss, on_step=True, on_epoch=True, prog_bar=True)\n        self.log(\"train_acc\", acc, on_step=True, on_epoch=True, prog_bar=True)\n        return loss\n        \n    def validation_step(self, batch, batch_idx):\n        images, labels = batch\n        labels = labels.float().unsqueeze(1)\n        outputs = self(images)\n        \n        val_loss = self.criterion(outputs, labels)\n        preds = (torch.sigmoid(outputs) > 0.5).float()\n        acc = (preds == labels).float().mean()\n        \n        self.log(\"val_loss\", val_loss, on_step=True, on_epoch=True, prog_bar=True)\n        self.log(\"val_acc\", acc, on_step=True, on_epoch=True, prog_bar=True)\n        return val_loss\n        \n    def configure_optimizers(self):\n        optimizer = optim.Adam(self.parameters(), lr=self.lr)\n        scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(\n            optimizer,\n            T_max=100,\n            eta_min=1e-5\n        )\n        return {\n            'optimizer': optimizer,\n            'lr_scheduler': {\n                'scheduler': scheduler,\n                'interval': 'epoch',\n                'frequency': 1,\n            }\n        }","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:12:12.854355Z","iopub.execute_input":"2026-08-30T04:12:12.854652Z","iopub.status.idle":"2026-08-30T04:12:12.864810Z","shell.execute_reply.started":"2026-08-30T04:12:12.854628Z","shell.execute_reply":"2026-08-30T04:12:12.863994Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create callbacks\ncheckpoint = ModelCheckpoint(\n    monitor='val_loss',\n    mode='min',\n    save_top_k=3,\n    filename='model-{epoch:02d}-{val_loss:.2f}'\n)\n\nearly_stop = EarlyStopping(\n    monitor='val_loss',\n    patience=5,\n    mode='min'\n)\n\nlr_monitor = LearningRateMonitor(logging_interval='epoch')\n\n# GPUs T4 x 2 on kaggle\nmodel = LitCancerDetectionModel()\ntrainer = L.Trainer(\n    max_epochs = 1,\n    accelerator='gpu',\n    devices=[0],\n    #strategy='ddp',\n    callbacks=[checkpoint, early_stop, lr_monitor]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:12:12.865755Z","iopub.execute_input":"2026-08-30T04:12:12.866076Z","iopub.status.idle":"2026-08-30T04:12:13.622213Z","shell.execute_reply.started":"2026-08-30T04:12:12.866037Z","shell.execute_reply":"2026-08-30T04:12:13.621660Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# train and evaluation\ntrainer.fit(model, train_loader, val_loader)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:12:13.623254Z","iopub.execute_input":"2026-08-30T04:12:13.623876Z","iopub.status.idle":"2026-08-30T04:32:16.410475Z","shell.execute_reply.started":"2026-08-30T04:12:13.623850Z","shell.execute_reply":"2026-08-30T04:32:16.409806Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainer.validate(model, val_loader)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:32:16.411936Z","iopub.execute_input":"2026-08-30T04:32:16.412190Z","iopub.status.idle":"2026-08-30T04:32:56.630368Z","shell.execute_reply.started":"2026-08-30T04:32:16.412162Z","shell.execute_reply":"2026-08-30T04:32:56.629648Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#submission\nmodel.eval()\nmodel.cuda()\npredictions = []\nimage_ids = []\n\nwith torch.no_grad():\n    for batch in test_loader:\n        images, labels = batch  \n        images = images.cuda()\n        outputs = model(images)\n        preds = torch.sigmoid(outputs).cpu().numpy().flatten()\n        predictions.extend(preds)\n\nfor img_path in test_data.image_paths:\n    image_id = img_path.stem\n    image_ids.append(image_id)\n\nsubmission_df = pd.DataFrame({\"id\": image_ids, \"label\": predictions})\nsubmission_file = \"submission.csv\"\nsubmission_df.to_csv(submission_file, index=False)\nprint(submission_df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:42:54.942543Z","iopub.execute_input":"2026-08-30T04:42:54.943441Z","iopub.status.idle":"2026-08-30T04:48:22.210295Z","shell.execute_reply.started":"2026-08-30T04:42:54.943395Z","shell.execute_reply":"2026-08-30T04:48:22.209168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%load_ext tensorboard\n%tensorboard --logdir lightning_logs","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-30T04:40:57.666416Z","iopub.execute_input":"2026-08-30T04:40:57.667040Z","iopub.status.idle":"2026-08-30T04:41:06.241625Z","shell.execute_reply.started":"2026-08-30T04:40:57.666985Z","shell.execute_reply":"2026-08-30T04:41:06.240845Z"}},"outputs":[],"execution_count":null}]}