AllenNLP源码拓展——训练结束向邮箱发邮件

训练模型时,不知道什么时候会结束(特别是设置了早停时),因此之前习惯过一会看一下状况。所以前不久想到,如果添加代码,在训练结束后向自己的邮箱发送邮件,那不是很方便嘛。于是我尝试在AllenNLP的源码上添加发送邮件的代码。
如果需要改写源码,不能直接用pip安装,需要按照https://github.com/allenai/allennlp的Installing from source部分所说的方式进行安装。

由于对python发送邮件不熟悉,我就直接使用了菜鸟教程上的代码。
菜鸟教程——Python3 SMTP发送邮件——使用第三方 SMTP 服务发送
需要按照网站上的教程在自己的邮箱进行配置,我使用了 QQ 邮箱(你也可以使用 163,Gmail等)的 SMTP 服务。

添加代码

位置allennlp.training.trainer
我在Trainer类后面加了一个函数sendEmail,Trainer的构造函数的参数最后添加一项email: List = None([‘邮箱’,‘配置邮箱SMTP时得到的密码’]),传进Trainer类self._email = email
在def train(self)的最后,添加一行:
(这里我把train函数的返回值,包含一些训练中得到的数据,作为邮件的内容)

# send Email after train
self.sendEmail(str(metrics))

sendEmail的参数msg是需要发送的文本。

    def sendEmail(self, msg : str=None):
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr

        my_sender = ""
        my_pass = ""
        my_user = ""
        #这里我为了方便自己使用,设置如果self._email为空,向自己的邮箱发送邮件
        if self._email == None:     
            my_sender = '[email protected]'
            my_pass = 'kybiXXXXXcbbjf'   #这个号码是配置邮箱SMTP时得到的
            my_user = '[email protected]'
        elif len(self._email) == 2:
            my_sender = self._email[0]    # 发件人邮箱账号
            my_pass = self._email[1]      # 发件人邮箱密码
            my_user = self._email[0]      # 收件人邮箱账号,我这里发送给自己
        elif len(self._email) == 1:
            logger.info("lack email parameter! It consists of sender address and passward.")
            return

        if msg == None:
            msg = "finish train"

        def mail():
            ret=True
            try:
                msgsend=MIMEText(msg,'plain','utf-8')
                msgsend['From']=formataddr(["wxy",my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
                msgsend['To']=formataddr(["name",my_user])     # 括号里的对应收件人邮箱昵称、收件人邮箱账号
                msgsend['Subject']="AllenNLP Result"         # 邮件的主题,也可以说是标题

                server=smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP服务器,端口是25
                server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码
                server.sendmail(my_sender,[my_user,],msgsend.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
                server.quit()  # 关闭连接
            except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
                ret=False
            return ret

        ret=mail()
        if ret:
            logger.info("email successed")
        else:
            logger.info("email failed")

这部分我提交到了我在Github上fork下来的仓库

其他

我没有在读取配置文件的地方加email这一项,因为懒。当然你也可以自己DIY一下,比如,发送其他你希望发送的信息,或者发送给别人的邮箱。

此外,这两天在AllenNLP源码上,完成了一个很使用的自动化训练脚本,初步测试没有问题。过一段时间进行更多测试,可以试一试提交给AllenNLP官方

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_38133212/article/details/88312689
今日推荐