创建 Keras 回调以在 WhatsApp 上发送通知
每当从事研究项目时,训练神经网络都需要很长时间。因此,我们启动了培训过程,并让笔记本电脑安静地待了一段时间。很多时候,由于网络错误或任何其他问题,该过程会在两者之间停止。在这些情况下,人们希望在训练过程停止(由于错误或完成指定数量的 epoch 后)立即得到通知,以便可以相应地采取后续步骤,而浪费时间最少。
在本教程中,我们将创建一个 Keras 回调,用于在 WhatsApp 上发送有关您的深度学习模型的通知。本教程大致分为 3 个部分 -
- 使用Python向 WhatsApp 发送消息
- 创建 Keras 回调并了解其工作原理
- 将它们捆绑在一起
使用Python向 WhatsApp 发送消息
有许多方法可以将 WhatsApp messenger 与Python连接起来。但是,最简单的一种是使用 Twilio 的。 Twilio 是一个通信平台,允许开发人员在不同平台上发送通知,例如普通文本 SMS、WhatsApp 甚至语音通话。它提供了一个非常简洁的 API 用于连接 WhatsApp 和Python。
第 1 步。前往此链接并注册 Twilio。
第 2 步。通过点击此链接激活 WhatsApp 的 Twilio 沙盒。您将能够看到如下所示的界面。您可以通过将此号码(突出显示)保存为手机上的联系人并向保存的联系人发送消息“加入主圈”来激活沙盒。等待界面显示确认消息。
第 3 步。通过单击屏幕左上角的 Twilio 徽标或单击此链接,前往 Twilio 控制台。在这里,您可以找到在Python中设置 Twilio 客户端时需要的 Account ID 和 Auth Token。
步骤 4.在Python中设置 Twilio 客户端并发送您的第一条消息。打开代码编辑器并将以下代码粘贴到Python文件中。在下面的代码片段中, account_sid
和auth_token
是从控制台获取的令牌,如步骤 3 所示。“Your_whatsapp_number”是您希望接收文本通知的号码。最后,“From_number”是您在步骤 2 中为 WhatsApp 设置 Twilio Sandbox 时遇到的电话号码。注意 - 在号码中包含国家代码。例如 - 如果您的电话号码是 112233445 并且国家/地区代码是 +91,您必须在“Your_whatsapp_number”字段中填写 +91112233445。
from twilio.rest import Client
account_sid = '8' # Obtained from Step-3
auth_token = 'your_auth_token' # Obtained from Step-3
Your_whatsapp_number = ‘+911234567899’ # Include the country code
From_number = ‘+1488*****’ # Obtained from Step 2
client = Client(account_sid, auth_token)
message = client.messages.create(
body ='Hello there !',
from_= From_number,
to = Your_whatsapp_number
)
print(message.sid)
执行此脚本后,您将在您的手机上看到来自步骤 2 中获得的号码的 WhatsApp 通知。
创建 Keras 回调并了解其工作原理
根据 Keras 官方文档,“回调是在训练过程的给定阶段应用的一组函数。您可以在训练期间使用回调来查看模型的内部状态和统计信息”。
在训练您的深度神经网络时,您可能会遇到想要记录不同指标的情况,例如准确性、文件丢失或随时期改变学习率(自适应学习率)。在这些情况下,我们使用名为 Callbacks 的类的对象,它允许您在训练、测试或评估过程的不同阶段检索、设置不同模型参数的值。 TensorFlow 官方指南是学习如何创建自己的回调的绝佳资源。
TensorFlow 团队在命名 Callback 类中的方法方面做得非常出色,这使得理解每个函数打算做什么/能够做什么变得非常简单。使用的命名约定以 on_{train/test/batch/epoch}_{begin/end} 的形式命名每个函数。
对于我们的任务,我们想知道模型何时停止训练。该信息可以从函数on_train_end() 中获得。因此,我们可以创建一个类“WhatappCallBack”,它扩展了 Keras 的 Callback 类。在这个类中,我们将重载 on_train_end()函数以了解所需的信息。
首先,我们将我们为使用 Twilio 发送消息而编写的代码封装在一个名为“send_message”的函数中。这个函数接收我们想要发送的文本作为参数。
# Can be obtained from Twilio Console
account_sid = 'account_ID'
auth_token = 'auth_token'
client = Client(account_sid, auth_token)
message = client.messages \
.create(
from_='whatsapp:+14155238886',
body = text,
to ='whatsapp:+918*********'
)
接下来,我们定义回调并重载 on_train_end()函数。
class WhatsappCallBack(Callback):
def on_train_begin(self, logs = None):
# Initializing the list of losses
self.losses = []
# Sending message on whatsapp at the beginning of the training
send_message("The training has started")
def on_epoch_begin(self, epoch, logs = None):
pass
def on_epoch_end(self, epoch, logs = None):
self.losses.append(logs['loss'])
def on_train_end(self, logs = None):
# Sending message on whatsapp at the end of the training
send_message("The training has ended")
send_message(self.losses)
正如我们在这里看到的,我们在训练过程的开始和结束时发送消息。我们还通过回调发送训练损失。
将它们捆绑在一起
为了测试我们的函数,我们需要定义一个简单的前馈网络并创建一个虚拟数据集。这将在接下来的步骤中演示。
步骤 1.我们使用 sklearn 库的 make_classification 方法生成 1000 个随机样本数据点和一个非常简单的 ANN。
x, y = make_classification(n_samples = 1000, n_classes = 2, n_features = 20)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3)
def create_model():
model = Sequential()
model.add(Dense(60, input_dim = 20, activation ='relu'))
model.add(Dense(1, activation ='sigmoid'))
model.compile(loss ='binary_crossentropy', optimizer ='adam', metrics =['accuracy'])
return model
model = create_model()
第 2 步。我们创建一个 ''WhatappCallBack' ' 类的实例,并在拟合我们的模型时在回调参数中传递这个实例。
cb2 = WhatsappCallBack()
# Fitting the model
model.fit(x_train, y_train, batch_size = 32, epochs = 20, callbacks =[cb2], verbose = 1)
步骤 3.享受结果
以下存储库中的整个工作代码 -
https://github.com/Raman1121/ML-Practice/blob/master/CustomCallback.ipynb
参考:
1. https://keunwoochoi.wordpress.com/2016/07/16/keras-callbacks/
2. https://www.twilio.com/docs/whatsapp/tutorial/send-whatsapp-notification-messages-templates
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。