用慣了tensorflow的小伙伴肯定都用過tensorboard工具吧。雖然Facebook也推出了visdom,但是在一次不小心誤觸clear之后,我放棄了這個工具(頁面的一個clear按鈕我本來是想按save的……它們倆一左一右,腦子一熱按錯了,點擊之后clear之后不知道怎么找回曲線數據,真的崩潰)
說回pytorch使用tensorboard吧……
- 首先是安裝。
pip install tensorboardX
這東西雖然是給pytorch用的,但是其實還是走的tensorboard那一套東西,所以你的環境里還需要有tensorflow。(cpu、gpu版本不限,隨手裝一個就好了)
- 調用
from tensorboardX import SummaryWriter
使用的就是SummaryWriter這個類。簡單的使用可以直接使用SummaryWriter實例
# before train log_writer = SummaryWriter('log_file_path') # in training log_writer.add_scalar('Train/Loss', loss.data[0], niter) # in pytorch1.0 loss.data[0] should be loss.item()
如果你不僅僅是需要記錄一個loss這么簡單,也可以對SummaryWriter做一個封裝。
class Tacotron2Logger(SummaryWriter): def __init__(self, logdir): super(Tacotron2Logger, self).__init__(logdir) def log_training(self, reduced_loss, grad_norm, learning_rate, duration, iteration): self.add_scalar("training.loss", reduced_loss, iteration) self.add_scalar("grad.norm", grad_norm, iteration) self.add_scalar("learning.rate", learning_rate, iteration) self.add_scalar("duration", duration, iteration) def log_validation(self, reduced_loss, model, y, y_pred, iteration): self.add_scalar("validation.loss", reduced_loss, iteration) _, mel_outputs, gate_outputs, alignments = y_pred mel_targets, gate_targets = y # plot distribution of parameters for tag, value in model.named_parameters(): tag = tag.replace('.', '/') self.add_histogram(tag, value.data.cpu().numpy(), iteration) # plot alignment, mel target and predicted, gate target and predicted idx = random.randint(0, alignments.size(0) - 1) self.add_image( "alignment", plot_alignment_to_numpy(alignments[idx].data.cpu().numpy().T), iteration) self.add_image( "mel_target", plot_spectrogram_to_numpy(mel_targets[idx].data.cpu().numpy()), iteration) self.add_image( "mel_predicted", plot_spectrogram_to_numpy(mel_outputs[idx].data.cpu().numpy()), iteration) self.add_image( "gate", plot_gate_outputs_to_numpy( gate_targets[idx].data.cpu().numpy(), F.sigmoid(gate_outputs[idx]).data.cpu().numpy()), iteration)
這段代碼是從NVIDIA tacotron2中摘取過來的。使用和前面一樣,只不過把類名改一下就是了,調用的時候,按照你自己定義的類函數去調用就好了。基本功能還是都在的,畫圖畫曲線什么的。沒有visdom花里胡哨就是了。
log_writer = Tacotron2Logger('log_file_path') log_writer.log_training(self, reduced_loss, grad_norm, learning_rate, duration, iteration)
這樣封裝后,就不會在train的代碼里很凌亂了。
- 網頁查看,這個就回到tensorboard一樣的操作了。
tensorboard --logdir=./log_file_path --port=8765 # log_file_path 是初始化log_writer時候的那個參數地址。 # 這里端口號可以隨意改,默認是6006。
- 然后命令行會告訴你在瀏覽器輸入 ip:8765進行查看,這個和tensorboard一樣了就。