質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1521閲覧

Pythonで指定したepochごとに学習したモデルを保存して別のプログラムを実行させる方法

mek_41

総合スコア3

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/08/23 03:56

編集2021/08/27 07:31

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

visual.pyのインターフェースがどのようになっているのかわからないですが、以下ようなコードでvisual.pyを実行できるのではないでしょうか。

python

1import subprocess 2 3if epoch % 1000 == 0: 4 subprocess.run('python visual.py [引数など]', shell=True)

visual.pyで可視化するための関数などが用意できているならモジュールとしてimportして実行することもできます。
https://docs.python.org/ja/3/tutorial/modules.html

投稿2021/08/25 07:05

mayac

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mek_41

2021/08/25 07:57

回答ありがとうございます。今visual.pyのコードなどを詳細に載せたものを別途投稿させていただいたので見ていただけると嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問