Fizz Buzz in Tensorflow-一场奇怪的面试(译)

原文地址:http://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow(作者:Joel Grus)

话说Fizz Buzz是什么鬼?

Fizz Buzz是洋人小朋友在学除法时常玩的游戏,玩法是:从1数到100,如果遇见了3的倍数要说Fizz,5的倍数就说Buzz,如果即是3的倍数又是5的倍数就说FizzBuzz。

最后演变为一个编程面试题:写一个程序输出1到100,但是如果遇到数字为3的倍数时输出Fizz,5的倍数输出Buzz,既是3的倍数又是5的倍数输出FizzBuzz。

面试中

面试官:你好,在开始面试之前要不要来杯水或来杯咖啡提提神。

:不用,咖啡啥的我已经喝的够多了,三鹿也喝了不少。

面试官:很好,很好,你不介意在小白板上写代码吧。

:It’s the only way I code!

面试官:….

:那只是个笑话。

面试官:好吧,你是否熟悉”fizz buzz”。

:….

面试官:你到底知不知道”fizz buzz”?

:我知道”fizz buzz”,我只是不敢相信这么牛叉的IT巨头竟然问这个问题。

面试官:OK,我要你现在写一个程序输出1到100,但是遇到数字为3的倍数时输出Fizz,5的倍数输出Buzz,既是3的倍数又是5的倍数输出FizzBuzz。

:额,这个,我会!

面试官:很好,我们发现不会解这个问题的人不能胜任我们这里的工作。

:….

面试官:这是板擦和马克笔。

:[想了几分钟]

面试官:需不需要帮忙。

:不,不用。首先先容我导入一些标准库:

面试官:你知道我们的问题是”fizz buzz”吧?

:当然,现在让我们来讨论一下模型,我正在想一个简单的只有一个隐藏层的感知器。

面试官:感知器?

:或神经网络,不管你怎么叫它。给它输入数字,然后它能给我们输出数字对应的”fizz buzz”。但是,首先我们需要把数字转为向量,最简单的方法是把数字转换为二进制表示。

面试官:二进制?

:你懂的,就是一堆0和1,像这样:

面试官:[盯着小白板看了一分钟]

:输出应该用one-hot编码表示”fizz buzz”:

面试官:等一等,够了!

:没错,基本的准备工作已经完成了。现在我们需要生成一个训练数据,我们不用1到100训练,为了增加难度,我们使用100-1024训练:

面试官:….

:现在就可以使用TensorFlow搭模型了,我还不太确定隐藏层要使用多少”神经元”,10,够不?

面试官:….

:100也许要好点,以后还可以再改:

定义输入和输出:

面试官:你到底要搞哪样。

:哦,这个网络只有两层深,一个隐藏层和一个输出层。下面,让我们使用随机数初始化“神经元”的权重:

现在我们可以定义模型了,就像我前面说的,一个隐藏层。激活函数用什么呢,我不知道,就用ReLU吧:

我们可以使用softmax cross-entrop做为coss函数,并且试图最小化它。

面试官:….

:当然,最后还要取概率最大的预测做为结果:

面试官:在你偏离轨道过远之前,我要提醒你,我们的问题是生成1到100的”fizz buzz”。

:哦,没错,现在predict_op输出的值是0-3,还要转换为”fizz buzz”输出:

面试官:….

:现在我们可以训练模型了,首先创建一个session并初始化变量:

就训练1000个大周天吧。

面试官:….

:也许不够,为了保险就训练10000个大周天。我们的训练数据是生成的序列,最好在每个大周天随机打乱一下:

每次取多少个样本进行训练,我不知道,128怎么样?

训练:

我们还能看准确率:

面试官:你是认真的吗?

:是,看准确率提升曲线非常有帮助。

面试官:….

:模型训练完了,现在是fizz buzz时间。给模型输入1-100的二进制表示:

预测fizz buzz,大功告成:

面试官:….

:这就是你要的”fizz buzz”。

面试官:够了,我们会在联系你。

:联系我!这可真喜人。

面试官:….

后记

我没有得到offer,于是我运行了一下这个代码,事实证明有一些输出是错的。感谢机器学习十八代!!

也许我应该使用更深的网络。

如要转载,请保持本文完整,并注明作者@斗大的熊猫和本文原始地址: http://blog.topspeedsnail.com/archives/11010

相关文章

《Fizz Buzz in Tensorflow-一场奇怪的面试(译)》有5个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注