1.前提・実現したいこと
python3でmain.pyでlossの計算をしており、その結果をresultに保存してvisual.pyでtSNEを用いて可視化するプログラムを作っています。
main.pyで10000epoch学習させるのですが、1000epoch毎にlossの学習結果をvisual.pyで可視化してくれるプログラムを実装したいと考えています。
2.発生している問題
今は10000epochの学習が終わった後にvisual.pyを実行させて可視化し、plt.savefig("ファイル名.png")で保存していますが。5000epochなどの途中経過が見れなくて困っています。また、visual.pyを実行させ、可視化結果をvisual.pyが実行されるごとに名前を変えて保存がしたいです。
3.該当のソースコード
main,py
1##### ライブラリ読み込み ##### 2## 省略 3 4### dataloader## 5## 省略 6 7## train ## 8def train(epoch): 9 model.train() 10 11 # 初期設定 12 sum_loss = 0 13 correct = 0 14 total = 0 15 16 # 学習ループ inputs:入力画像 targets:教師ラベル 17 for batch_idx, (inputs, targets) in enumerate(tqdm(train_loader, leave=False)): 18 19 inputs = inputs.cuda(device) 20 targets = targets.cuda(device) 21 22 targets = targets.long() 23 24 y,output = model(inputs) 25 26 loss = criterion(output, targets) 27 28 optimizer.zero_grad() 29 30 loss.backward() 31 32 optimizer.step() 33 34 sum_loss += loss.item() 35 36 37 ##精度の計算## 38 # 出力をsoftmax関数に(0~1) 39 output = F.softmax(y, dim=1) 40 41 # 最大ベクトル 42 _, predicted = output.max(1) 43 44 # total = 正解, correct = 予測 45 total += (targets.size(0)*targets.size(1)*targets.size(2)) 46 correct += predicted.eq(targets).sum().item() #predicted.eq(targets) 47 48 return sum_loss/(batch_idx+1), correct/total 49 50 51 52## validation ## 53def val(epoch): 54 model.eval() 55 56 sum_loss = 0 57 correct = 0 58 total = 0 59 60 # 設定:パラメータの更新なし 61 with torch.no_grad(): 62 # 学習ループ inputs:入力画像 targets:教師ラベル画像 63 for batch_idx, (inputs, targets) in enumerate(tqdm(val_loader, leave=False)): 64 inputs = inputs.cuda(device) 65 targets = targets.cuda(device) 66 67 targets = targets.long() 68 69 y, output = model(inputs) 70 71 loss = criterion(output, targets) 72 73 sum_loss += loss.item() 74 75 ##精度の計算## 76 77 # 出力をsoftmax関数に(0~1) 78 output = F.softmax(y, dim=1) 79 # 最大ベクトル 80 _, predicted = output.max(1) 81 # total = 正解, correct = 予測 82 total += (targets.size(0)*targets.size(1)*targets.size(2)) 83 correct += predicted.eq(targets).sum().item() #predicted.eq(targets) : 84 return sum_loss/(batch_idx+1), correct/total 85 86 87## main ## 88if __name__ == '__main__': 89 parser = argparse.ArgumentParser(description='SemanticSegmentation') 90 parser.add_argument('--gpu', '-g', type=int, default=0, 91 help='GPU id') 92 parser.add_argument('--batchsize', '-b', type=int, default=4, 93 help='Number of images in each mini-batch') 94 parser.add_argument('--Tbatchsize', '-t', type=int, default=4, 95 help='Number of images in each mini-batch') 96 parser.add_argument('--num_epochs', '-e', type=int, default=65536, 97 help='Number of epoch')# 学習回数(epoch)指定 98 parser.add_argument('--out', '-o', type=str, default='result', 99 help='Directory to output the result') 100 parser.add_argument('--seed', '-s', type=int, default=0, 101 help='Random seed') 102 parser.add_argument('--lr', '-l', type=float, default=1e-3, 103 help='Learning rate') 104 args = parser.parse_args() 105 106 ## Covid-19 dataset ## 107 classes = 4 108 inputs_ch = 3 109 110 111 ## 初期設定表示 ## 112 print("[Experimental conditions]") 113 print(" GPU ID : {}".format(args.gpu)) 114 print(" Epochs : {}".format(args.num_epochs)) 115 print(" Minibatch size : {}".format(args.batchsize)) 116 print(" Class number : {}".format(classes)) 117 print(" Learning rate : {}".format(args.lr)) 118 print("") 119 120 121 ## GPU設定 ## 122 device = torch.device('cuda:{}'.format(args.gpu) if torch.cuda.is_available() else 'cpu') 123 124 125 ## 保存ディレクトリ・ファイル ## 126 127 if not os.path.exists("{}".format(args.out)): 128 os.mkdir("{}".format(args.out)) 129 130 PATH_1 = "{}/trainloss.txt".format(args.out) 131 PATH_2 = "{}/valloss.txt".format(args.out) 132 PATH_3 = "{}/trainaccuracy.txt".format(args.out) 133 PATH_4 = "{}/valaccuracy.txt".format(args.out) 134 135 with open(PATH_1, mode = 'w') as f: 136 pass 137 with open(PATH_2, mode = 'w') as f: 138 pass 139 with open(PATH_3, mode = 'w') as f: 140 pass 141 with open(PATH_4, mode = 'w') as f: 142 pass 143 144 145 # モデル設定 146 model = UNet(in_ch=inputs_ch, n_class=classes).cuda(device) #in_ch = input channel, n_class = output channel 147 148 149 # 損失関数設定 150 criterion = SquareLoss(device=device) 151 152 # オプティマイザー設定 153 optimizer = torch.optim.Adam(model.parameters(), lr=args.lr) 154 155 # 初期値の乱数設定 156 random.seed(args.seed) #python 157 np.random.seed(args.seed) #numpy 158 torch.manual_seed(args.seed) #pytorch 159 160 161 # データ読み込み+初期設定 162 train_loader, val_loader = dataload() 163 164 165 ## training & validation ## 166 best_loss = 1000 167 #args.num_epochs = max epoch 168 for epoch in range(args.num_epochs): 169 train_loss, train_accuracy = train(epoch) # train 170 val_loss, val_accuracy = val(epoch) # validation 171 172 ## 結果表示 ## 173 print("Epoch{:3d}/{:3d} TrainLoss={:.4f} ValAccuracy={:.2f}%".format(epoch+1,args.num_epochs,train_loss,val_accuracy*100)) 174 175 176 ## 出力結果書き込み ## 177 with open(PATH_1, mode = 'a') as f: 178 f.write("{}\t{:.2f}\n".format(epoch+1, train_loss)) 179 with open(PATH_2, mode = 'a') as f: 180 f.write("{}\t{:.2f}\n".format(epoch+1, val_loss)) 181 with open(PATH_3, mode = 'a') as f: 182 f.write("{}\t{:.2f}\n".format(epoch+1, (train_accuracy*100))) 183 with open(PATH_4, mode = 'a') as f: 184 f.write("{}\t{:.2f}\n".format(epoch+1, (val_accuracy)*100)) 185 186 if train_loss <= best_loss: 187 best_loss = train_loss 188 PATH ="{}/model.pth".format(args.out) 189 torch.save(model.state_dict(), PATH)
visual_tSNE.py
1from sklearn.manifold import TSNE 2# 結果の可視化 3import matplotlib.pyplot as plt 4 5##### ライブラリ読み込み ##### 6## 省略 7 8 9## test関数 ## 10def test(): 11 12 model.eval() 13 14 correct = 0 15 total = 0 16 test_transform = transforms.Compose([transforms.ToTensor(), #0~1正規化+Tensor型に変換 17 transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]), 18 ]) 19 # 画像はcovid-19のtest画像を利用 20 img = Image.open('Dataset/covid19/Image/test/img_100.png').convert('RGB') 21 22 # ラベル読み込み 23 L = Image.open('Dataset/covid19/Label/test/img_100.png').convert("L") 24 # 画像の正規化 25 inputs = test_transform(img) 26 to_tensor = transforms.ToTensor() 27 L = to_tensor(L) * 255 28 29 30 inputs = inputs.cuda(device).unsqueeze(0) 31 print(inputs.shape) 32 33 y,h = model(inputs) 34 35 y = F.softmax(y, dim=1) 36 37 _, predicted = y.max(1) 38 39 return predicted, h, L 40 41 42class UNet(nn.Module): 43 # 初期設定 44 def __init__(self, in_ch=1, n_class=4): 45 super(UNet, self).__init__() 46 # Convolution Layer 47 ## 省略 48 49 def __call__(self, x): 50 # Block1 Encoder 51 # Block2 Encoder 52 # Block3 Encoder 53 # Block4 Middle 54 # Block5 Decoder 55 # Block6 Decoder 56 # Block7 Decoder 57 # discriminate 58 y = self.conv_f(h) 59 60 return y, h 61 62## GPU設定 ## 63device = torch.device('cuda:0') 64 65# モデル設定 66model = UNet(in_ch=3, n_class=4).cuda(device) 67 68 69# 学習済みモデルのロード 70model_path = PATH ="result/model.pth" 71model.load_state_dict(torch.load(model_path)) 72 73y, h , L = test() 74print(L.shape) 75 76y = y.view(y.size(1) * y.size(2)) # (W*Hのデータ数にする) 77L = L.view(L.size(1) * L.size(2)) 78L = L.to(torch.int32) # float32 -> int32 79#print(y.size()) 80y = y.tolist() 81L = L.tolist() 82 83 84h = h.view(1, h.size(1), h.size(2) * h.size(3)) 85h = h[0] # (h.size(1), W*H) 86h = h.permute([1, 0]) # 次元を入れ替え(データ数, 次元) 87 88X_test = h.to('cpu').detach().numpy().astype(np.float32) # tensor -> numpy 89 90# 入力画像の確認 91print(X_test.shape) 92print(type(X_test)) 93 94# t-SNEの適応 95# X_testにt-SNEを適応し、得られた低次元データをX_tsneに格納する 96tsne = TSNE(n_components = 2) # 低次元データの次元数 97X_tsne = tsne.fit_transform(X_test) # X_test : 入力画像とラベル 98 99# t-SNEの可視化 100colors = ['black', 'blue', 'green', 'red'] 101plt.xlim(X_tsne[:, 0].min(), X_tsne[:, 0].max() + 1) 102plt.ylim(X_tsne[:, 1].min(), X_tsne[:, 1].max() + 1) 103 104for color_index in range(len(colors)): # 黒青緑赤の順に描画 105 for i in range(len(X_test)): 106 if L[i] == color_index: 107 plt.text( 108 X_tsne[i, 0], 109 X_tsne[i, 1], 110 str(L[i]), 111 color = colors[L[i]] 112 ) 113plt.xlabel('t-SNE Feature1') 114plt.ylabel('t-SNE Feature2') 115 116plt.savefig(ファイル名.png")
4.自分で調べたこと
if epoch % 1000==0:
test(epoch=epoch+1)
1000epochごとにプロットするには以下のようにを足せばいいのはわかるのですが、1000epochごとに、visual.pyを実行し、それぞれ名前を変えて保存するにはどうしたらいでしょうか。(例:1000epochの可視化結果 img1.png, 2000epochの可視化結果 img2.pngなど)
5.使っているツール
python3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/25 07:57