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 = '64XXXXX60@qq.com'
            my_pass = 'kybiXXXXXcbbjf'   #这个号码是配置邮箱SMTP时得到的
            my_user = '64XXXXX60@qq.com'
        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官方

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值