{"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":"# !pip install torchvision\nimport random\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nimport os\nimport glob\nimport math\n%matplotlib inline\n#pytorch utility imports\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader , TensorDataset\nfrom torchvision.utils import make_grid\nimport cv2 as cv\n#neural net imports\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.autograd import Variable\nfrom PIL import Image\nfrom torch.utils.data import random_split\nimport torchvision.transforms.functional as TF\nfrom scipy.ndimage import rotate","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# transform1 = transforms.RandomApply(nn.ModuleList(\n#     [\n# #      transforms.ToPILImage(),\n#      transforms.RandomRotation(degrees = 45),\n#      transforms.RandomHorizontalFlip(20),\n# #      transforms.ToTensor(), \n#      transforms.RandomVerticalFlip(20),\n#      transforms.RandomAffine([-45,+45]),\n#      transforms.ColorJitter(0),\n# #      transforms.FiveCrop([3,3]),\n#      transforms.GaussianBlur(5),\n#      transforms.RandomSizedCrop(30)\n    \n# #      transforms.ToTensor()\n# ]),p=0.3)\n# transform = transforms.Compose([\n#     transforms.ToPILImage(),\n#     transform1,\n#     transforms.Resize((128,128))\n# ])\n# class Dataset(torch.utils.data.Dataset):\n#     def __init__(self,img_fol,mask_fol , transform):\n#         self.img_fol=img_fol\n#         self.mask_fol=mask_fol\n#         self.fname=os.listdir(img_fol)\n#         self.name=os.listdir(mask_fol)\n#         self.transform = transform\n#     def __getitem__(self,idx):\n#         name=self.fname[idx]\n#         name1=self.name[idx]\n#         img_name_path=os.path.join(self.img_fol,name)\n#         mask_name_path=os.path.join(self.mask_fol,name1)\n#         img=cv.imread(img_name_path)\n#         img = cv.resize(img , (128 , 128))\n#         img = torch.from_numpy(img)\n#         img = self.transform(img)\n#         img = np.transpose(img , (2,0,1))\n#         mask=cv.imread(mask_name_path)\n#         mask = cv.resize(mask , (128 , 128))\n# #         mask = np.transpose(mask , (2,0,1))\n#         return img, mask[:,:,0]\n\n#     def __len__(self):\n#         return len(self.fname)","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# img_fol = \"../input/forge-dataset/forged_images/images\"\n# mask_fol = \"../input/forge-dataset/forged_images/labels\"\n# for_loader=Dataset(img_fol, mask_fol,transform)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from itertools import chain\n# res = list(chain(*for_loader))\n# res_im =res[0::2]\n# res_lab = res[1::2]\n# res_lab[1].shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_images = res_im[0:int(0.75*len(res_im))]\n# val_images = res_im[int(0.75*len(res_im)):int(0.9*len(res_im))]\n# test_images = res_im[int(0.9*len(res_im)):]\n# train_labels = res_lab[0:int(0.75*len(res_im))]\n# val_labels = res_lab[int(0.75*len(res_im)):int(0.9*len(res_im))]\n# test_labels = res_lab[int(0.9*len(res_im)):]","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #train\n# train_images_tensor = torch.FloatTensor(train_images)/255.0\n# train_labels_tensor = torch.FloatTensor(train_labels)/255.0\n# train_tensor = TensorDataset(train_images_tensor, train_labels_tensor)\n\n# #val\n# val_images_tensor = torch.FloatTensor(val_images)/255.0\n# val_labels_tensor = torch.FloatTensor(val_labels)/255.0\n# val_tensor = TensorDataset(val_images_tensor, val_labels_tensor)\n\n# #test\n# test_images_tensor = torch.FloatTensor(test_images)/255.0\n# test_labels_tensor = torch.FloatTensor(test_labels)/255.0\n# test_tensor = TensorDataset(test_images_tensor, test_labels_tensor)","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_loader = DataLoader(train_tensor, batch_size=64, num_workers=32, shuffle=True)\n# val_loader = DataLoader(val_tensor, batch_size=64, num_workers=32, shuffle=True)\n# test_loader = DataLoader(test_tensor, batch_size=64, num_workers=32, shuffle=False)","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = [] ;lab = []; \nblock_size , size , ss = 128 , 256 , 64\nblock_im = [];block_lab = []\npath = \"../input/forggy-dataset/forged_images\"\nfor fname in sorted(os.listdir(path)):\n    if fname.endswith(\"copy.png\"):\n        im = np.array(Image.open(\"../input/forggy-dataset/forged_images/\"+fname))\n        im = cv.resize(im , (size,size))\n        im = np.transpose(im , (2,0,1))\n#         for r in range(0,im.shape[1]-ss , ss):\n#             for c in range(0,im.shape[2]-ss , ss):\n#                 window = im[:,r:r+block_size , c:c+block_size]\n        block_im.append(im)\n    else:\n        label = np.array(Image.open(\"../input/forggy-dataset/forged_images/\"+fname))\n        label = cv.resize(label , (size,size))\n#         for r in range(0,label.shape[0]-ss , ss):\n#             for c in range(0,label.shape[1]-ss , ss):\n#                 window = label[r:r+block_size,c:c+block_size]\n        block_lab.append(label)\ndef a():\n    return 0.9\ntrain_im = block_im[0:int(0.9*len(block_im))]\ntest_images = block_im[int(0.9*len(block_im)):]\ntrain_lab = block_lab[0:int(0.9*len(block_lab))]\ntest_labels = block_lab[int(0.9*len(block_lab)):]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images = [];train_labels = []\nfor i in range(len(train_im)):\n    if True:#np.sum(train_lab[i])>1000000:\n        train_images.append(train_im[i])\n        train_labels.append(train_lab[i])\nnp.random.seed(5)\nnp.random.shuffle(train_images)\nnp.random.seed(5)\nnp.random.shuffle(train_labels)  ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_images)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def random_crop(img,lab):\n    w, h = img.shape[1] , img.shape[2]  \n    crop_size = 100\n    x, y = np.random.randint(h-crop_size), np.random.randint(w-crop_size)\n    img = img[:,y:y+crop_size, x:x+crop_size]\n    lab = lab[y:y+crop_size, x:x+crop_size]\n    img = np.transpose(cv.resize(np.transpose(img,(1,2,0)) , (size , size)),(2,0,1))\n    lab = cv.resize(lab , (size , size))\n    img = 255.0*(img/255.0)\n    lab = 255.0*(lab/255.0)\n    return img , lab\n\ndef random_pad(img,lab):\n    w, h = img.shape[1] , img.shape[2]\n    crop_size = 80\n    pad = np.zeros((img.shape[0],w+2*crop_size,h+2*crop_size))\n    pad_lab = np.zeros((w+2*crop_size,h+2*crop_size))\n    pad[:,crop_size:w+crop_size,crop_size:h+crop_size]= img\n    pad_lab[crop_size:w+crop_size,crop_size:h+crop_size]= lab\n    img = np.transpose(cv.resize(np.transpose(pad,(1,2,0)) , (size , size)),(2,0,1))\n    lab = cv.resize(pad_lab , (size , size))\n    img = 255.0*(img/255.0)\n    lab = 255.0*(lab/255.0)\n    return img , lab\n\ndef random_erase(img,lab):\n    w, h = img.shape[1] , img.shape[2]\n    crop_size = 20\n    x, y = np.random.randint(h-crop_size), np.random.randint(w-crop_size)\n    img[:,y:y+crop_size, x:x+crop_size]= 1\n    img = np.transpose(cv.resize(np.transpose(img,(1,2,0)) , (size , size)),(2,0,1))\n    img = 255.0*(img/255.0)\n    lab = 255.0*(lab/255.0)\n    return img , lab\n\ndef sharpen(img , mask):\n    kernel = np.array([[-1,-1,-1], \n                       [-1, 9,-1],\n                       [-1,-1,-1]])\n    img = cv.filter2D(img, -1, kernel)\n    mask = 255.0*(mask-np.min(mask))/np.max(mask-np.min(mask))\n    return img , mask\n    \n\ndef gauss_noise(img , lab):\n    mean = random.uniform(5,7)\n    sigma = random.uniform(10,12)\n    crop_size = 40\n    w, h = img.shape[1] , img.shape[2]\n    x, y = np.random.randint(h-crop_size), np.random.randint(w-crop_size)\n    img1 = img[:,y:y+crop_size, x:x+crop_size]\n    noise = np.random.normal(mean, sigma, (3,crop_size,crop_size))\n    mask_overflow_upper = img1+noise >= 255.0\n    mask_overflow_lower = img1+noise < 0\n    noise[mask_overflow_upper] = 255.0\n    noise[mask_overflow_lower] = 0\n    img1 += noise\n    img[:,y:y+crop_size, x:x+crop_size]=img1\n    img = 255.0*(img/255.0)\n    lab = 255.0*(lab/255.0)\n    return img , lab \n\ndef rotate_img(img, mask):\n    angle = random.uniform(-90 , 90)\n    img = rotate(np.transpose(img,(1,2,0)), angle)\n    mask = cv.resize(rotate(mask, angle) , (size , size))\n    img = np.transpose(cv.resize((img) , (size , size)),(2,0,1))\n    mask = 255.0*(mask-np.min(mask))/np.max(mask-np.min(mask))\n    return img , mask\n\ndef chng_contrast(img , mask):\n    brightness = random.randint(20,100)/255\n    contrast = random.randint(30,70)/255\n    img = np.int16(img)\n    img = img * (contrast/0.5+1) - contrast + brightness\n    img = np.clip(img, 0, 1)\n    img = np.uint8(img)\n    mask = 255.0*(mask/255.0)\n    return img , mask\n\n\ndef data_aug(im , lab):\n    aug_im= [];aug_lab=[]\n#     # 90 deg Rotation\n#     res_im = np.rot90(im ,1, (1,2))\n#     res_lab = np.rot90(lab,1,(0,1))\n#     aug_im.append(res_im);aug_lab.append(res_lab)\n#     # flip left \n#     res_im = np.fliplr(np.transpose(im,(1,2,0)));\n#     res_lab = np.fliplr(lab);\n#     aug_im.append(np.transpose(res_im,(2,0,1)));\n#     aug_lab.append(res_lab)\n    # random crop & random noise\n    for j in range(2):\n        i , l = random_pad(im,lab)\n#         i3 , l3 = sharpen(im,lab)\n        if True:#(size**2-np.sum(l==0))/(size**2)>0.3 and (size**2-np.sum(l==0))/(size**2)<0.4:\n            aug_im.append(i);aug_lab.append(l)\n#         if True:#(size**2-np.sum(l3==0))/(size**2)>0.3 and (size**2-np.sum(l3==0))/(size**2)<0.4 :\n#             aug_im.append(i3);aug_lab.append(l3)\n    i , l = 0 , 0\n    i2 , l2 = 0 , 0\n    for j in range(4):\n        i , l = random_crop(im,lab)\n        i2 ,l2 = rotate_img(im,lab)\n        if True:#(size**2-np.sum(l==0))/((size**2))>0.3 and (size**2-np.sum(l==0))/((size**2))<0.4 :\n            aug_im.append(i);aug_lab.append(l)\n        if True:#(size**2-np.sum(l2==0))/((size**2))>0.3 and(size**2-np.sum(l2==0))/((size**2))<0.4 :\n            aug_im.append(i2);aug_lab.append(l2)\n    return aug_im, aug_lab\n    \nimag=train_images;labe=train_labels\nfor j in range(len(train_images)):\n    if True:#(size**2-np.sum(train_labels[j]==0))/((size**2))>0.3 and (size**2-np.sum(train_labels[j]==0))/((size**2))<0.4 :\n        i,l = data_aug(train_images[j] ,train_labels[j])\n        imag = imag + i \n        labe = labe + l\ntrain_im = []; train_lab = []","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(imag)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train\ntrain_images_tensor = torch.FloatTensor(imag)/255.0\ntrain_labels_tensor = torch.FloatTensor(labe)/255.0\ntrain_tensor = TensorDataset(train_images_tensor, train_labels_tensor)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#test\ntest_images_tensor = torch.FloatTensor(test_images)/255.0\ntest_labels_tensor = torch.FloatTensor(test_labels)/255.0\ntest_tensor = TensorDataset(test_images_tensor, test_labels_tensor)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = DataLoader(train_tensor, batch_size=32, num_workers=32, shuffle=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loader = DataLoader(test_tensor, batch_size=32, num_workers=32, shuffle=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def init_weights(m):\n    if isinstance(m, nn.Conv2d):\n        m.weight.data.normal_(0.0, 0.01)\n    elif isinstance(m, nn.BatchNorm2d):\n        m.weight.data.normal_(0.0, 0.005)\n        m.bias.data.fill_(0)\n    \nclass Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()        \n        self.n1 = nn.Conv2d(3, 8, kernel_size=3, stride=1, padding=1)\n        self.n2 = nn.BatchNorm2d(8)\n        self.n3 = nn.ReLU(inplace=True)\n        self.n4 = nn.Conv2d(8, 16, kernel_size=5, stride=1, padding=2)\n        self.n5 = nn.BatchNorm2d(16)\n        self.n6 = nn.ReLU(inplace=True)\n        self.n7 = nn.Dropout(p=0.4)\n        self.n8 = nn.MaxPool2d(kernel_size=2, stride=2 , return_indices=True)\n        self.n9 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)\n        self.n10 = nn.BatchNorm2d(32)\n        self.n11 = nn.ReLU(inplace=True)\n        self.n12 = nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2)\n        self.n13 = nn.BatchNorm2d(64)\n        self.n14 = nn.ReLU(inplace=True)\n        self.n15 = nn.MaxPool2d(kernel_size=2, stride=2 , return_indices=True)\n        self.n16 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)\n        self.n17 = nn.BatchNorm2d(128)\n        self.n18 = nn.ReLU(inplace=True)\n        self.n19 = nn.Dropout(p=0.4)\n        self.n20 = nn.Conv2d(128, 256, kernel_size=5, stride=1, padding=2)\n        self.n21 = nn.BatchNorm2d(256)\n        self.n22 = nn.ReLU(inplace=True)\n        self.n23 = nn.MaxPool2d(kernel_size=2, stride=2 , return_indices=True)\n\n        self.n24 = nn.MaxUnpool2d(kernel_size=2, stride=2)\n        self.n25 = nn.ConvTranspose2d(256, 128, kernel_size=5, stride=1, padding=2)\n        self.n26 = nn.BatchNorm2d(128)\n        self.n27 = nn.ReLU(inplace=True)\n        self.n28 = nn.Dropout(p=0.4)\n        self.n29 = nn.ConvTranspose2d(128, 64, kernel_size=3, stride=1, padding=1)\n        self.n30 = nn.BatchNorm2d(64)\n        self.n31 = nn.ReLU(inplace=True)\n        self.n32 = nn.MaxUnpool2d(kernel_size=2, stride=2)\n        self.n33 = nn.ConvTranspose2d(64, 32, kernel_size=5, stride=1, padding=2)\n        self.n34 = nn.BatchNorm2d(32)\n        self.n35 = nn.ReLU(inplace=True)\n        self.n36 = nn.Dropout(p=0.4)\n        self.n37 = nn.ConvTranspose2d(32, 16, kernel_size=3, stride=1, padding=1)\n        self.n38 = nn.BatchNorm2d(16)\n        self.n39 = nn.ReLU(inplace=True)\n        self.n40 = nn.MaxUnpool2d(kernel_size=2, stride=2)\n        self.n41 = nn.ConvTranspose2d(16, 8, kernel_size=5, stride=1, padding=2)\n        self.n42 = nn.BatchNorm2d(8)\n        self.n43 = nn.ReLU(inplace=True)\n        self.n44 = nn.ConvTranspose2d(8, 2, kernel_size=3, stride=1, padding=1)\n        self.n45 = nn.BatchNorm2d(2)\n        self.n46 = nn.ReLU(inplace=True)\n        \n    def forward(self, x):\n        x = self.n1(x)\n        x = self.n2(x)\n        x = self.n3(x)\n        x = self.n4(x)\n        x = self.n5(x)\n        x = self.n6(x)\n        x = self.n7(x)\n        x , y1 = self.n8(x)\n        x = self.n9(x)\n        x = self.n10(x)\n        x = self.n11(x)\n        x = self.n12(x)\n        x = self.n13(x)\n        x = self.n14(x)\n        x ,y2 = self.n15(x)\n        x = self.n16(x)\n        x = self.n17(x)\n        x = self.n18(x)\n        x = self.n19(x)\n        x = self.n20(x)\n        x = self.n21(x)\n        x = self.n22(x)\n        x ,y3 = self.n23(x)\n\n        x = self.n24(x,y3)\n        x = self.n25(x)\n        x = self.n26(x)\n        x = self.n27(x)\n        x = self.n28(x)\n        x = self.n29(x)\n        x = self.n30(x)\n        x = self.n31(x)\n        x = self.n32(x,y2)\n        x = self.n33(x)\n        x = self.n34(x)\n        x = self.n35(x)\n        x = self.n36(x)\n        x = self.n37(x)\n        x = self.n38(x)\n        x = self.n39(x)\n        x = self.n40(x,y1)\n        x = self.n41(x)\n        x = self.n42(x)\n        x = self.n43(x)\n        x = self.n44(x)\n        x = self.n45(x)\n        x = self.n46(x)\n#         x = F.softmax(x)\n#         y1 = F.softmax(x,dim=1)\n#         y1 = torch.ge(x,0.5).type(torch.FloatTensor)\n        return x ","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def cross_entropy2d(input, target, weight=None, size_average=True):\n    n, c, h, w = input.size()\n    nt, ht, wt = target.size()\n\n    # n, c, h, w -> n, h, c, w -> n, h, w, c\n\n    input = input.transpose(1, 2).transpose(2, 3).contiguous().view(-1, c) # -> shape: (X, c)\n    target = target.view(-1)\n    loss = F.cross_entropy(\n        input, target, weight=weight, size_average=size_average, ignore_index=250\n    )\n    return loss","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"net = Net()\nnet.apply(init_weights)\noptimizer = optim.Adam(params=net.parameters(), lr=0.01)\ncriterion = nn.CrossEntropyLoss()\n# criterion = CrossEntropy()\nexp_lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min')","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_model(num_epoch):\n    net.train()\n    train_loss = 0\n    for batch_idx, (data, target) in enumerate(train_loader):\n\n        data, target = data, target\n        optimizer.zero_grad()\n        output = net(data)\n#         print(output.shape , torch.max(target))\n        loss  = cross_entropy2d(output , target.long())\n        lo= loss.item()\n        loss.backward()\n        optimizer.step()\n        \n        print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n            num_epoch, (batch_idx + 1) * len(data), len(train_loader.dataset),\n            100. * (batch_idx + 1) / len(train_loader), lo))\n    exp_lr_scheduler.step()\n # def evaluate(data_loader):\n#     net.eval()\n# #     loss_func = DiceLoss()\n#     loss = 0\n#     correct = 0\n#     for data, target in data_loader:\n#         data, target = data, target\n        \n#         output = net(data)\n#         lossy  , iny , out=  cross_entropy2d(output, target.long())\n#         loss+=lossy.item()\n\n#     loss /= len(data_loader.dataset)\n        \n#     print('\\nAverage Val Loss: {:.4f} '.format(loss ))","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_epochs = 80\n\nfor n in range(num_epochs):\n    print(f\"{n+1}\")\n    train_model(n)\n#     evaluate(val_loader)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(net.state_dict(), 'Model.pth')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"net = Net()\nnet.load_state_dict(torch.load(\"../input/model-1/Model.pth\"))\nnet.eval()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_predictions(data_loader):\n    net.eval()\n    data = next(iter(data_loader))\n    data1 = torch.tensor(data[0] , dtype = torch.float32)\n    data2 = torch.tensor(data[1] , dtype = torch.float32)\n    print(data1.shape)\n    output = net(data1)\n#     output = torch.ge(output,0.5).type(torch.FloatTensor)\n    output = torch.mean(output , dim =1)\n#     output = torch.max(output,dim=1)[0]\n#     output = torch.reshape(output  , (output.shape[0] , 128 , 128))\n    return output , data1 , data2","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_set_preds , data1 , data2  = make_predictions(test_loader)\nprint(test_set_preds.shape)","metadata":{"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# der = next(iter(test_loader))\n# cc = np.array(data1[0].detach().numpy())\nn = 4\nplt.figure(figsize=(20,20))\nplt.subplot(3,2,1)\nplt.imshow(np.transpose(data1[n],(1,2,0)))\nplt.subplot(3,2,3)\ncc1 = ((np.array(data2[n])))\nplt.imshow((cc1))\nplt.subplot(3,2,5)\ngg = np.array(test_set_preds[n,:,:].detach().numpy())\nplt.imshow(gg,cmap = 'jet')\nplt.subplot(3,2,2)\ncc1 = np.array(np.transpose(data1[n+3],(1,2,0)))\nplt.imshow((cc1))\nplt.subplot(3,2,4)\ncc1 = np.array((data2[n+3]))\nplt.imshow((cc1))\nplt.subplot(3,2,6)\ngg3 = np.array(test_set_preds[n+3,:,:].detach().numpy())\nplt.imshow(gg3,cmap = 'jet')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data2[0].shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# np.unique(gg) , np.unique(cc) , np.unique(gg2) , np.unique(cc1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}