{"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":"%matplotlib inline\nimport matplotlib\nimport matplotlib.pyplot as plt\nfrom IPython import display\nfrom IPython.display import Image\nplt.rcParams.update({'figure.figsize': [8,10]})\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-06-08T17:09:22.588184Z","iopub.execute_input":"2022-06-08T17:09:22.588536Z","iopub.status.idle":"2022-06-08T17:09:22.618234Z","shell.execute_reply.started":"2022-06-08T17:09:22.588445Z","shell.execute_reply":"2022-06-08T17:09:22.617300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 100種高粱品種識別","metadata":{}},{"cell_type":"code","source":"import time\nimport glob\nimport os\nimport math\nimport cv2\nimport builtins\nimport copy\nos.environ['TRIDENT_BACKEND'] = 'pytorch'\nos.environ['TRIDENT_HOME'] = './trident'\n\n!pip uninstall tridentx -y\n!pip install ../input/trident/tridentx-0.7.5-py3-none-any.whl --upgrade","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:22.620358Z","iopub.execute_input":"2022-06-08T17:09:22.620879Z","iopub.status.idle":"2022-06-08T17:09:36.004050Z","shell.execute_reply.started":"2022-06-08T17:09:22.620840Z","shell.execute_reply":"2022-06-08T17:09:36.003027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import trident as T\nfrom trident import *\nfrom trident.models import efficientnet\n","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:36.007869Z","iopub.execute_input":"2022-06-08T17:09:36.008125Z","iopub.status.idle":"2022-06-08T17:09:40.565121Z","shell.execute_reply.started":"2022-06-08T17:09:36.008093Z","shell.execute_reply":"2022-06-08T17:09:40.564144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\ndf=pd.read_csv('../input/sorghum-id-fgvc-9/train_cultivar_mapping.csv').dropna()\ndf","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:40.568067Z","iopub.execute_input":"2022-06-08T17:09:40.568598Z","iopub.status.idle":"2022-06-08T17:09:40.632294Z","shell.execute_reply.started":"2022-06-08T17:09:40.568555Z","shell.execute_reply":"2022-06-08T17:09:40.631338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classnames=df.cultivar.unique().tolist()\nclassnames=list(sorted(classnames))\nprint(classnames)","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:40.634227Z","iopub.execute_input":"2022-06-08T17:09:40.635001Z","iopub.status.idle":"2022-06-08T17:09:40.643178Z","shell.execute_reply.started":"2022-06-08T17:09:40.634958Z","shell.execute_reply":"2022-06-08T17:09:40.642096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nall_images=glob.glob('../input/sorghum-id-fgvc-9/train_images/*.*g')\nprint(len(all_images))\n\nimages=[]\nlabels=[]\n\nfor index, row in df.iterrows():\n    impath='../input/sorghum-id-fgvc-9/train_images/'+row['image']\n    if impath in all_images:\n        images.append(impath)\n        labels.append(classnames.index(row['cultivar']))\n        \nprint(len(images))\nprint(len(labels))\n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:40.645134Z","iopub.execute_input":"2022-06-08T17:09:40.645456Z","iopub.status.idle":"2022-06-08T17:09:49.046875Z","shell.execute_reply.started":"2022-06-08T17:09:40.645399Z","shell.execute_reply":"2022-06-08T17:09:49.045882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\nimport numpy as np\ncl=CLAHE()\ndef multi_scale_colors(img,spec=None):\n    #print(img.shape)\n    \n    img=cl(img)\n    img1=cv2.resize(img.copy(),(240,240))\n    \n \n    idx=random.choice(list(range(4)))\n    #print('idx:',idx,'{0}:{1},{2}:{3}'.format((idx//2)*512,(idx//2+1)*512,(idx%2)*512,(idx%2+1)*512))\n    crop_image=img.copy()[(idx//2)*512:(idx//2+1)*512,(idx%2)*512:(idx%2+1)*512,:]\n    #print(crop_image.shape)\n    img2=cv2.resize(crop_image,(240,240), interpolation=cv2.INTER_AREA)\n    \n    idxes=random.choices(list(range(16)),k=4)\n    #print('idxes:',idxes)\n    img3=cv2.resize(img.copy()[(idxes[0]//4)*256:(idxes[0]//4+1)*256,(idxes[0]%4)*256:(idxes[0]%4+1)*256,:],(240,240), interpolation=cv2.INTER_AREA)\n    img4=cv2.resize(img.copy()[(idxes[1]//4)*256:(idxes[1]//4+1)*256,(idxes[1]%4)*256:(idxes[1]%4+1)*256,:],(240,240), interpolation=cv2.INTER_AREA)\n    \n    img5=cv2.cvtColor(cv2.resize(img.copy()[(idxes[2]//4)*256:(idxes[2]//4+1)*256,(idxes[2]%4)*256:(idxes[2]%4+1)*256,:],(240,240), interpolation=cv2.INTER_AREA),cv2.COLOR_RGB2HSV)\n    img9=cv2.cvtColor(cv2.resize(img.copy()[(idxes[3]//4)*256:(idxes[3]//4+1)*256,(idxes[3]%4)*256:(idxes[3]%4+1)*256,:],(240,240), interpolation=cv2.INTER_AREA),cv2.COLOR_BGR2YCR_CB)\n    \n    idxes=random.choices(list(range(64)),k=3)\n    img6=cv2.resize(img.copy()[(idxes[0]//8)*128:(idxes[0]//8+1)*128,(idxes[0]%8)*128:(idxes[0]%8+1)*128,:],(240,240), interpolation=cv2.INTER_AREA)\n    img7=cv2.resize(img.copy()[(idxes[1]//8)*128:(idxes[1]//8+1)*128,(idxes[1]%8)*128:(idxes[1]%8+1)*128,:],(240,240), interpolation=cv2.INTER_AREA)\n    idx=random.choice(list(range(64)))\n    img8=cv2.cvtColor(cv2.resize(img.copy()[(idxes[2]//8)*128:(idxes[2]//8+1)*128,(idxes[2]%8)*128:(idxes[2]%8+1)*128,:],(240,240), interpolation=cv2.INTER_AREA),cv2.COLOR_RGB2HSV)\n    image_lists=[img1,img2,img3,img4,img5,img6,img7,img8,img9]\n    random.shuffle(image_lists)\n    new_img=np.concatenate([np.concatenate(image_lists[0:3],axis=1),np.concatenate(image_lists[3:6],axis=1),np.concatenate(image_lists[6:9],axis=1)],axis=0)\n    \n    return new_img\n\n\n\n    \ndisplay.display(array2image(multi_scale_colors(cl(image2array('../input/sorghum-id-fgvc-9/train_images/2017-06-01__10-26-27-479.png').astype(np.uint8)))))\n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:49.048577Z","iopub.execute_input":"2022-06-08T17:09:49.048890Z","iopub.status.idle":"2022-06-08T17:09:49.584585Z","shell.execute_reply.started":"2022-06-08T17:09:49.048848Z","shell.execute_reply":"2022-06-08T17:09:49.583763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds1=ImageDataset(images,object_type=ObjectType.rgb,symbol='images')\nds2=LabelDataset(labels,object_type=ObjectType.classification_label,symbol='labels')\n\nds2.binding_class_names(class_names=classnames)\nprint(ds2.class_names)\ndata_provider=DataProvider(traindata=Iterator(data=ds1,label=ds2,batch_size=4))\n\n\ndata_provider.image_transform_funcs = [\n    RandomTransform(rotation_range=45, zoom_range=(0.9,1.2), shift_range=0.05, shear_range=0.1, random_flip=0.2,keep_prob=0.3,border_mode='zero'), \n    RandomAdjustGamma(gamma_range=(0.6,1.1)),\n    RandomAdjustSaturation(value_range=(0.8, 1.6)),\n    RandomAdjustContrast(value_range=(0.8, 1.4)),\n    multi_scale_colors,\n    AutoLevel(),\n    SaltPepperNoise(prob=0.002),  # 椒鹽噪音\n    Normalize(127.5, 127.5)]","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:49.585803Z","iopub.execute_input":"2022-06-08T17:09:49.586047Z","iopub.status.idle":"2022-06-08T17:09:51.353487Z","shell.execute_reply.started":"2022-06-08T17:09:49.586019Z","shell.execute_reply":"2022-06-08T17:09:51.352718Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_provider2=DataProvider(traindata=Iterator(data=ds1,label=ds2,batch_size=3))\n\n\ndata_provider2.image_transform_funcs = [\n    AutoLevel(),\n    multi_scale_colors,\n    Normalize(127.5, 127.5)]","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:51.356484Z","iopub.execute_input":"2022-06-08T17:09:51.356821Z","iopub.status.idle":"2022-06-08T17:09:51.395010Z","shell.execute_reply.started":"2022-06-08T17:09:51.356783Z","shell.execute_reply":"2022-06-08T17:09:51.394247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def space_to_depth(x:np.ndarray, block_size=3):\n    sq_size=block_size*block_size\n    \n    if len(x.shape)==4 and  x.shape[1]==3:\n        new_tensors=[]\n        for i in range(x.shape[0]):\n            new_tensors.append(space_to_depth(x[i]))\n        new_tensors=stack(new_tensors,axis=0)\n            \n    elif len(x.shape)==3:  \n        new_tensors=[]\n        if len(x.shape)==3 and x.shape[0]>x.shape[-1]:\n            x=x.transpose([2,0,1])\n        for i in range(block_size*block_size):\n            new_tensors.append(x[:,(i//block_size)*240:(i//block_size+1)*240,(i%block_size)*240:(i%block_size+1)*240])\n            \n        new_tensors=stack(new_tensors,axis=0)\n    return new_tensors\n        \n\n\narr=multi_scale_colors(cl(image2array('../input/sorghum-id-fgvc-9/train_images/2017-06-01__10-26-27-479.png').astype(np.uint8)))\nprint(arr.shape)\narr=space_to_depth(to_tensor(image_backend_adaption(arr)), block_size=3)\nprint(arr.shape)\n# arr1=space_to_depth(to_tensor(image_backend_adaption(arr)), block_size=3)\n# print(arr0.shape)\ndisplay.display(array2image(to_numpy(arr)[0].transpose([1,2,0]).astype(np.uint8)))\n","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:51.396591Z","iopub.execute_input":"2022-06-08T17:09:51.396886Z","iopub.status.idle":"2022-06-08T17:09:51.543509Z","shell.execute_reply.started":"2022-06-08T17:09:51.396845Z","shell.execute_reply":"2022-06-08T17:09:51.542635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_provider.preview_images()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:51.544921Z","iopub.execute_input":"2022-06-08T17:09:51.545326Z","iopub.status.idle":"2022-06-08T17:09:53.177311Z","shell.execute_reply.started":"2022-06-08T17:09:51.545289Z","shell.execute_reply":"2022-06-08T17:09:53.176599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#_images,_labels=data_provider.next()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:53.178544Z","iopub.execute_input":"2022-06-08T17:09:53.179252Z","iopub.status.idle":"2022-06-08T17:09:53.182957Z","shell.execute_reply.started":"2022-06-08T17:09:53.179213Z","shell.execute_reply":"2022-06-08T17:09:53.182393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport gc\ntorch.cuda.synchronize()\ntorch.cuda.empty_cache()\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:53.184085Z","iopub.execute_input":"2022-06-08T17:09:53.184943Z","iopub.status.idle":"2022-06-08T17:09:53.366661Z","shell.execute_reply.started":"2022-06-08T17:09:53.184905Z","shell.execute_reply":"2022-06-08T17:09:53.365825Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TanhExp(Layer):\n\n    def __init__(self,keep_output=False, name=None):\n        super(TanhExp, self).__init__(keep_output=keep_output,name=name)\n        self._built = True\n\n    def forward(self, x, **kwargs):\n\n        return clip(x*torch.tanh(torch.exp(x)),-2,2)\n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:53.368372Z","iopub.execute_input":"2022-06-08T17:09:53.368877Z","iopub.status.idle":"2022-06-08T17:09:53.376139Z","shell.execute_reply.started":"2022-06-08T17:09:53.368836Z","shell.execute_reply":"2022-06-08T17:09:53.375371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n    \nclass SorghumNetV1(Layer):\n    def __init__(self, n_classes=100):\n        super(SorghumNetV1, self).__init__()\n        \n        _effb1=efficientnet.EfficientNetB1(pretrained=True,input_shape=(3,240,240),include_top=False)\n        _effb1.model.top_conv.trainable=True\n        _effb1.model.block7b.trainable=True\n        _effb1.model.block7b.dropout_rate=0.2\n        _effb1.model.top_conv.activation=TanhExp()\n\n        self.n_classes=n_classes\n        self.backbone =_effb1.model\n        self.agg=Sequential(\n            Reshape((9,1280, 8, 8)),\n            Aggregation(mode='mean',axis=1,keepdims=False),\n            SeparableConv2d_Block((3,3),depth_multiplier=1,strides=1,auto_pad=True,use_bias=False,activation=TanhExp(),normalization='bn'),\n            GlobalAvgPool2d(),\n        )\n\n        self.decoder=Dense(n_classes,activation=SoftMax())\n     \n    def forward(self, x):\n        new_x=space_to_depth(x, block_size=3)\n        B,N,C,H,W=new_x.shape\n        new_x=new_x.reshape((B*N,C,H,W))\n    \n        return self.decoder(self.agg(self.backbone(new_x)))\n    \n    \n    \nclass SorghumNetV2(Layer):\n    def __init__(self, n_classes=100):\n        super(SorghumNetV2, self).__init__()\n        \n        _effb1=efficientnet.EfficientNetB1(pretrained=True,input_shape=(3,240,240),include_top=False)\n        _effb1.model.trainable=True\n        _effb1.model.block7b.dropout_rate=0.2\n        _effb1.model.top_conv.activation=TanhExp()\n\n        self.n_classes=n_classes\n        self.backbone =_effb1.model\n        self.agg=Sequential(\n            Reshape((9,1280, 8, 8)),\n            Aggregation(mode='max',axis=1,keepdims=False),\n            SeparableConv2d_Block((3,3),depth_multiplier=1,strides=1,auto_pad=True,use_bias=False,activation=TanhExp(),normalization='bn'),\n            ShortCut(\n                Identity(),\n                Sequential(\n                GlobalAvgPool2d(),\n                Reshape((1280,1,1)),\n                Conv2d((1,1),num_filters=100,use_bias=False,activation=TanhExp()),\n                Conv2d((1,1),num_filters=1280,use_bias=False,activation=Sigmoid())\n                ),mode='dot'\n            ),\n            GlobalAvgPool2d(),\n        )\n        \n    \n     \n        self.decoder=Dense(n_classes,weight_norm='l2')\n    \n    \n    def forward(self, x):\n        new_x=space_to_depth(x, block_size=3)\n        B,N,C,H,W=new_x.shape\n        new_x=new_x.reshape((B*N,C,H,W))\n    \n      \n        return self.decoder(self.agg(self.backbone(new_x)))\n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:53.377767Z","iopub.execute_input":"2022-06-08T17:09:53.378200Z","iopub.status.idle":"2022-06-08T17:09:53.397119Z","shell.execute_reply.started":"2022-06-08T17:09:53.378162Z","shell.execute_reply":"2022-06-08T17:09:53.396292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sorghumnet_v1=Model(input_shape=(3,720,720),output=SorghumNetV1(100))\n#sorghumnet_v1.load_model('../input/sorghum-100-identification/Models/sorghumnet_v1_b1.pth')\n#sorghumnet_v1.load_model('./Models/sorghumnet_v1_b1.pth')\nsorghumnet_v1.summary()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:53.398645Z","iopub.execute_input":"2022-06-08T17:09:53.399119Z","iopub.status.idle":"2022-06-08T17:09:57.382132Z","shell.execute_reply.started":"2022-06-08T17:09:53.399082Z","shell.execute_reply":"2022-06-08T17:09:57.381283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sorghumnet_v2=Model(input_shape=(3,720,720),output=SorghumNetV2(100))\n#sorghumnet_v2.load_model('../input/sorghum-100-identification/Models/sorghumnet_v2_b1.pth')\n#sorghumnet_v2.load_model('./Models/sorghumnet_v2_b1.pth')\nsorghumnet_v2.trainable=True\nsorghumnet_v2.summary()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:57.385310Z","iopub.execute_input":"2022-06-08T17:09:57.388613Z","iopub.status.idle":"2022-06-08T17:09:59.328294Z","shell.execute_reply.started":"2022-06-08T17:09:57.388570Z","shell.execute_reply":"2022-06-08T17:09:59.327593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cxt=get_session()\n# def get_features(training_context):\n#     model=training_context['current_model']\n#     data=training_context['train_data']\n#     data['features']=model.avg_pool.output\n    \n#     steps=training_context['steps']\n#     if steps>0 and steps%20==0: \n#         if hasattr(cxt,'center_loss_fn'):\n#             state_dict=OrderedDict()\n#             state_dict['centers']=cxt.center_loss_fn.centers.data\n#             with open('./Models/centers.pth', 'wb') as f:\n#                 save(state_dict, f)\n    \n    \n# cxt.center_loss_fn=CenterLoss(num_classes=100, feat_dim=1536, reduction=\"mean\")    \n# if os.path.exists('./Models/centers.pth'):\n#     state_dict=load('./Models/centers.pth')\n#     cxt.center_loss_fn.centers.data.copy_(state_dict['centers'].to(get_device()))\n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:59.332006Z","iopub.execute_input":"2022-06-08T17:09:59.334231Z","iopub.status.idle":"2022-06-08T17:09:59.340310Z","shell.execute_reply.started":"2022-06-08T17:09:59.334182Z","shell.execute_reply":"2022-06-08T17:09:59.339630Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ArcMarginProductLoss(Layer):\n    def __init__(self, scale=32.0, margin=0.50, easy_margin=False, num_filters= 100,name='ArcMarginProductLoss'):\n        super(ArcMarginProductLoss, self).__init__()\n        self._name=name\n        self.num_filters=num_filters\n        self.scale = scale\n        self.m = margin\n        self.easy_margin = easy_margin\n        self.cos_m = math.cos(margin)\n        self.sin_m = math.sin(margin)\n\n        # make the function cos(theta+m) monotonic decreasing while theta in [0°,180°]\n        self.th = math.cos(math.pi - margin)\n        self.mm = math.sin(math.pi - margin) * margin\n        self.base_loss=CrossEntropyLoss(reduction='mean')\n\n\n    def forward(self,output, target,**kwargs):\n        # cos(theta)\n        try:\n            cosine=l2_normalize(output)\n            \n            # cos(theta + m)\n            sine = sqrt(1.0 - pow(cosine, 2))\n            phi = cosine * self.cos_m - sine * self.sin_m\n\n            if self.easy_margin:\n                phi = where(cosine > 0, phi, cosine)\n            else:\n                phi = where((cosine - self.th) > 0, phi, cosine - self.mm)\n\n            one_hot = zeros_like(cosine,requires_grad=True)\n            one_hot.scatter(1, target.view(-1, 1), 1)\n\n            output = (one_hot * phi) + ((1.0 - one_hot) * cosine)\n            output = output * self.scale\n        except Exception as e:\n            print(e)\n            PrintException()\n\n        loss = self.base_loss(output, target)\n        return loss.mean()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:59.343727Z","iopub.execute_input":"2022-06-08T17:09:59.344655Z","iopub.status.idle":"2022-06-08T17:09:59.367863Z","shell.execute_reply.started":"2022-06-08T17:09:59.344615Z","shell.execute_reply":"2022-06-08T17:09:59.366884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn import manifold\nfrom tqdm import  tqdm\n\n \n#將arcface視覺化\ndef visualize(training_context):\n    features=[]\n    labels=[]\n    preds=[]\n    model=training_context['current_model']\n    epoch=training_context['current_epoch']\n    model.eval()\n    if epoch>0:\n#         if epoch==1:\n  \n#             model.block6e.trainable=True\n#             model.block6d.trainable=True\n#             model.block6c.trainable=True\n#             model.block6b.trainable=True\n#         elif epoch==11:\n#             model.block6a.trainable=True\n#         elif epoch==13:\n#             model.block5d.trainable=True\n#         elif epoch==15:\n#             model.block5c.trainable=True\n\n\n        NUM_COLORS = 100\n        cm = plt.get_cmap('gist_rainbow')\n        for i in tqdm(range(50)):\n            _images,_labels=data_provider2.next()\n            _result=to_numpy(argmax(model(to_tensor(_images)),axis=1))\n            _features=to_numpy(_result['features'])\n\n            for k in range(len(_images)):\n                features.append(to_numpy(l2_normalize(_features[k])))\n                labels.append(_labels[k])\n                preds.append(_result[k])\n        print('features',len(features),'labels',len(labels))\n        labels=np.array(labels)\n        features=np.array(features)\n        preds=np.array(preds)\n\n        print('accuracy:{0:.3%}'.format(np.equal(preds,labels).astype(np.float32).mean()))\n\n\n        #利用TSNE降維成2維後，繪製成散布圖\n\n        fig = plt.figure(figsize=(12,12))\n        ax1= fig.add_subplot(1, 1, 1)\n        tsne2 = manifold.TSNE(n_components=2, init='pca', random_state=0)  # 利用t-sne將512特徵向量降維至2\n        print('tsne 訓練開始')\n        features_tsne2 = tsne2.fit_transform(features) \n        #features_tsne2=l2_normalize(features_tsne2)\n        print('tsne 訓練結束')\n        for i in range(100):\n            x_i = features_tsne2[:,0][labels==i]\n            y_i = features_tsne2[:,1][labels==i]\n            ax1.scatter(x_i,y_i,s=20,marker='o',c=cm(i//3*3.0/NUM_COLORS))\n\n        model.train()\n        plt.legend(classnames, loc = 'upper right')\n        plt.title('epoch {0}'.format(epoch))\n        plt.savefig('Results/epoch{0}.jpg'.format(epoch), bbox_inches='tight')\n        plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:59.372517Z","iopub.execute_input":"2022-06-08T17:09:59.372956Z","iopub.status.idle":"2022-06-08T17:09:59.533923Z","shell.execute_reply.started":"2022-06-08T17:09:59.372920Z","shell.execute_reply":"2022-06-08T17:09:59.532846Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"#visualize(effb2.training_context)","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:59.535554Z","iopub.execute_input":"2022-06-08T17:09:59.535859Z","iopub.status.idle":"2022-06-08T17:09:59.540744Z","shell.execute_reply.started":"2022-06-08T17:09:59.535818Z","shell.execute_reply":"2022-06-08T17:09:59.539268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"優化方向\n彙總前加上PRelu\n加入DropPath","metadata":{}},{"cell_type":"code","source":"sorghumnet_v1.load_model('./Models/sorghumnet_v1_b1.pth')\nsorghumnet_v2.load_model('./Models/sorghumnet_v2_b1.pth')\n#sorghumnet_v2.model.load_state_dict(sorghumnet_v1.model.state_dict(),False)\n\n\n\n#.with_loss(ArcMarginProductLoss(scale=32.0, margin=0.50, easy_margin=True, num_filters=100))\\\n# sorghumnet.with_optimizer(optimizer=DiffGrad,lr=1e-3,betas=(0.9, 0.999),gradient_centralization='all')\\\n#     .with_loss(CrossEntropyLoss(input_names=['classifier','labels']))\\\n#     .with_loss(ArcMarginProductLoss(scale=32.0, margin=0.50, easy_margin=True, num_filters=100))\\\n#     .with_metric(accuracy)\\\n#     .with_metric(accuracy,topk=3,name='top3_accuracy')\\\n#     .with_regularizer('l2') \\\n#     .with_model_save_path('./Models/sorghumnet_b1.pth')\\\n#     .trigger_when(when='on_epoch_start', frequency=1, unit='epoch', action=visualize)\\\n#     .with_learning_rate_scheduler(CosineLR(min_lr=1e-5,period=1000))\\\n#     .with_accumulate_grads(10)\\\n#     .with_automatic_mixed_precision_training()\n    #.with_callbacks(CutMixCallback(alpha=1,loss_criterion=CrossEntropyLoss,save_path='Results',loss_weight=0.1))\\\n    \nsorghumnet_v1.with_optimizer(optimizer=Adam,lr=1e-3,betas=(0.9, 0.999))\\\n    .with_loss(ArcMarginProductLoss(scale=32.0, margin=0.50, easy_margin=True, num_filters=100))\\\n    .with_metric(accuracy)\\\n    .with_metric(accuracy,topk=3,name='top3_accuracy')\\\n    .with_regularizer('l2')\\\n    .with_model_save_path('./Models/sorghumnet_v1_b1.pth')\\\n    .trigger_when(when='on_epoch_start', frequency=1, unit='epoch', action=visualize)\\\n    .with_learning_rate_scheduler(CosineLR(min_lr=1e-5,period=1000))\\\n    .with_automatic_mixed_precision_training()\n\nsorghumnet_v2.with_optimizer(optimizer=Adam,lr=1e-3,betas=(0.9, 0.999),gradient_centralization='all')\\\n    .with_loss(ArcMarginProductLoss(scale=32.0, margin=0.50, easy_margin=True, num_filters=100))\\\n    .with_metric(accuracy)\\\n    .with_metric(accuracy,topk=3,name='top3_accuracy')\\\n    .with_regularizer('l2') \\\n    .with_model_save_path('./Models/sorghumnet_v2_b1.pth')\\\n    .trigger_when(when='on_epoch_start', frequency=1, unit='epoch', action=visualize)\\\n    .with_learning_rate_scheduler(CosineLR(min_lr=1e-5,period=1000))\\\n    .with_automatic_mixed_precision_training()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:09:59.542276Z","iopub.execute_input":"2022-06-08T17:09:59.542842Z","iopub.status.idle":"2022-06-08T17:10:00.697415Z","shell.execute_reply.started":"2022-06-08T17:09:59.542797Z","shell.execute_reply":"2022-06-08T17:10:00.696497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nplan=TrainingPlan()\\\n    .add_training_item(sorghumnet_v1)\\\n    .add_training_item(sorghumnet_v2)\\\n    .with_data_loader(data_provider)\\\n    .repeat_epochs(100)\\\n    .with_batch_size(12)\\\n    .print_progress_scheduling(5,unit='batch')\\\n    .out_sample_evaluation_scheduling(frequency=50,unit='batch')\\\n    .display_loss_metric_curve_scheduling(frequency=100,unit='batch',imshow=True)\\\n    .save_model_scheduling(10,unit='batch')\n\n\nplan.start_now()","metadata":{"execution":{"iopub.status.busy":"2022-06-08T17:10:00.701216Z","iopub.execute_input":"2022-06-08T17:10:00.703531Z"},"trusted":true},"execution_count":null,"outputs":[]}]}