【技术】通过梯度下降逆向工程获取食品中不同成分的含量

这是一个外国人突发奇想(xiande danteng),用技术去了解包装食品各种成分含量的记录文章,文末附代码链接。

为了学习新的东西,我产生了一些奇怪的想法并写下这篇文章。这是一个小型的实验,我猜了包装食品中每种成分的不同含量。基于成分表和营养成分标签,我把这个任务表述成一个线性回归问题,以成分百分比作为参数。为了执行优化(梯度下降),我使用了最近很流行的官方推荐的深度学习库,PyTorch。

pytorch链接:http://pytorch.org/

我喜欢下厨,但并不总是有时间做饭。当我做的时候,我试着用一种非常科学的方法。例如,我喜欢简化并解密老奶奶食谱。在这个过程中,我可能必须控制好食物的数据,特别是营养数据(也就是碳水化合物,蛋白质,脂肪,盐等)。

在这个实验中,我试图通过使用大多数包装食品都带有的营养成分表来找到食谱中缺失的成分百分比。我的直觉告诉我,这样有足够的数据尝试会找到实际的配方。

注意:我们当然还有其他方法可以找到成分是什么,但是在这个大家都使用Alchemy的时代,为什么不在这个问题上使用梯度下降呢?

让我们以使用了棕榈油的Nutella为例。

成份如下:

糖、棕榈油、榛子粉、可可、脱脂奶粉、低矿物质乳清、磷脂作为乳化剂、香草精:人造香味剂。

权重

在我的线性回归模型中,参数(权重)是不同成分的克数:

  • w1是100gNutella中糖的量,
  • w2是100gNutella棕榈油的量,
  • 等等…

在某些情况下,一些百分比是已知的。欧洲Nutella就是这种情况,我们知道健康成分(榛子粉,可可等)的数量。在这种情况下,权重被设定为固定值,不可训练。

输入和输出

现在的营养成分标签:

每个营养成分成为训练的观察和例子(x,y)。

我们以全脂肪(Total Fat)成分为例,它产生了一个(x,y)元组。

x是包含每种成分中脂肪百分比的行向量:

  • x1是糖中脂肪的百分比(0%)
  • x2棕榈油中脂肪的百分比(100%)

这些还很简单。但是对于某些成分来说,很难猜测它的构成(比如卵磷脂,lecithin)。对于这个实验,我使用了了美国农业部的营养数据库,其中包含大部分基本成分的信息。

注意:有这个数据库并不意味着万事大吉了,因为营养成分的变化很大(比如榛子粉有不同的品种,你可以选择烘烤加工过的或者没有烘烤过的,可可也可以选择没有加工过的或者低脂的…)

最深的一层神经网络的另一面,y是一个标量,包含最终产品中的脂肪量。这些信息可以很容易地在营养成分表中找到: Nutella每份12克脂肪,或者使用更加文明的营养标识系统:31%(法国)

由于这个标签非常冗长,我们可以得到大约十个(x,y)样本。

训练

当然,在模型中,线性单位没有偏置。在食品配料中没有未知的东西,所有的东西都以总量的权重总和来计算。

在PyTorch中声明所有这些是相对容易的(这是我第一次用它),这个库是简单明了,我想我现在理解为什么那么多人疯狂安利它了。现在,我们可以减少原始的L2损失吗?不,为了它收敛于一个合理的局部最小值,我们必须在模型上设置很多限制条件,比如可可的量不能是负数。

特定领域的约束

  • 质量不能为负(我是认真的)
  • 固定某些权重(当它的百分比已知时)
  • 质量总和必须等于100g
  • 并且,重量要按降序排列(食品成分在包装上也按降序排列)

其中一些约束在更新权重时强制执行,另一些则通过损失函数中的“炼金”技巧来实施。

我用整个数据集(批量梯度下降)来计算每一步的损失函数。结果如下:

成分:糖(50.8%),棕榈油(19.7%),榛子粉(13.0%),可可(7.4%),脱脂奶粉(6.6%),乳化剂(1%*)

(*)乳化剂保持在1%以下(只是一种添加剂)

我承认得到的结果并没有什么令人眼前一亮的点。但我认为,实现的过程往往比结果更重要,希望你喜欢它!

附:花生巧克力成分

我还试图了解著名的Reese花生巧克力杯的成分。

这个任务非常困难,,没有人知道10种不同的成分的比例。

有两种复合成分,每种都有自己的成分列表:牛奶巧克力涂层和花生酱填充物。

成分:牛奶巧克力(62%)[糖(20.3g),可可脂(16.0g),可可块(6.3g),无脂牛奶(6.3g),乳脂(6.3g),乳糖(6.3g)乳化剂(0.3g)]花生馅(38%)[花生(18.7g),葡萄糖(18.7g),盐(0.7g)]

代码:https://github.com/jctestud/food-reverse-engineering

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-12-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏利炳根的专栏

学习笔记 TF059 :自然语言处理、智能聊天机器人

自然语言处理,语音处理、文本处理。语音识别(speech recognition),让计算机能够“听懂”人类语音,语音的文字信息“提取”。

6042
来自专栏大数据文摘

暑期追剧学AI | 十分钟搞定机器学习中的数学思维(二)

1312
来自专栏大数据文摘

剑桥大学研究院总结:26条深度学习经验

2406
来自专栏专知

【干货荟萃】机器学习&深度学习知识资料大全集(二)(论文/教程/代码/书籍/数据/课程等)

【导读】转载来自ty4z2008(GItHub)整理的机器学习&深度学习知识资料大全荟萃,包含各种论文、代码、视频、书籍、文章、数据等等。是学习机器学习和深度学...

34112
来自专栏媒矿工厂

视频编码性能提升新途径——面向编码的动态预/后处理技术

2017年9月17日至20日,IEEE国际图像处理会议(ICIP 2017)在北京国家会议中心举办,国内外许多学术界以及工业界的专家学者们都与会进行交流与讨论。...

4045
来自专栏SIGAI学习与实践平台

人脸识别中的活体检测算法综述

原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的。

3444
来自专栏机器学习之旅

python开发:基于SSD下的图像内容识别(一)1.首先,先看一下我们能达到什么样的效果:2.我们需要做哪些基本的步骤:

鸽了将近有一个月的时间没有更新东西,真的不是因为我懒,主要在忙一些工作上的事情,然后就是被安装caffe环境折磨的死去活来。我本来用的上mba来搭caffe环境...

703
来自专栏有趣的Python

TensorFlow应用实战-10-GAN介绍

1884
来自专栏AI启蒙研究院

别人都在晒18岁照片,而我却在学习~

663
来自专栏AI研习社

模型优化:如何加快学习!深度学习之父的神经网络第六课(中文字幕)

作为深度学习祖师,Geoffrey Hinton 的每一句每一言,都使学习者如奉纶音。浓缩其毕生所学的《Neutral Network for Machine ...

3699

扫码关注云+社区