一、概述
欢迎使用 TensorFlow Lite 和 Firebase Codelab 的推荐。在此 Codelab 中,您将学习如何使用 TensorFlow Lite 和 Firebase 将推荐模型部署到您的应用。此代码实验室基于此 TensorFlow Lite示例。
推荐允许应用程序使用机器学习为每个用户智能地提供最相关的内容。他们考虑过去的用户行为,通过使用根据大量其他用户的聚合行为训练的模型,向用户推荐未来可能喜欢与之交互的应用程序内容。
本教程介绍如何使用 Firebase Analytics 从您的应用程序用户那里获取数据,构建机器学习模型以根据该数据提供建议,然后在 iOS 应用程序中使用该模型来运行推理并获得建议。特别是,我们的推荐将建议用户最有可能在给定用户之前喜欢的电影列表的情况下观看哪些电影。
你会学到什么
- 将 Firebase Analytics 集成到 Android 应用程序中以收集用户行为数据
- 将该数据导出到 Google Big Query
- 预处理数据并训练 TF Lite 推荐模型
- 将 TF Lite 模型部署到 Firebase ML 并从您的应用访问它
- 使用模型在设备推理上运行以向用户提出建议
你需要什么
- Xcode 11(或更高版本)
- CocoaPods 1.9.1(或更高版本)
您将如何使用本教程?
如何评价您构建 iOS 应用程序的体验?
2.创建Firebase控制台项目
将 Firebase 添加到项目中
- 转到Firebase 控制台。
- 选择创建新项目并将您的项目命名为“Firebase ML iOS Codelab”。
3.获取示例项目
下载代码
首先克隆示例项目并在项目目录中运行pod update
:
git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git cd codelab-contentrecommendation-ios/start pod install --repo-update
如果您没有安装 git,您还可以从其 GitHub 页面或单击此链接下载示例项目。下载该项目后,在 Xcode 中运行它并尝试使用建议来感受它的工作原理。
设置火力地堡
按照文档创建一个新的 Firebase 项目。获得项目后,从Firebase 控制台下载项目的GoogleService-Info.plist
文件并将其拖到 Xcode 项目的根目录。
将 Firebase 添加到 Podfile 并运行 pod install。
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
在AppDelegate
的didFinishLaunchingWithOptions
方法中,在文件顶部导入 Firebase
import FirebaseCore
并添加一个配置 Firebase 的调用。
FirebaseApp.configure()
再次运行项目以确保应用程序配置正确并且不会在启动时崩溃。
- 确保启用“为此项目启用 Google Analytics”。
- 按照 Firebase 控制台中的剩余设置步骤,然后单击创建项目(或添加 Firebase,如果您使用的是现有的 Google 项目)。
4. 将 Firebase Analytics 添加到应用程序
在此步骤中,您将向应用添加 Firebase Analytics 以记录用户行为数据(在本例中为用户喜欢的电影)。此数据将在未来的步骤中汇总用于训练推荐模型。
在应用中设置 Firebase Analytics
LikedMoviesViewModel包含存储用户喜欢的电影的函数。每当用户喜欢一部新电影时,我们还想发送一个分析日志事件来记录这种喜欢。
添加以下代码以在用户点击电影时注册分析事件。
AllMoviesCollectionViewController.swift
import FirebaseAnalytics
//
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//
if movie.liked == nil {
movie.liked = true
Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
} else {
movie.liked?.toggle()
}
}
5. 测试您的 Analytics 集成
在此步骤中,我们将在应用程序中生成 Analytics 事件并验证它们是否被发送到 Firebase 控制台。
启用 Analytics 调试日志记录
通常,您的应用程序记录的事件会在大约一小时的时间内集中在一起并一起上传。这种方法可以节省最终用户设备的电池电量并减少网络数据使用量。但是,为了验证您的分析实施(以及为了在 DebugView 报告中查看您的分析),您可以在您的开发设备上启用调试模式,以便以最小的延迟上传事件。
要在您的开发设备上启用 Analytics 调试模式,请在 Xcode 中指定以下命令行参数:
-FIRDebugEnabled
此时,您已成功将 Firebase Analytics 集成到您的应用中。当用户使用您的应用程序并为电影点赞时,他们的点赞次数将被汇总记录。我们将在本 Codelab 的其余部分使用这些聚合数据来训练我们的推荐模型。以下是一个可选步骤,用于查看您在 Logcat 中看到的相同 Analytics 事件也流式传输到 Firebase 控制台。随意跳到下一页。
可选:在 Firebase 控制台中确认 Analytics 事件
- 转到Firebase 控制台。
- 在 Analytics 下选择DebugView
- 在 Xcode 中,选择运行以启动应用程序并将一些电影添加到您的“喜欢”列表中。
- 在 Firebase 控制台的 DebugView 中,验证在应用中添加电影时是否记录了这些事件。
6. 将 Analytics 数据导出到 Big Query
Big Query 是一款 Google Cloud 产品,可让您检查和处理大量数据。在此步骤中,您会将 Firebase 控制台项目连接到 Big Query,以便您的应用程序生成的 Analytics 数据自动导出到 Big Query。
启用大查询导出
- 转到Firebase 控制台。
- 选择Project Overview旁边的 Settings 齿轮图标,然后选择Project settings
- 选择集成选项卡。
- 在BigQuery块内选择链接(或管理)。
- 在关于将 Firebase 链接到 BigQuery步骤中选择下一步。
- 在Configure integration部分下,单击开关以启用发送 Google Analytics 数据并选择Link to BigQuery 。
您现在已启用 Firebase 控制台项目以自动将 Firebase Analytics 事件数据发送到 Big Query。这会自动发生,无需任何进一步交互,但是,在 BigQuery 中创建分析数据集的第一次导出可能不会在 24 小时内发生。创建数据集后,Firebase 不断将新的 Analytics 事件导出到 Big Query 到日内表中,并在事件表中对过去几天的事件进行分组。
训练推荐模型需要大量数据。由于我们还没有生成大量数据的应用程序,因此在下一步中,我们会将示例数据集导入 BigQuery 以用于本教程的其余部分。
7.使用BigQuery获取模型训练数据
现在我们已经连接了 Firebase 控制台以导出到 BigQuery,我们的应用分析事件数据将在一段时间后自动显示在 BigQuery 控制台中。为了获得本教程所需的一些初始数据,在此步骤中,我们会将现有示例数据集导入您的 BigQuery 控制台,以用于训练我们的推荐模型。
将示例数据集导入 BigQuery
- 转到 Google 云控制台中的BigQuery仪表板。
- 在菜单中选择您的项目名称。
- 在 BigQuery 左侧导航的底部选择您的项目名称以查看详细信息。
- 选择创建数据集以打开数据集创建面板。
- 输入“firebase_recommendations_dataset”作为数据集 ID ,然后选择创建数据集。
- 新数据集将显示在项目名称下方的左侧菜单中。点击它。
- 选择创建表以打开表创建面板。
- 对于从选择“Google Cloud Storage”创建表。
- 在“从 GCS 存储桶中选择文件”字段中,输入“gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt”。
- 在文件格式下拉列表中选择“JSONL”。
- 输入“recommendations_table”作为表名。
- 选中Schema > Auto detect > Schema 和输入参数下的复选框
- 选择创建表
探索示例数据集
此时,您可以选择探索架构并预览此数据集。
- 在左侧菜单中选择firebase-recommendations-dataset以展开其中包含的表。
- 选择recommendations-table表以查看表架构。
- 选择预览以查看此表包含的实际 Analytics 事件数据。
创建服务帐户凭据
现在,我们将在我们的 Google Cloud 控制台项目中创建服务帐户凭据,我们可以在接下来的步骤中在 Colab 环境中使用它来访问和加载我们的 BigQuery 数据。
- 确保为您的 Google Cloud 项目启用了结算功能。
- 启用 BigQuery 和 BigQuery Storage API API。 <点击这里>
- 转到创建服务帐户密钥页面。
- 从Service account列表中,选择New service account 。
- 在服务帐户名称字段中,输入一个名称。
- 从角色列表中,选择项目>所有者。
- 单击创建。包含您下载到计算机的密钥的 JSON 文件。
在下一步中,我们将使用 Google Colab 预处理这些数据并训练我们的推荐模型。
8.预处理数据和训练推荐模型
在此步骤中,我们将使用 Colab notebook 执行以下步骤:
- 将 BigQuery 数据导入 Colab 笔记本
- 预处理数据以为模型训练做准备
- 在分析数据上训练推荐模型
- 将模型导出为 TF lite 模型
- 将模型部署到 Firebase 控制台,以便我们可以在我们的应用程序中使用它
在启动 Colab 培训笔记本之前,我们将首先启用 Firebase 模型管理 API,以便 Colab 可以将经过培训的模型部署到我们的 Firebase 控制台。
启用 Firebase 模型管理 API
创建存储桶来存储您的 ML 模型
在您的 Firebase 控制台中,转到存储并单击开始。
按照对话设置您的存储桶。
启用 Firebase ML API
转到 Google Cloud Console 上的Firebase ML API 页面,然后单击启用。
使用 Colab Notebook 训练和部署模型
使用以下链接打开 colab notebook 并完成其中的步骤。在 Colab notebook 中完成这些步骤后,您将有一个 TF lite 模型文件部署到 Firebase 控制台,我们可以将该文件同步到我们的应用程序。
在 Colab 中打开
9. 在您的应用程序中下载模型
在此步骤中,我们将修改我们的应用程序以下载我们刚刚从 Firebase Machine Learning 训练的模型。
添加 Firebase ML 依赖项
需要以下依赖项才能在您的应用中使用 Firebase 机器学习模型。它应该已经被添加(验证)。
播客文件
import FirebaseCore
import FirebaseMLModelDownloader
使用 Firebase Model Manager API 下载模型
将下面的代码复制到ModelLoader.swift中,以设置模型下载发生的条件,并创建一个下载任务以将远程模型同步到我们的应用程序。
模型加载器.swift
static func downloadModel(named name: String,
completion: @escaping (CustomModel?, DownloadError?) -> Void) {
guard FirebaseApp.app() != nil else {
completion(nil, .firebaseNotInitialized)
return
}
guard success == nil && failure == nil else {
completion(nil, .downloadInProgress)
return
}
let conditions = ModelDownloadConditions(allowsCellularAccess: false)
ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
switch (result) {
case .success(let customModel):
// Download complete.
// The CustomModel object contains the local path of the model file,
// which you can use to instantiate a TensorFlow Lite classifier.
return completion(customModel, nil)
case .failure(let error):
// Download was unsuccessful. Notify error message.
completion(nil, .downloadFailed(underlyingError: error))
}
}
}
10. 在您的应用中集成 Tensorflow Lite 推荐模型
Tensorflow Lite 运行时将允许您在应用程序中使用您的模型来生成建议。在上一步中,我们使用下载的模型文件初始化了一个 TFlite 解释器。在此步骤中,我们将首先在推理步骤中加载字典和标签以伴随我们的模型,然后我们将添加预处理以生成模型的输入和后处理,我们将从推理中提取结果.
加载字典和标签
推荐模型用于生成推荐候选的标签列在资产文件夹中的文件sorted_movie_vocab.json中。复制以下代码以加载这些候选人。
RecommendationsViewController.swift
func getMovies() -> [MovieItem] {
let barController = self.tabBarController as! TabBarController
return barController.movies
}
实施预处理
在预处理步骤中,我们更改输入数据的形式以匹配我们的模型所期望的。在这里,如果我们还没有产生很多用户喜欢,我们会用占位符值填充输入长度。复制以下代码:
RecommendationsViewController.swift
// Given a list of selected items, preprocess to get tflite input.
func preProcess() -> Data {
let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
return MovieItem.id
}
var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))
// Pad input data to have a minimum of 10 context items (4 bytes each)
while inputData.count < 10*4 {
inputData.append(0)
}
return inputData
}
运行解释器以生成建议
在这里,我们使用在上一步中下载的模型对预处理的输入进行推理。我们为我们的模型设置输入和输出的类型并运行推理以生成我们的电影推荐。将以下代码复制到您的应用程序中。
RecommendationsViewController.swift
import TensorFlowLite
RecommendationsViewController.swift
private var interpreter: Interpreter?
func loadModel() {
// Download the model from Firebase
print("Fetching recommendations model...")
ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
guard let path = filePath else {
if let error = error {
print(error)
}
return
}
print("Recommendations model download complete")
self.loadInterpreter(path: path)
}
}
func loadInterpreter(path: String) {
do {
interpreter = try Interpreter(modelPath: path)
// Allocate memory for the model's input `Tensor`s.
try interpreter?.allocateTensors()
let inputData = preProcess()
// Copy the input data to the input `Tensor`.
try self.interpreter?.copy(inputData, toInputAt: 0)
// Run inference by invoking the `Interpreter`.
try self.interpreter?.invoke()
// Get the output `Tensor`
let confidenceOutputTensor = try self.interpreter?.output(at: 0)
let idOutputTensor = try self.interpreter?.output(at: 1)
// Copy output to `Data` to process the inference results.
let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let confidenceResults =
UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
let idResults =
UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
_ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
_ = idOutputTensor?.data.copyBytes(to: idResults)
postProcess(idResults, confidenceResults)
print("Successfully ran inference")
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error occurred creating model interpreter: \(error)")
}
}
实施后处理
最后,在这一步中,我们对模型的输出进行后处理,选择置信度最高的结果并删除包含的值(用户已经喜欢的电影)。将以下代码复制到您的应用程序中。
RecommendationsViewController.swift
// Postprocess to get results from tflite inference.
func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
for i in 0..<10 {
let id = idResults[i]
let movieIdx = getMovies().firstIndex { $0.id == id }
let title = getMovies()[movieIdx!].title
recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
}
}
测试您的应用程序!
重新运行您的应用程序。当您选择几部电影时,它应该会自动下载新模型并开始生成推荐!
11. 恭喜!
您已经使用 TensorFlow Lite 和 Firebase 在您的应用中构建了推荐功能。请注意,此 Codelab 中显示的技术和管道可以推广并用于提供其他类型的推荐。
我们涵盖的内容
- 火力地堡机器学习
- Firebase 分析
- 将分析事件导出到 BigQuery
- 预处理分析事件
- 训练推荐 TensorFlow 模型
- 导出模型并部署到 Firebase 控制台
- 在应用程序中提供电影推荐
下一步
- 在您的应用中实施 Firebase ML 建议。
了解更多
有一个问题?
报告问题
一、概述
欢迎使用 TensorFlow Lite 和 Firebase Codelab 的推荐。在此 Codelab 中,您将学习如何使用 TensorFlow Lite 和 Firebase 将推荐模型部署到您的应用。此代码实验室基于此 TensorFlow Lite示例。
推荐允许应用程序使用机器学习为每个用户智能地提供最相关的内容。他们考虑过去的用户行为,通过使用根据大量其他用户的聚合行为训练的模型,向用户推荐未来可能喜欢与之交互的应用程序内容。
本教程介绍如何使用 Firebase Analytics 从您的应用程序用户那里获取数据,构建机器学习模型以根据该数据提供建议,然后在 iOS 应用程序中使用该模型来运行推理并获得建议。特别是,我们的推荐将建议用户最有可能在给定用户之前喜欢的电影列表的情况下观看哪些电影。
你会学到什么
- 将 Firebase Analytics 集成到 Android 应用程序中以收集用户行为数据
- 将该数据导出到 Google Big Query
- 预处理数据并训练 TF Lite 推荐模型
- 将 TF Lite 模型部署到 Firebase ML 并从您的应用访问它
- 使用模型在设备推理上运行以向用户提出建议
你需要什么
- Xcode 11(或更高版本)
- CocoaPods 1.9.1(或更高版本)
您将如何使用本教程?
如何评价您构建 iOS 应用程序的体验?
2.创建Firebase控制台项目
将 Firebase 添加到项目中
- 转到Firebase 控制台。
- 选择创建新项目并将您的项目命名为“Firebase ML iOS Codelab”。
3.获取示例项目
下载代码
首先克隆示例项目并在项目目录中运行pod update
:
git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git cd codelab-contentrecommendation-ios/start pod install --repo-update
如果您没有安装 git,您还可以从其 GitHub 页面或单击此链接下载示例项目。下载该项目后,在 Xcode 中运行它并尝试使用建议来感受它的工作原理。
设置火力地堡
按照文档创建一个新的 Firebase 项目。获得项目后,从Firebase 控制台下载项目的GoogleService-Info.plist
文件并将其拖到 Xcode 项目的根目录。
将 Firebase 添加到 Podfile 并运行 pod install。
pod 'FirebaseAnalytics' pod 'FirebaseMLModelDownloader', '9.3.0-beta' pod 'TensorFlowLiteSwift'
在AppDelegate
的didFinishLaunchingWithOptions
方法中,在文件顶部导入 Firebase
import FirebaseCore
并添加一个配置 Firebase 的调用。
FirebaseApp.configure()
再次运行项目以确保应用程序配置正确并且不会在启动时崩溃。
- 确保启用“为此项目启用 Google Analytics”。
- 按照 Firebase 控制台中的剩余设置步骤,然后单击创建项目(或添加 Firebase,如果您使用的是现有的 Google 项目)。
4. 将 Firebase Analytics 添加到应用程序
在此步骤中,您将向应用添加 Firebase Analytics 以记录用户行为数据(在本例中为用户喜欢的电影)。此数据将在未来的步骤中汇总用于训练推荐模型。
在应用中设置 Firebase Analytics
LikedMoviesViewModel包含存储用户喜欢的电影的函数。每当用户喜欢一部新电影时,我们还想发送一个分析日志事件来记录这种喜欢。
添加以下代码以在用户点击电影时注册分析事件。
AllMoviesCollectionViewController.swift
import FirebaseAnalytics
//
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//
if movie.liked == nil {
movie.liked = true
Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
} else {
movie.liked?.toggle()
}
}
5. 测试您的 Analytics 集成
在此步骤中,我们将在应用程序中生成 Analytics 事件并验证它们是否被发送到 Firebase 控制台。
启用 Analytics 调试日志记录
通常,您的应用程序记录的事件会在大约一小时的时间内集中在一起并一起上传。这种方法可以节省最终用户设备的电池电量并减少网络数据使用量。但是,为了验证您的分析实施(以及为了在 DebugView 报告中查看您的分析),您可以在您的开发设备上启用调试模式,以便以最小的延迟上传事件。
要在您的开发设备上启用 Analytics 调试模式,请在 Xcode 中指定以下命令行参数:
-FIRDebugEnabled
此时,您已成功将 Firebase Analytics 集成到您的应用中。当用户使用您的应用程序并为电影点赞时,他们的点赞次数将被汇总记录。我们将在本 Codelab 的其余部分使用这些聚合数据来训练我们的推荐模型。以下是一个可选步骤,用于查看您在 Logcat 中看到的相同 Analytics 事件也流式传输到 Firebase 控制台。随意跳到下一页。
可选:在 Firebase 控制台中确认 Analytics 事件
- 转到Firebase 控制台。
- 在 Analytics 下选择DebugView
- 在 Xcode 中,选择运行以启动应用程序并将一些电影添加到您的“喜欢”列表中。
- 在 Firebase 控制台的 DebugView 中,验证在应用中添加电影时是否记录了这些事件。
6. 将 Analytics 数据导出到 Big Query
Big Query 是一款 Google Cloud 产品,可让您检查和处理大量数据。在此步骤中,您会将 Firebase 控制台项目连接到 Big Query,以便您的应用程序生成的 Analytics 数据自动导出到 Big Query。
启用大查询导出
- 转到Firebase 控制台。
- 选择Project Overview旁边的 Settings 齿轮图标,然后选择Project settings
- 选择集成选项卡。
- 在BigQuery块内选择链接(或管理)。
- 在关于将 Firebase 链接到 BigQuery步骤中选择下一步。
- 在Configure integration部分下,单击开关以启用发送 Google Analytics 数据并选择Link to BigQuery 。
您现在已启用 Firebase 控制台项目以自动将 Firebase Analytics 事件数据发送到 Big Query。这会自动发生,无需任何进一步交互,但是,在 BigQuery 中创建分析数据集的第一次导出可能不会在 24 小时内发生。创建数据集后,Firebase 不断将新的 Analytics 事件导出到 Big Query 到日内表中,并在事件表中对过去几天的事件进行分组。
训练推荐模型需要大量数据。由于我们还没有生成大量数据的应用程序,因此在下一步中,我们会将示例数据集导入 BigQuery 以用于本教程的其余部分。
7.使用BigQuery获取模型训练数据
现在我们已经连接了 Firebase 控制台以导出到 BigQuery,我们的应用分析事件数据将在一段时间后自动显示在 BigQuery 控制台中。为了获得本教程所需的一些初始数据,在此步骤中,我们会将现有示例数据集导入您的 BigQuery 控制台,以用于训练我们的推荐模型。
将示例数据集导入 BigQuery
- 转到 Google 云控制台中的BigQuery仪表板。
- 在菜单中选择您的项目名称。
- 在 BigQuery 左侧导航的底部选择您的项目名称以查看详细信息。
- 选择创建数据集以打开数据集创建面板。
- 输入“firebase_recommendations_dataset”作为数据集 ID ,然后选择创建数据集。
- 新数据集将显示在项目名称下方的左侧菜单中。点击它。
- 选择创建表以打开表创建面板。
- 对于从选择“Google Cloud Storage”创建表。
- 在“从 GCS 存储桶中选择文件”字段中,输入“gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt”。
- 在文件格式下拉列表中选择“JSONL”。
- 输入“recommendations_table”作为表名。
- 选中Schema > Auto detect > Schema 和输入参数下的复选框
- 选择创建表
探索示例数据集
此时,您可以选择探索架构并预览此数据集。
- 在左侧菜单中选择firebase-recommendations-dataset以展开其中包含的表。
- 选择recommendations-table表以查看表架构。
- 选择预览以查看此表包含的实际 Analytics 事件数据。
创建服务帐户凭据
现在,我们将在我们的 Google Cloud 控制台项目中创建服务帐户凭据,我们可以在接下来的步骤中在 Colab 环境中使用它来访问和加载我们的 BigQuery 数据。
- 确保为您的 Google Cloud 项目启用了结算功能。
- 启用 BigQuery 和 BigQuery Storage API API。 <点击这里>
- 转到创建服务帐户密钥页面。
- 从Service account列表中,选择New service account 。
- 在服务帐户名称字段中,输入一个名称。
- 从角色列表中,选择项目>所有者。
- 单击创建。包含您下载到计算机的密钥的 JSON 文件。
在下一步中,我们将使用 Google Colab 预处理这些数据并训练我们的推荐模型。
8.预处理数据和训练推荐模型
在此步骤中,我们将使用 Colab notebook 执行以下步骤:
- 将 BigQuery 数据导入 Colab 笔记本
- 预处理数据以为模型训练做准备
- 在分析数据上训练推荐模型
- 将模型导出为 TF lite 模型
- 将模型部署到 Firebase 控制台,以便我们可以在我们的应用程序中使用它
在启动 Colab 培训笔记本之前,我们将首先启用 Firebase 模型管理 API,以便 Colab 可以将经过培训的模型部署到我们的 Firebase 控制台。
启用 Firebase 模型管理 API
创建存储桶来存储您的 ML 模型
在您的 Firebase 控制台中,转到存储并单击开始。
按照对话设置您的存储桶。
启用 Firebase ML API
转到 Google Cloud Console 上的Firebase ML API 页面,然后单击启用。
使用 Colab Notebook 训练和部署模型
使用以下链接打开 colab notebook 并完成其中的步骤。在 Colab notebook 中完成这些步骤后,您将有一个 TF lite 模型文件部署到 Firebase 控制台,我们可以将该文件同步到我们的应用程序。
在 Colab 中打开
9. 在您的应用程序中下载模型
在此步骤中,我们将修改我们的应用程序以下载我们刚刚从 Firebase Machine Learning 训练的模型。
添加 Firebase ML 依赖项
需要以下依赖项才能在您的应用中使用 Firebase 机器学习模型。它应该已经被添加(验证)。
播客文件
import FirebaseCore
import FirebaseMLModelDownloader
使用 Firebase Model Manager API 下载模型
将下面的代码复制到ModelLoader.swift中,以设置模型下载发生的条件,并创建一个下载任务以将远程模型同步到我们的应用程序。
模型加载器.swift
static func downloadModel(named name: String,
completion: @escaping (CustomModel?, DownloadError?) -> Void) {
guard FirebaseApp.app() != nil else {
completion(nil, .firebaseNotInitialized)
return
}
guard success == nil && failure == nil else {
completion(nil, .downloadInProgress)
return
}
let conditions = ModelDownloadConditions(allowsCellularAccess: false)
ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
switch (result) {
case .success(let customModel):
// Download complete.
// The CustomModel object contains the local path of the model file,
// which you can use to instantiate a TensorFlow Lite classifier.
return completion(customModel, nil)
case .failure(let error):
// Download was unsuccessful. Notify error message.
completion(nil, .downloadFailed(underlyingError: error))
}
}
}
10. 在您的应用中集成 Tensorflow Lite 推荐模型
Tensorflow Lite 运行时将允许您在应用程序中使用您的模型来生成建议。在上一步中,我们使用下载的模型文件初始化了一个 TFlite 解释器。在此步骤中,我们将首先在推理步骤中加载字典和标签以伴随我们的模型,然后我们将添加预处理以生成模型的输入和后处理,我们将从推理中提取结果.
加载字典和标签
推荐模型用于生成推荐候选的标签列在资产文件夹中的文件sorted_movie_vocab.json中。复制以下代码以加载这些候选人。
RecommendationsViewController.swift
func getMovies() -> [MovieItem] {
let barController = self.tabBarController as! TabBarController
return barController.movies
}
实施预处理
在预处理步骤中,我们更改输入数据的形式以匹配我们的模型所期望的。在这里,如果我们还没有产生很多用户喜欢,我们会用占位符值填充输入长度。复制以下代码:
RecommendationsViewController.swift
// Given a list of selected items, preprocess to get tflite input.
func preProcess() -> Data {
let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
return MovieItem.id
}
var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))
// Pad input data to have a minimum of 10 context items (4 bytes each)
while inputData.count < 10*4 {
inputData.append(0)
}
return inputData
}
运行解释器以生成建议
在这里,我们使用在上一步中下载的模型对预处理的输入进行推理。我们为我们的模型设置输入和输出的类型并运行推理以生成我们的电影推荐。将以下代码复制到您的应用程序中。
RecommendationsViewController.swift
import TensorFlowLite
RecommendationsViewController.swift
private var interpreter: Interpreter?
func loadModel() {
// Download the model from Firebase
print("Fetching recommendations model...")
ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
guard let path = filePath else {
if let error = error {
print(error)
}
return
}
print("Recommendations model download complete")
self.loadInterpreter(path: path)
}
}
func loadInterpreter(path: String) {
do {
interpreter = try Interpreter(modelPath: path)
// Allocate memory for the model's input `Tensor`s.
try interpreter?.allocateTensors()
let inputData = preProcess()
// Copy the input data to the input `Tensor`.
try self.interpreter?.copy(inputData, toInputAt: 0)
// Run inference by invoking the `Interpreter`.
try self.interpreter?.invoke()
// Get the output `Tensor`
let confidenceOutputTensor = try self.interpreter?.output(at: 0)
let idOutputTensor = try self.interpreter?.output(at: 1)
// Copy output to `Data` to process the inference results.
let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})
let confidenceResults =
UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
let idResults =
UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
_ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
_ = idOutputTensor?.data.copyBytes(to: idResults)
postProcess(idResults, confidenceResults)
print("Successfully ran inference")
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error occurred creating model interpreter: \(error)")
}
}
实施后处理
最后,在这一步中,我们对模型的输出进行后处理,选择置信度最高的结果并删除包含的值(用户已经喜欢的电影)。将以下代码复制到您的应用程序中。
RecommendationsViewController.swift
// Postprocess to get results from tflite inference.
func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
for i in 0..<10 {
let id = idResults[i]
let movieIdx = getMovies().firstIndex { $0.id == id }
let title = getMovies()[movieIdx!].title
recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
}
}
测试您的应用程序!
重新运行您的应用程序。当您选择几部电影时,它应该会自动下载新模型并开始生成推荐!
11. 恭喜!
您已经使用 TensorFlow Lite 和 Firebase 在您的应用中构建了推荐功能。请注意,此 Codelab 中显示的技术和管道可以推广并用于提供其他类型的推荐。
我们涵盖的内容
- 火力地堡机器学习
- Firebase 分析
- 将分析事件导出到 BigQuery
- 预处理分析事件
- 训练推荐 TensorFlow 模型
- 导出模型并部署到 Firebase 控制台
- 在应用程序中提供电影推荐
下一步
- 在您的应用中实施 Firebase ML 建议。
了解更多
有一个问题?
报告问题