一切如何开始
一切始于苹果市场-我发现他们有一个确定西瓜成熟度的程序。 该程序...很奇怪。 至少可以用电话来敲西瓜不是值得的,至少可以是值得的! 不过,我想在一个更加熟悉的Android平台上重复这一成就。
工具选择
我们的问题可以通过多种方式解决,老实说,我不得不做出很大的努力,不要走“简单”的道路。 也就是说,采用傅立叶变换,小波和信号编辑器。 但是,我想获得有关神经网络的经验,所以让网络进行数据分析。
TensorFlow和Theano的Google插件Keras被选为创建和训练神经网络的库。 通常,如果您只是开始使用深度学习网络,则最好不要找到工具。 一方面,Keras是一种功能强大的工具,针对速度,内存和硬件进行了优化(是的,它可以在视频卡及其群集上使用)。 另一方面,可以从用户那里“隐藏”的所有东西都隐藏在这里,因此,您不必将脑筋放在神经网络各层的对接上。 很舒服
正如Keras以及一般的神经网络一样,都需要Python的知识-这种语言,就像一条缠在蛇上的蛇...对不起,已被淘汰。 简而言之,如果没有Python,您不应该介入现代深度学习。 幸运的是,在极端情况下-一个月内,可以在两周内研究Python。
您将需要更多的Python库,但是这些都是琐碎的-我的意思是,如果您自己处理过Python。 它将需要(非常肤浅地)与NumPy,PyPlot以及可能的几个库相识,从中我们实际上要采用几个函数。 不难 事实是。
好吧,总之,我注意到我们不需要上面提到的视频卡群集-我们的任务通常在计算机CPU的帮助下-缓慢但不是很慢。
工作计划
首先,您需要在Ubuntu下的Python和Keras上创建神经网络。 您可以-在模拟器Ubunta上。 您可以-对于Windows,但是花费的额外时间足以让您学习所提到的Ubuntu,然后在其中进行研究。
下一步是编写程序。 我计划在Android下的Java中执行此操作。 从某种意义上说,这将是程序的原型,它将具有一个用户界面,但是还没有神经网络。
你问写“安抚奶嘴”是什么意思。 但这就是问题:与数据分析有关的任何任务迟早都取决于对数据的搜索-用于训练我们的程序。 实际上,应该挖掘并品尝多少西瓜,以便神经网络可以基于此数据建立可靠的模型? 一百? 还有吗
在这里,我们的程序将为我们提供帮助:将其上传到Google Play,分发给所有不幸运拥有Android手机的朋友(好吧,强加于手,扭动手臂),数据,微小的数据流开始流淌……顺便问一下,在哪里?
下一步是编写一个服务器程序,从我们的android客户端接收数据。 确实,此服务器程序非常简单,我在大约二十分钟内完成了所有操作。 但是,尽管如此,这是一个单独的阶段。
最后,足够的数据。 我们训练神经网络。
我们使用Java移植神经网络,并发布程序更新。
获利 虽然没有。 该程序是免费的。 只有经验和颠簸。
创建一个神经网络
使用音频(当然是在西瓜上敲打)是循环神经网络或所谓的一维进化网络。 此外,近年来,进化网络已明确地处于主导地位,取代了经常性的进化网络。 卷积网络的思想是,窗口在数据阵列(“声音强度-时间”图)上滑动,而不是分析成千上万的样本,我们只处理进入窗口的内容。 以下各层组合并分析了该层的结果。
为了更清楚地说明,假设您需要在海洋景观的照片中找到一只海鸥。 您扫描图片-注意的“窗口”沿着虚构的行和列移动,以寻找白色对勾。 这就是2D卷积网络的工作方式,而一维网络则沿一个坐标扫描-如果我们要处理音频信号,这是最佳选择。
但是,我注意到没有必要专注于一维网络。 作为练习,我绘制了声音,并使用2D卷积网络将生成的位图分析为图片。 令我惊讶的是,结果并不比分析“原始一维”数据时差。
使用的网络具有以下结构:
model = Sequential() model.add(Conv1D(filters=32, kernel_size=512, strides=3, padding='valid', use_bias=False, input_shape=(nSampleSize, 1), name='c1d', activation='relu')) model.add(Activation('relu', input_shape=(nSampleSize, 1))) model.add(MaxPooling1D(pool_size=(2))) model.add(Conv1D(32, (3))) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=(2))) model.add(Conv1D(64, (3))) model.add(Activation('relu')) model.add(MaxPooling1D(pool_size=(2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(nNumOfOutputs))
该网络具有两个输出值(它预测两个值):甜度和成熟度。 甜度分别为0(不加糖),1(正常)和2(极好),以及成熟度,0太硬,1是您所需要的,2太熟,就像带沙子的棉绒一样。
测试样本的等级由人决定,确切地由人确定-我们将在Android程序的部分中进行讨论。 神经网络的任务是预测一个人给定西瓜的等级(根据水龙头)。
编写程序
我已经提到该程序应该有两个版本。 首先,初步诚实地警告用户她的预测完全是胡说八道。 但是,它允许用户记录西瓜的敲门声,对西瓜的味道进行评分并通过Internet将其发送给程序的作者。 也就是说,第一个版本只是收集数据。
这是该
程序在Google Play上的
页面 ,当然,该程序是免费的。
她是做什么的:
1.用麦克风按按钮,录音开始。 您有5秒钟的时间打了3次西瓜-敲敲敲敲。 带有西瓜的按钮会做出“预测”,我们尚未触摸它。
注意-如果Google使用的是旧版本,则将录音和预测结合在一个带有西瓜的按钮中,但是没有一个带有麦克风的按钮。

2.保存的文件是临时文件,下次您按下“录制”按钮将被覆盖。 这样,如果有人说手挽手(您无法想象让其他人闭嘴五秒钟是多么困难!),您就可以重复轻拍。或者水太吵了–盘子在响–邻居在钻...
但是现在选择了西瓜并购买了。 您将其带回家,录制了声音并将其剪切。 现在,您可以评估它的味道了。 选择保存选项卡。
在此选项卡上,我们看到两个用于评分的组合框-甜度和成熟度(甜度和成熟度,翻译工作正在进行中)。 标记-单击保存。
注意! 保存只能单击一次。 因此,首先要标记一个标记。 只需按一下按钮,声音文件便被重命名,现在,下次录制时将不会删除它。

3.最后,在录制(并因此吃了)十几个西瓜之后,您从没有互联网的小屋返回。 现在是互联网。 打开“提交”选项卡,然后按按钮。 该程序包(带有十二个西瓜)将发送到开发人员的服务器。

编写服务器程序
这里的一切都很简单,所以我最好为该脚本布置完整的代码。 该程序会“捕获”文件,为它们提供唯一的名称,并将其放置在站点所有者只能访问的目录中。
<?php if (is_uploaded_file($_FILES['file']['tmp_name'])) { $uploads_dir = './melonaire/'; $tmp_name = $_FILES['file']['tmp_name']; $pic_name = $_FILES['file']['name']; $filename = md5(date('Ymd H:i:s:u')); move_uploaded_file($tmp_name, $uploads_dir.$filename); } else { echo "File not uploaded successfully."; } ?>
神经网络训练
数据分为训练和测试,分别为70%和30%。 神经网络-收敛。 但是,对于初学者来说,这并不奇怪:不要忘记对输入数据进行规范化,这将为您省去很多麻烦。 像这样:
for file_name in os.listdir(path): nSweetness, nRipeness, arr_loaded = loadData(file_name) arr_data.append(arr_loaded / max(abs(arr_loaded)))
移植神经网络
有多种方法可以将网络从Python环境移植到Java。 最近,Google简化了此过程,因此,如果您阅读教科书,请确保它们没有过时。 这是我的操作方式:
from keras.models import Model from keras.models import load_model from keras.layers import * import os import sys import tensorflow as tf
注意最后一行:在Java代码中,您将需要指定网络的输入和输出名称。 此“打印”仅打印它们。
因此,我们将接收到的文件coordted.pb放入Android Studio中该项目的资产目录中,连接tensorflowinferenceinterface库(请参见
此处 ,或者更好的是,
此处 ),仅此而已。
仅此而已。 当我第一次这样做时,我以为这很困难,但是...它在第一次尝试时就奏效了。
这是从Java代码进行的神经网络调用的样子:
protected Void doInBackground(Void... params) { try {
这里m_arrInput是一个包含两个元素的数组-是的! -我们的预测,从零标准化为一。
结论
在这里,似乎应该感谢您的关注,并表示希望这很有趣。 相反,我注意到Google是该程序的第一个版本。 第二个已完全准备就绪,但数据不足。 因此,如果您喜欢西瓜-请在您的Android上放一个程序。 您发送的数据越多,第二个版本就会越好...
当然,它将是免费的。
祝您好运,是的:感谢您的收看。 我希望这很有趣。
重要更新:已发布具有改进分析的新版本。 感谢所有发送西瓜的人,并请发送更多!