我想在用Python编写的App Engine应用程序中使用Google的机器学习功能。
由于研究性质(使用Kohonen的SOM进行数据聚类),该应用程序需要在每次使用前重新训练TensorFlow模型。
我有以下几个问题:
App Engine基于的应用可以命令机器学习功能使用某些输入数据来训练某个模型吗?App Engine基于的应用可以将某个输入向量发送到ML功能并获得结果(该向量属于哪个聚类)吗?如果这一切都是可能的,如何实现?
如果这些都不可能,有没有其他架构可以让我使用TensorFlow
来构建基于App Engine的应用?
回答:
是的,你可以使用App Engine与Google Cloud Machine Learning(以下简称为CloudML
)进行通信。
要从Python与CloudML通信,你可以使用Google API客户端库,它可以与任何Google服务一起使用。这个客户端库也可以在App Engine上使用,甚至有专门的文档介绍这方面的使用,在这里可以找到。
我建议你先在本地试验API客户端,然后再在App Engine上测试。在本回答的下一部分中,我不会区分在本地还是在App Engine上使用这个客户端库。
你提到了两种你想对CloudML
进行的操作:
- 使用新数据更新模型
- 从已训练/部署的模型中获取预测
1. 使用新数据更新模型
用新数据更新模型实际上包括两个步骤。首先是在新数据上训练模型(是否使用CloudML
都可以),然后将这个新训练的模型部署到CloudML
上。
你可以从App Engine使用API客户端库来完成这两个步骤,但为了降低复杂性,我认为你应该先按照预测快速入门来开始。这将使你拥有一个新训练并部署的模型,并让你了解所涉及的不同步骤。
一旦你熟悉了所涉及的概念和步骤,你会发现你可以将新数据存储在GCS上,并用API客户端库的相应API调用替换快速入门中的不同gcloud命令(文档)。
2. 从部署的模型中获取预测
如果你有一个已部署的模型(如果没有,请按照前一步的链接操作),你可以轻松地与CloudML
通信,以获取1)批量预测或2)在线预测(后者处于Alpha阶段)。由于你在使用App Engine,我假设你对使用在线预测感兴趣(获取即时结果)。实现此操作所需的最小代码如下:
from oauth2client.client import GoogleCredentialsfrom googleapiclient import discoveryprojectID = 'projects/<your_project_id>'modelName = projectID+'/models/<your_model_name>'credentials = GoogleCredentials.get_application_default()ml = discovery.build('ml', 'v1beta1', credentials=credentials)# Create a dictionary with the fields from the request body.requestDict = {"instances":[ {"image": [0.0,..., 0.0, 0.0], "key": 0} ]}# Create a request to call projects.models.create.request = ml.projects().predict( name=modelName, body=requestDict)response = request.execute()
其中{"image": <image_array>, "key": <key_id>}
是你通过前一步的链接为已部署模型定义的输入格式。这将在response
中返回模型的预期输出。