机器学习烘焙

2021-01-30 06:48:15

像许多人一样,我在家做些娱乐,烤一吨,谈论我的发酵面团,就像是一个真实的人。我很擅长遵循食谱,但我决定进一步走一步,并了解将蛋糕与面包或曲奇区分开的背后的科学。我也喜欢机器学习,所以我想:如果我可以将其与烘焙结合起来呢?

我将首先解释为什么烘烤会带来有趣的ML问题。然后,我将向您展示如何收集自己的数据集,训练简单的模型,部署它,构建一个小应用程序以获取预测并使用该模型发明新的配方。如果您只是来这里菜谱,我想您可以跳过。

也许您在想,难道您不只是读一本书甚至一篇博客文章来解释构成不同烘焙食品的糖,脂肪和面粉的比例吗?当然可以。但是这些天我的注意力跨度很短,而且这种方法并没有真正扩大规模。如果我学到了足够的知识来开始发明自己的食谱,那么这只会直接使那些可以食用它们的人们受益,而目前这些人并不多。

现在,也许您在想,我们不能用传统编程解决这个问题吗?例如,如果面包的典型面粉:液体比率为5:3,我可以编写如下程序:

这种工作,但是很快就会变得笨拙。如果面粉与水的比例接近但不精确为5:3,该怎么办?如果我不仅要预测面包怎么办?而且,如果我不希望将成分数量转换为比例怎么办?我很懒惰(在某些方面),我想输入我的成分数量而不做任何数学运算,然后神奇地告诉我它的意思。

这非常适合ML,因为我可以收集配方数据并训练模型以识别该数据中的模式。由于很多人都写过有关烘焙率的文章,所以我假设有一些关于烘焙率的高级模型可以教给我学习模型。

希望到目前为止,我已经说服了您,这将是一个有趣的机器学习问题。但是也许您仍然持怀疑态度,并且您想知道:这有什么意义?遵循食谱时,您是否不知道要烘烤什么?有一个模型告诉您您已经知道的东西似乎很愚蠢。如果我只是将现有配方输入模型并要求其进行预测,那么所有这些都是对的。不过请记住,我这样做的全部原因是要学习使蛋糕成为蛋糕而不是饼干的东西。然后,我可以尝试不同的比例来创建新配方。也许我想发明一种模型认为是50%蛋糕,50%cookie的东西。

我找不到现有的基本烘焙原料数据集,因此我决定创建自己的非常小的烘焙原料。幸运的是,互联网上不乏食谱,我发现33种食谱(包括面包,蛋糕和饼干)构成了总共99种食谱的数据集。为使此问题相对简单,我仅查看以下内容:

面粉:如果食谱要求使用不同类型的面粉,我将其全部计入面粉量

我知道,我使用的是杯子和茶匙,而不是像克这样更通用的东西。如果我的小模型大受欢迎,我将尝试增加对公制的支持。

在收集数据时,我尽力将各种类型的面包,蛋糕和饼干包括在内,以便该模型可以处理各种各样的烘焙食品。

我想到了可以将成分输入直接输入到机器模型中的想法,因为ML模型输入需要数字化。不完全的。当前格式的数据存在一些问题。

首先,我的电子表格包含多种单位:我正在使用杯子中的某些成分,使用茶匙中的其他成分,鸡蛋只是鸡蛋。我不希望我的模型认为1单位面粉与1单位酵母相同(您能想象在那里会发生什么吗?)。由于我的大部分数据都在杯子里,所以我决定将其他所有内容都转换为杯子。对于茶匙来说,这非常简单,因为1茶匙大约是0.02杯。对于鸡蛋,经过一些研究,我确定了一个鸡蛋,约0.2杯。它并不完美,但现在所有内容都在同一单元中。

接下来,我需要一种扩展数据的方法。一些食谱制作了两个巨大的蛋糕,而另一些食谱则制作了一小块面包。将所有配料量转换为相同的比例将确保我的模型不会对更大的食谱给予更多的重视。我决定通过将每种成分转换为总配方的百分比来缩放数量。为此,我取了每一行的总和,然后将每种成分除以总和得出其百分比。上方屏幕截图中的面包配方变为:

我的99个配方全部转换为相同的单位并按比例缩放后,就可以构建和训练模型了。

我将为此模型使用TensorFlow的Keras API,这使得模型代码非常简短:

我的模型输出是一个softmax数组,这意味着它将输出特定食谱是面包,蛋糕或曲奇的顺序的概率。 Softmax意味着所有概率都将加1。因此,97%的面包预测可信度如下所示:

经过训练,我的模型达到了90%的准确性。太酷了!但是我可以相信它,还是它过度拟合了训练数据?

definitely这绝对不是ML的最佳做法,但我将在真实的生产数据上测试我的模型。通常是因为我厌倦了将足够多的食谱复制到电子表格中以进行测试的过程。不要在家尝试this

该模型以84%的置信度预测Cookie。听起来很合理。边缘情况如何,例如没有酵母或发酵剂的面包?咱们试试吧:

我的模特说面包有99%的信心,不错!如果我改写了一系列的if语句来处理这种情况,那么您会发现它很快就会变得很长。

