{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"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\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\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","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings('ignore')\n\ntrain=pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\n# PassengerId=test['PassengerId']\nall_data = pd.concat([train], ignore_index = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"train.head(20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport cv2\n\nimg = cv2.imread('../input/cassava-leaf-disease-classification/train_images/1003442061.jpg')\n\ngrey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\nblur = cv2.GaussianBlur(grey,(3,3),cv2.BORDER_DEFAULT)\nimg2 = cv2.cvtColor(blur, cv2.COLOR_GRAY2RGB)\n\nplt.imshow(img2)\nprint(img2.shape, img.shape)\n# plt.figure()\n# for i in range(1,32):\n#     plt.subplot(4,8,i)\n#     plt.imshow(img_test[i-1])\n# plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nimport torchvision\nimport torchvision.transforms as transforms\nimport torchvision.datasets as datasets\n\nfrom torch.utils.tensorboard import SummaryWriter\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torch.utils.data import Dataset\n\nclass customDatasets(Dataset):\n    def __init__(self, csv_file, root_dir, transform=None):\n        self.annotations = pd.read_csv(csv_file)\n        self.root_dir = root_dir\n        self.transform = transform\n        \n    \n    def __len__(self):\n        return len(self.annotations)\n    \n    def __getitem__(self, index):\n        img_path = os.path.join(self.root_dir, self.annotations.iloc[index, 0])\n        image = cv2.imread(img_path)\n        \n#         grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n#         blur = cv2.GaussianBlur(grey,(5,5),cv2.BORDER_DEFAULT)\n#         image = cv2.cvtColor(blur, cv2.COLOR_GRAY2RGB)        \n\n        y_label = torch.tensor(int(self.annotations.iloc[index, 1]))\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return (image, y_label)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# transforms\ntrain_transforms = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.Resize(256),\n    # transforms.RandomResizedCrop(224,scale=(0.5,1.0)),\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.transforms as transforms\nimport torchvision\nfrom torch.utils.data import DataLoader\nimport torch.nn.functional as F\nimport cv2\n\n# Hyperparameters\nin_channel = 3\nnum_classes = 5\nlearning_rate = 0.1\nbatch_size = 32\nnum_epochs = 5\n\n# Load Data\ndataset = customDatasets(\n    csv_file='../input/cassava-leaf-disease-classification/train.csv'\n    , root_dir='../input/cassava-leaf-disease-classification/train_images'\n    , transform=train_transforms\n)\n\n# 21397\nval_set, test_set, train_set = torch.utils.data.random_split(dataset, [2000, 100, 19297])\n\nval_loader = DataLoader(dataset=val_set, batch_size=batch_size, shuffle=True)\ntrain_loader = DataLoader(dataset=train_set, batch_size=batch_size, shuffle=True)\ntest_loader = DataLoader(dataset=test_set, batch_size=batch_size, shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_num_correct(preds, labels):\n    return preds.argmax(dim=1).eq(labels).sum().item()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"network = torchvision.models.densenet161(pretrained=True)\nnetwork.classifier.out_features = num_classes\ndevice = torch.device('cuda')\nfor param in network.parameters():\n    param.requires_grad = False\n    \nnetwork.classifier = nn.Linear(in_features=2208, out_features=5, bias=True)\nnetwork","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Network(nn.Module):\n    def __init__(self):\n        super(Network, self).__init__()\n        self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5)\n        self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)\n        \n        self.fc1 = nn.Linear(in_features=12*197*147, out_features=120)\n        self.fc2 = nn.Linear(in_features=120, out_features=60)        \n        self.out = nn.Linear(in_features=60, out_features=5)\n        \n    def forward(self, t):\n        #implement the forward pass\n        # (1) input layer\n        t = t\n        \n        # (2) hidden conv layer\n        t = self.conv1(t)\n        t = F.relu(t)\n        t = F.max_pool2d(t, kernel_size=2, stride=2)\n        \n        # (3) hidden conv layer\n        t = self.conv2(t)\n        t = F.relu(t)\n        t = F.max_pool2d(t, kernel_size=2, stride=2)\n        \n        # (4) hidden linear layer\n#         print('before: ', t.shape)\n        t = t.reshape(-1, 12 * 197 * 147)\n#         print('after: ', t.shape)\n        t = self.fc1(t)\n        t = F.relu(t)\n        \n        # (5) hidden linear layer\n        t = self.fc2(t)\n        t = F.relu(t)\n        \n        # (6) output layer\n        t = self.out(t)\n        \n        return t","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"loss_function = nn.CrossEntropyLoss()\noptimizer = optim.Adam(network.parameters(), lr=0.001)\n\ndef train_(net, epoch, loader, tb):\n    batch_num = 0\n    print(\"start epoch \", epoch)\n    for batch in loader:\n        images = batch[0].to(device)\n        labels = batch[1].to(device)\n\n        optimizer.zero_grad()\n\n        \n        if hasattr(torch.cuda, 'empty_cache'):\n            torch.cuda.empty_cache()#释放无关内存\n        \n        preds = net(images)\n        loss = F.cross_entropy(preds, labels)\n        loss = loss.requires_grad_()\n        loss.backward()\n        optimizer.step()\n\n    tb.add_scalar('Accuracy', total_correct / len(train_set), epoch)\n\n    tb.add_histogram('conv1.bias', net.conv1.bias, epoch)\n    tb.add_histogram('conv1.weight', net.conv1.weight, epoch)\n    tb.add_histogram('conv1.weight.grad', net.conv1.weight.grad, epoch)\n\n    \ndef test_(net, tb):\n    total_loss = 0\n    correct = 0;\n    with torch.no_grad():\n        for batch in test_loader:\n\n            images = batch[0].to(device)\n            labels = batch[1].to(device)\n            optimizer.zero_grad()\n            if hasattr(torch.cuda, 'empty_cache'):\n                torch.cuda.empty_cache()#释放无关内存\n\n            preds = net(images)\n            loss = F.cross_entropy(preds, labels)\n            preds = preds.max(1, keepdim=True)[1]\n            total_loss += float(loss)\n            correct += preds.eq(labels.view_as(preds)).sum().item()\n            \n        tb.add_scalar('Loss', total_loss, epoch)\n        tb.add_scalar('Number Correct', total_correct, epoch)\n\n        print(\"test: \")\n        print(\"accuracy: \", 100 * correct / len(test_set), \" loss: \", total_loss)\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntorch.cuda.empty_cache()#释放无关内存\n\ntorch.cuda.memory_allocated(device)\n# torch.cuda","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"network = network.to(device)\n\ntb = SummaryWriter()\n\nimages, labels = next(iter(val_loader))\ngrid = torchvision.utils.make_grid(images)\n\ntb.add_image('images', grid)\n# tb.add_graph(network, images)\n\nfor epoch in range(1):\n    train_(network, epoch, train_loader, tb)\n    test_(network, tb)\n    \ntb.close()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip\n!unzip ngrok-stable-linux-amd64.zip\nLOG_DIR = '../input/cassava-leaf-disease-classification/train_images' # 这里你需要输入tensorboard需要观察的文件名\nget_ipython().system_raw(\n    'tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'\n    .format(LOG_DIR)\n)\nget_ipython().system_raw('./ngrok http 6006 &')\n! curl -s http://localhost:4040/api/tunnels | python3 -c \\\n    \"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])\"","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}