{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\noriginal_data_dir = \"/kaggle/input/rsna-breast-cancer-detection/\"\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n\ntrain = pd.read_csv(\"{}train.csv\".format(original_data_dir))\ntrain.head()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# image and patient information\nimageIds = train[\"image_id\"].tolist()\npatientIds = pd.unique(train[\"patient_id\"]).tolist()\nprint(\"Number of images:\", len(imageIds))\nprint(\"Number of patients:\", len(patientIds))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nfrom torch.utils.data import Dataset\nfrom torchvision import datasets\nfrom torchvision.transforms import ToTensor\nimport matplotlib.pyplot as plt\n\nimport os\nimport pandas as pd\nfrom torchvision.io import read_image\n\nclass RsnaDataset(Dataset):\n    def __init__(self, img_labels, img_dir, transform=None, target_transform=None, png=True):\n        self.img_labels = img_labels\n        self.img_dir = img_dir\n        self.transform = transform\n        self.target_transform = target_transform\n        self.png = png\n\n    def __len__(self):\n        return len(self.img_labels)\n\n    def __getitem__(self, idx):\n        patient_id = str(self.img_labels.iloc[idx, 0])\n        img_id = str(self.img_labels.iloc[idx, 1])\n        img_path = os.path.join(self.img_dir, patient_id, img_id)\n        if self.png:\n            img_path += \".png\"\n        image = read_image(img_path)\n        label = self.img_labels.iloc[idx, 2]\n        if self.transform:\n            image = self.transform(image)\n        if self.target_transform:\n            label = self.target_transform(label)\n        return image, label","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class GreyscaleToRgb(object):    \n    def __init__(self):\n        pass\n    \n    def __call__(self, image):\n        return torch.cat([image, image, image], dim=0)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Build training dataset object\nfrom torchvision import transforms\n\npreprocess = transforms.Compose([\n    transforms.ConvertImageDtype(torch.float32),\n    GreyscaleToRgb(),\n    transforms.Resize(256),\n    transforms.Normalize((0.0, 0.0, 0.0), (0.5, 0.5, 0.5)),\n])\n\nimage_label_info = train[[\"patient_id\", \"image_id\", \"cancer\"]]\nkaggle_input_dir = \"/kaggle/input/\"\npng_data_dir = \"rsna-mammography-images-as-pngs/images_as_pngs/train_images_processed/\"\ndataset_dir = os.path.join(kaggle_input_dir, png_data_dir)\ntrain_dataset = RsnaDataset(image_label_info, dataset_dir, transform=preprocess)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_dataloader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n\n# Display image and label.\ntrain_features, train_labels = next(iter(train_dataloader))\nprint(f\"Feature batch shape: {train_features.size()}\")\nprint(f\"Labels batch shape: {train_labels.size()}\")\nimg = train_features[0].squeeze().permute(1,2,0)\nlabel = train_labels[0]\nplt.imshow(img)\nplt.show()\nprint(f\"Label: {label}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\nimport torch.nn.functional as F\n\n\nclass Net(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.conv1 = nn.Conv2d(3, 6, 5)\n        self.pool = nn.MaxPool2d(2, 2)\n        self.conv2 = nn.Conv2d(6, 16, 5)\n        self.fc1 = nn.Linear(59536, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 10)\n        self.fc4 = nn.Linear(10, 1)\n\n\n    def forward(self, x):\n        x = self.pool(F.relu(self.conv1(x)))\n        x = self.pool(F.relu(self.conv2(x)))\n        x = torch.flatten(x, 1) # flatten all dimensions except batch\n        x = F.relu(self.fc1(x))\n        x = F.relu(self.fc2(x))\n        x = self.fc3(x)\n        x = self.fc4(x)\n\n        return torch.sigmoid(x).squeeze()\n\n\nnet = Net()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.optim as optim\n\ncriterion = nn.BCELoss()\noptimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(device)\n\nfor epoch in range(10):  # loop over the dataset multiple times\n\n    running_loss = 0.0\n    for i, data in enumerate(train_dataloader, 0):\n        # get the inputs; data is a list of [inputs, labels]\n        inputs, labels = data\n\n        # zero the parameter gradients\n        optimizer.zero_grad()\n\n        # forward + backward + optimize\n        outputs = net(inputs)\n        loss = criterion(outputs, labels.type(torch.FloatTensor))\n        loss.backward()\n        optimizer.step()\n\n        # print statistics\n        running_loss += loss.item()\n        if i % 100 == 99:    # print every 10 mini-batches\n            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 10:.3f}')\n            running_loss = 0.0\n\nprint('Finished Training')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}