我不想成为唯一使用此模型的人,因此是时候部署它了。我将其部署到Google Cloud AI Platform Prediction。为此,我需要使用TensorFlow model.save()方法将我的模型资产保存到Cloud Storage Bucket。然后,我可以使用gcloud从命令行部署模型,将其指向已保存模型的存储桶路径。

保存TensorFlow模型时,可以将其传递给本地文件路径或Cloud Storage存储桶。在这里,我将其直接传递给我的GCS存储桶:

这样,我准备使用gcloud进行部署(您也可以通过UI或API进行部署):

! gcloud ai-平台版本可创建' v1' \-模型'烘焙' \-来源gs:// path / to / saved / model' \-运行时-版本2.1 \-框架TENSORFLOW \-python-版本3.7

部署模型后,您将在云控制台中看到它,如下所示:

to向我的队友大卫大喊大叫,以帮助他在网络应用中🙏

如果我有一个基本的Web应用程序来对模型进行预测,那将很有趣。这样,我可以快速尝试不同的成分比例。请记住,我的模型需要将所有成分输入都转换为杯子,然后按总配方的百分比进行缩放。这意味着如果我让人们自己进行这些计算,那么这可能应该在服务器端处理– Cloud Functions的一个很好的用途:

我将使用Python运行时并编写一个函数,该函数以用户友好的单位输入成分输入,然后将其转换为杯子,然后转换为百分比。通过相同的功能,我可以将缩放后的输入发送到我的模型,并向Web应用返回清晰易读的预测。下面是该功能的摘要,您可以在本要点中找到所有功能。

def get_prediction(请求):data = request。 get_json()prescaled = dict(zip(列,数据))scaled = scale_data(prescaled)#将缩放后的输入发送到模型预测中39;,scaled)#获取具有最高置信度预测的项目prediction_ind = np。 argmax(预测)label_map = [' Bread' ,'蛋糕' ,' Cookies' ] baked_prediction = label_map [predicted_ind]置信度= str(如果round_prediction_prediction ==' Bread' :表情符号=面包! 🍞"埃尔夫·巴克_prediction =='蛋糕' :表情符号=蛋糕! 🧁"埃尔菲·巴克_prediction ==' Cookies' :表情符号=饼干! 🍪"返回" {} {}%置信度" 。格式(表情符号,置信度)

这是应用程序!首先,我很幸运能与才华横溢的人们一起工作。我在Twitter上发布了该Web应用程序的早期版本,David自愿使它看起来更好:

如果您想自己玩耍,那就在这里。我敢肯定,您会尝试做一些奇怪的事情(毕竟这是互联网),请记住,该模型只接受了最少的数据训练,并且只知道3件事:面包,蛋糕和饼干。因此,如果您输入布朗尼蛋糕或其他任何配料的成分,则将尽其最大的努力将其分为已知的3类。可以把它想像成一个只知道三个字的婴儿。例如,如果我输入10,000个鸡蛋而没有其他输入,该模型将预测96%的蛋糕。这就是机器学习的美。它是垃圾,垃圾。

我的实验的重点是看我是否能够理解成分比率,从而足以开始发明自己的食谱。我在模型中玩转,发现各种成分的组合使它预测出50%的蛋糕机率和50%的cookie机率。我想知道……如果我真的做到了会怎样?所以我做了。结果如下:

很好吃奇怪的是,如果我告诉机器制作蛋糕曲奇,它的味道就像我想像的那样。我的未婚夫同意。

我从来没有做过自己的食谱,虽然我希望您能品尝到它,但您可以拥有下一个最好的东西-食谱!我添加了两种成分来添加一些额外的风味,这些成分不属于我的模型输入(香草精和巧克力片),但其余成分严格遵守我的模型告诉我的内容,即50%的蛋糕和50%的饼干。我给你吃芝士。

将烤箱预热至350华氏度。用烹饪喷雾剂或黄油在6英寸的蛋糕盘上轻轻润滑。如果您没有6英寸的蛋糕盘,也可以使用一块面包盘(如果您尝试这样做,请告诉我!)。

将黄油切成小块,放入搅拌机中。以中速混合黄油至光滑。加入两种糖,混合直至混合。然后加入鸡蛋,油和香草精。

在另一个碗中,搅拌面粉,发酵粉和盐。将其缓慢加入黄油混合物中,低速混合直至完全混合。如果您喜欢,可以混合巧克力片。

烘烤25分钟,或直到插入中心的牙签干净为止。与我不同的是,先将烤盘在锅中冷却至少20分钟,然后再取出。

这是一个有趣的ML实验,产生了新的甜点。我首先编译了一个由99个食谱组成的小数据集,然后使用该数据集训练TensorFlow模型来根据成分预测某物是面包,蛋糕还是曲奇。然后我将其部署到AI Platform Prediction,并构建了一个通过Python Cloud Function调用模型的Web应用程序。最后,我使用部署的模型发明了一种新的甜点,该甜点将永远被称为cakie。以下是一些有用的链接:

我很想听听您对这篇文章的看法,无论您是关于ML还是食谱。😋在Twitter上@SRobTweets找到我。