机器学习工程师Udacity项目:实现一个狗品种识别算法Apppaulonetwo

在下方的代码单元(cell)中,我们导入了一个狗图像的数据集。我们使用scikit-learn库中的load_files函数来获取一些变量:

importrandomrandom.seed(8675309)#加载打乱后的人脸数据集的文件名human_files=np.array(glob("/data/lfw/*/*"))random.shuffle(human_files)#打印数据集的数据量print('Thereare%dtotalhumanimages.'%len(human_files))Thereare13233totalhumanimages.

在如下代码单元中,我们将演示如何使用这个检测模型在样本图像中找到人脸。

在上方的代码中,faces以numpy数组的形式,保存了识别到的面部信息。它其中每一行表示一个被检测到的脸,该数据包括如下四个信息:前两个元素x、y代表识别框左上角的x和y坐标(参照上图,注意y坐标的方向和我们默认的方向不同);后两个元素代表识别框在x和y轴两个方向延伸的长度w和d。

我们可以将这个程序封装为一个函数。该函数的输入为人脸图像的路径,当图像中包含人脸时,该函数返回True,反之返回False。该函数定义如下所示。

#如果img_path路径表示的图像检测到了脸,返回"True"defface_detector(img_path):img=cv2.imread(img_path)gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)faces=face_cascade.detectMultiScale(gray)returnlen(faces)>0【练习】评估人脸检测模型问题1:在下方的代码块中,使用face_detector函数,计算:

理想情况下,人图像中检测到人脸的概率应当为100%,而狗图像中检测到人脸的概率应该为0%。你会发现我们的算法并非完美,但结果仍然是可以接受的。我们从每个数据集中提取前100个图像的文件路径,并将它们存储在human_files_short和dog_files_short中。

human_files_short=human_files[:100]dog_files_short=train_files[:100]##请不要修改上方代码##TODO:基于human_files_short和dog_files_short##中的图像测试face_detector的表现print(np.mean([face_detector(human)forhumaninhuman_files_short]))print(np.mean([face_detector(dog)fordogindog_files_short]))1.00.11问题2:就算法而言,该算法成功与否的关键在于,用户能否提供含有清晰面部特征的人脸图像。那么你认为,这样的要求在实际使用中对用户合理吗?如果你觉得不合理,你能否想到一个方法,即使图像中并没有清晰的面部特征,也能够检测到人脸?

回答:不合理;使用CNN;

Tips:

补充阅读材料:

我们建议在你的算法中使用opencv的人脸检测模型去检测人类图像,不过你可以自由地探索其他的方法,尤其是尝试使用深度学习来解决它:)。请用下方的代码单元来设计和测试你的面部监测算法。如果你决定完成这个选做任务,你需要报告算法在每一个数据集上的表现。

##(选做)TODO:报告另一个面部检测算法在LFW数据集上的表现###你可以随意使用所需的代码单元数

在实现了图像处理的部分之后,我们就可以使用模型来进行预测。这一步通过predict方法来实现,它返回一个向量,向量的第i个元素表示该图像属于第i个ImageNet类别的概率。这通过如下的ResNet50_predict_labels函数实现。

fromkeras.applications.resnet50importpreprocess_input,decode_predictionsdefResNet50_predict_labels(img_path):#返回img_path路径的图像的预测向量img=preprocess_input(path_to_tensor(img_path))returnnp.argmax(ResNet50_model.predict(img))完成狗检测模型

我们通过这些想法来完成下方的dog_detector函数,如果从图像中检测到狗就返回True,否则返回False。

defdog_detector(img_path):prediction=ResNet50_predict_labels(img_path)return((prediction<=268)&(prediction>=151))【作业】评估狗狗检测模型

问题3:

在下方的代码块中,使用dog_detector函数,计算:

###TODO:测试dog_detector函数在human_files_short和dog_files_short的表现print(np.mean([dog_detector(human)forhumaninhuman_files_short]))print(np.mean([dog_detector(dog)fordogindog_files_short]))0.01.0步骤3:从头开始创建一个CNN来分类狗品种

现在我们已经实现了一个函数,能够在图像中识别人类及狗狗。但我们需要更进一步的方法,来对狗的类别进行识别。在这一步中,你需要实现一个卷积神经网络来对狗的品种进行分类。你需要从头实现你的卷积神经网络(在这一阶段,你还不能使用迁移学习),并且你需要达到超过1%的测试集准确率。在本项目的步骤五种,你还有机会使用迁移学习来实现一个准确率大大提高的模型。

值得注意的是,对狗的图像进行分类是一项极具挑战性的任务。因为即便是一个正常人,也很难区分布列塔尼犬和威尔士史宾格犬。

不难发现其他的狗品种会有很小的类间差别(比如金毛寻回犬和美国水猎犬)。

同样,拉布拉多犬(labradors)有黄色、棕色和黑色这三种。那么你设计的基于视觉的算法将不得不克服这种较高的类间差别,以达到能够将这些不同颜色的同类狗分到同一个品种中。

黄色拉布拉多犬(YellowLabrador)|棕色拉布拉多犬(ChocolateLabrador)|黑色拉布拉多犬(BlackLabrador)

我们也提到了随机分类将得到一个非常低的结果:不考虑品种略有失衡的影响,随机猜测到正确品种的概率是1/133,相对应的准确率是低于1%的。

请记住,在深度学习领域,实践远远高于理论。大量尝试不同的框架吧,相信你的直觉!当然,玩得开心!

数据预处理

通过对每张图像的像素值除以255,我们对图像实现了归一化处理。

fromPILimportImageFileImageFile.LOAD_TRUNCATED_IMAGES=True#Keras中的数据预处理过程train_tensors=paths_to_tensor(train_files).astype('float32')/255valid_tensors=paths_to_tensor(valid_files).astype('float32')/255test_tensors=paths_to_tensor(test_files).astype('float32')/255100%|██████████|6680/6680[01:14<00:00,89.11it/s]100%|██████████|835/835[00:08<00:00,100.40it/s]100%|██████████|836/836[00:08<00:00,101.04it/s]【练习】模型架构

创建一个卷积神经网络来对狗品种进行分类。在你代码块的最后,执行model.summary()来输出你模型的总结信息。

我们已经帮你导入了一些所需的Python库,如有需要你可以自行导入。如果你在过程中遇到了困难,如下是给你的一点小提示——该模型能够在5个epoch内取得超过1%的测试准确率,并且能在CPU上很快地训练。

问题4:

回答:我使用上图提示的步骤搭建卷积网络,该架构能取得很好表现的原因有:1)卷积层对图片中的特征进行局部感知,以便后续从更高层次对局部进行综合操作,从而得到全局信息;2)池化层用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性;MaxPooling能够保留最强的特征,抛弃其他弱的此类特征。GlobalAveragePooling将最后一层的特征进行均值池化,形成一个特征点,将这些特征点组成最后的特征向量以进行softmax计算;3)密集层里是高度提纯的特征,它将进行最后的分类;sigmoid的梯度在饱和区域非常平缓,接近于0,很容易造成梯度消失的问题。而Relu的梯度大多数情况下是常数,有助于解决深层网络的收敛问题。

更进一步,可以尝试不同的模型结构,如更多的卷积层和全连接层、更多的节点数、使用不同类型的正则化层(Dropout、BatchNormalization等)、使用不同的权值初始化方案(truncated_normal、xavier等)、使用不同的激活函数(LeakyReLU、eLU等)、抉择使用Flatten还是GlobalAveragePooling2D等。在实际应用中,你需要根据场景的不同来设计不同的模型架构、使用不同的超参数。对比各类结构和超参数给模型带来的影响,有助于你更好的理解模型的结构。

##编译模型model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])Tips:

提高准确率有很多小技巧~

通常模型的大小取决于数据的量和复杂度,但是如果你使用max-pooling,你需要增加向上的每一层的神经元(比如你可以double一下)。通常在denselayer之前有2-5层,kernelsize3-5就差不多。你也可以用gridsearch找一组比较满意的参数~

常用的正则化方法:

更多的阅读资料:

【练习】训练模型

问题5:

在下方代码单元训练模型。使用模型检查点(modelcheckpointing)来储存具有最低验证集loss的模型。

更多阅读材料:

测试模型

在狗图像的测试数据集上试用你的模型。确保测试准确率大于1%。

#获取测试数据集中每一个图像所预测的狗品种的indexdog_breed_predictions=[np.argmax(model.predict(np.expand_dims(tensor,axis=0)))fortensorintest_tensors]#报告测试准确率test_accuracy=100*np.sum(np.array(dog_breed_predictions)==np.argmax(test_targets,axis=1))/len(dog_breed_predictions)print('Testaccuracy:%.4f%%'%test_accuracy)Testaccuracy:2.2727%步骤4:使用一个CNN来区分狗的品种

得到从图像中提取的特征向量(BottleneckFeatures)

bottleneck_features=np.load('/data/bottleneck_features/DogVGG16Data.npz')train_VGG16=bottleneck_features['train']valid_VGG16=bottleneck_features['valid']test_VGG16=bottleneck_features['test']模型架构

该模型使用预训练的VGG-16模型作为固定的图像特征提取器,其中VGG-16最后一层卷积层的输出被直接输入到我们的模型。我们只需要添加一个全局平均池化层以及一个全连接层,其中全连接层使用softmax激活函数,对每一个狗的种类都包含一个节点。

VGG16_model=Sequential()VGG16_model.add(GlobalAveragePooling2D(input_shape=train_VGG16.shape[1:]))VGG16_model.add(Dense(133,activation='softmax'))VGG16_model.summary()_________________________________________________________________Layer(type)OutputShapeParam#=================================================================global_average_pooling2d_2((None,512)0_________________________________________________________________dense_2(Dense)(None,133)68229=================================================================Totalparams:68,229Trainableparams:68,229Non-trainableparams:0_________________________________________________________________Tips:迁移学习的思路就是将一个预训练的模型,通过新的训练集进行二次训练。分为三种形式:

现在,我们可以测试此CNN在狗图像测试数据集中识别品种的效果如何。我们在下方打印出测试准确率。

#获取测试数据集中每一个图像所预测的狗品种的indexVGG16_predictions=[np.argmax(VGG16_model.predict(np.expand_dims(feature,axis=0)))forfeatureintest_VGG16]#报告测试准确率test_accuracy=100*np.sum(np.array(VGG16_predictions)==np.argmax(test_targets,axis=1))/len(VGG16_predictions)print('Testaccuracy:%.4f%%'%test_accuracy)Testaccuracy:41.5072%使用模型预测狗的品种

fromextract_bottleneck_featuresimport*defVGG16_predict_breed(img_path):#提取bottleneck特征bottleneck_feature=extract_VGG16(path_to_tensor(img_path))#获取预测向量predicted_vector=VGG16_model.predict(bottleneck_feature)#返回此模型预测的狗的品种returndog_names[np.argmax(predicted_vector)]

步骤5:建立一个CNN来分类狗的品种(使用迁移学习)

现在你将使用迁移学习来建立一个CNN,从而可以从图像中识别狗的品种。你的CNN在测试集上的准确率必须至少达到60%。

在步骤4中,我们使用了迁移学习来创建一个使用基于VGG-16提取的特征向量来搭建一个CNN。在本部分内容中,你必须使用另一个预训练模型来搭建一个CNN。为了让这个任务更易实现,我们已经预先对目前keras中可用的几种网络进行了预训练:

这些文件被命名为为:

Dog{network}Data.npz其中{network}可以是VGG19、Resnet50、InceptionV3或Xception中的一个。选择上方网络架构中的一个,他们已经保存在目录/data/bottleneck_features/中。

【练习】获取模型的特征向量

在下方代码块中,通过运行下方代码提取训练、测试与验证集相对应的bottleneck特征。

bottleneck_features=np.load('/data/bottleneck_features/Dog{network}Data.npz')train_{network}=bottleneck_features['train']valid_{network}=bottleneck_features['valid']test_{network}=bottleneck_features['test']###TODO:从另一个预训练的CNN获取bottleneck特征bottleneck_features=np.load('/data/bottleneck_features/DogXceptionData.npz')train_Xception=bottleneck_features['train']valid_Xception=bottleneck_features['valid']test_Xception=bottleneck_features['test']Tips:当下比较主流的架构非ResNet-50和Xception莫属~轻易就能达到80%以上的准确率~

【练习】模型架构

建立一个CNN来分类狗品种。在你的代码单元块的最后,通过运行如下代码输出网络的结构:

.summary()

问题6:

在下方的代码块中尝试使用Keras搭建最终的网络架构,并回答你实现最终CNN架构的步骤与每一步的作用,并描述你在迁移学习过程中,使用该网络架构的原因。

回答:1)将Xception最后一层的输出作为全局平均池化层的输入;2)增加一个全连接层,使用softmax激活函数,节点数设置为狗的种类数133。选用Xception是因为该模型在狗狗分类中准确率较高;这一架构会在这一分类任务中成功的原因:1)利用迁移学习获取了优良的模型和参数;2)训练次数提高到了20次;早期(第三步)尝试不成功的原因:1)模型相对来说没有迁移学习中的好;2)训练次数只有5次,太少了。

问题7:

在下方代码单元中训练你的模型。使用模型检查点(modelcheckpointing)来储存具有最低验证集loss的模型。

训练过程中,注意到第2次epoch之后验证误差就几乎没有提升了,同时因为你保存了最优模型,意味着你后面的训练都是在浪费计算资源;同时也观察到,第20次epoch时,验证误差远大于训练误差,这说明模型出现了过拟合。思考并尝试尽量减轻这种过拟合现象吧~

提示:

【练习】测试模型

问题8:

在狗图像的测试数据集上试用你的模型。确保测试准确率大于60%。

###TODO:在测试集上计算分类准确率Xception_predictions=[np.argmax(Xception_model.predict(np.expand_dims(feature,axis=0)))forfeatureintest_Xception]test_accuracy=100*np.sum(np.array(Xception_predictions)==np.argmax(test_targets,axis=1))/len(Xception_predictions)print('Testaccuracy:%.4f%%'%test_accuracy)Testaccuracy:83.9713%【练习】使用模型测试狗的品种

实现一个函数,它的输入为图像路径,功能为预测对应图像的类别,输出为你模型预测出的狗类别(Affenpinscher,Afghan_hound等)。

与步骤5中的模拟函数类似,你的函数应当包含如下三个步骤:

提取图像特征过程中使用到的函数可以在extract_bottleneck_features.py中找到。同时,他们应已在之前的代码块中被导入。根据你选定的CNN网络,你可以使用extract_{network}函数来获得对应的图像特征,其中{network}代表VGG19,Resnet50,InceptionV3,或Xception中的一个。

问题9:

###TODO:写一个函数,该函数将图像的路径作为输入###然后返回此模型所预测的狗的品种defXception_predict_breed(img_path):bottleneck_feature=extract_Xception(path_to_tensor(img_path))predicted_vector=Xception_model.predict(bottleneck_feature)returndog_names[np.argmax(predicted_vector)]

步骤6:完成你的算法

实现一个算法,它的输入为图像的路径,它能够区分图像是否包含一个人、狗或两者都不包含,然后:

我们非常欢迎你来自己编写检测图像中人类与狗的函数,你可以随意地使用上方完成的face_detector和dog_detector函数。你需要在步骤5使用你的CNN来预测狗品种。

下面提供了算法的示例输出,但你可以自由地设计自己的模型!

问题10:

在下方代码块中完成你的代码。

###TODO:设计你的算法###自由地使用所需的代码单元数吧defdog_check(img_path):ifdog_detector(img_path):print('It''sadog.Itlookslike')print(Xception_predict_breed(img_path))elifface_detector(img_path):print('It''shuman.Itlookslike')print(Xception_predict_breed(img_path))else:print('Error!')

THE END
1.学习编程的APP推荐学习编程的下载在当今数字化时代,学习编程已经成为一项必备的技能。而随着智能手机的普及,学习编程的APP成为了学习者的首选。通过学习编程的APP,你可以随时随地掌握编程的技巧和知识。这些APP提供了丰富的教程和实践项目,帮助你从零基础逐步掌握编程语言和算法。通过这些APP,你可以学习到Python、Java、C++等流行的编程语言,还可以了解到https://www.wandoujia.com/bangdan/876164/
2.六款免费学习编程的app(非常详细),零基础入门到精通,看这一篇就够了C语言编辑器是一款非常精简的app,主要为C语言初学者提供核心的功能,能够随手验证一些小程序。 2. python编辑器 专业的编程内容设计,多种多样的语言选择,拥有完美的脚本,强大的功能,没有任何广告,能快速编写以及快速提示、自由复制等等。 3.c4droid汉化版完整版能够体验快捷编程的趣味内容,随时随地展开更为轻松的编程。https://blog.csdn.net/SpringJavaMyBatis/article/details/143502540
3.七款超级好用的AI编程助手在编程的世界里,AI代码助手正逐渐成为开发者们的新宠。这些智能工具通过利用先进的机器学习技术,不仅能够加速代码编写过程,还能提高代码的准确性和质量,同时为开发者节省出宝贵的时间来专注于更具创造性的任务。 为什么要使用AI代码助手? 提升生产力:AI代码助手能够根据你的注释或部分代码,生成整个代码片段,甚至是完整的https://zhuanlan.zhihu.com/p/690467872
4.机器学习算法工程实践:从数据预处理到模型评估的全流程指南五、总结 通过本指南,我们详细介绍了机器学习算法工程实践的全流程,包括数据预处理、机器学习模型选择与训练、模型评估等关键步骤。希望这份指南能够帮助各行各业的程序员更好地进行机器学习算法工程实践,提升工作效率和模型性能。https://www.jianshu.com/p/3f64eb65f866
5.机器学习预测作物产量模型Flask部署详细教程(附python代码演练该数据集提供了有关野生蓝莓植物空间特征、蜜蜂种类和天气情况的实用信息。因此,它使研究人员和开发人员能够构建机器学习模型来早期预测蓝莓产量。 对于拥有现场观察数据但希望通过将真实数据的使用与计算机模拟生成的数据作为作物产量预测的输入进行比较,来测试和评估不同机器学习算法的性能的其他研究人员来说,该数据集可能https://cloud.tencent.com/developer/article/2318767
6.iAlgoApp下载iAlgo算法可视化学习v1.0.2最新版大小:49.2M语言:中文 类别:学习教育系统:Android 点击下载简介|教程|评论(0) 版本:v1.0.2 最新版时间:2020-05-15 应用介绍 iAlgo App,是一款算法可视化掌上学习工具。这里提供了排序算法、图算法、安全算法、动态规则算法等,让学习者从可视化的角度来学习算法,从而提高学习的效率,让理解变得更容易,加强学习更快https://m.qqtn.com/q/542241
7.测试工程师常见面试题一,常见排序算法 二,数组和链表的区别,以及用途? 三,常见的数据结构及优缺点 四,B树-平衡多路查找树/B-树 五,HashMap怎样解决散列(hash)冲突? 操作系统 一,进程&线程 二,进程&程序 三,进程的状态 四,通信&线程的同步互斥 五,进程调度算法 六,死锁 http://it.en369.cn/jiaocheng/1725918329a577201.html
8.构建VMware混合云平台采用英特尔? 高级矢量扩展 512 矢量神经网络指令的英特尔? 深度学习加速,可加速基于深度神经网络的算法。 深度学习编译器,一个端到端的编译器堆栈。 本参考架构演示了如何使用深度学习参考堆栈,并展示了使用面向英特尔? 架构优化的 TensorFlow 版本后所取得的性能提升。 https://www.intel.cn/content/www/cn/zh/cloud-computing/building-a-vmware-hybrid-cloud-platform.html
9.小码王学费好贵?速看2024年小码王少儿编程价格小码王的Python程序开发课程价格大概在3000元-15000元左右,是专门为8-13岁的孩子所开设的,帮助孩子通过学习编程来激发自身的潜能,培养孩子想象力,强化创新意识,获得全面发展。 03少儿C++程序算法课程 小码王少儿C++程序算法课程的价格大概在10000元-20000元左右,该课程是专为11-16岁的孩子而开设的,采用小班教学的模式,http://xiaomawang.tantuw.com/news/1192.html
10.算法动画图解app苹果版下载Algorithms算法动画图解i算法动画图解app是一款由大神开发的算法学习软件,适合算法初学者、程序员、经验丰富的工程师等人群使用,可以将枯燥无味、难以理解的算法,以动画图形和文字描述的方式让用户更加容易理解和学习。并且小伙伴们可以点击前进和后退按键,以此控制动画图解的走向,让你不在为学习算法而烦躁,轻松掌握它们。该软件涵盖分类、聚类、https://www.ddooo.com/softdown/159873.htm
11.兴业数金2023届校园招聘启事2、编程基本功扎实,掌握常用算法和数据结构; 3、熟悉Java编程语言、面向对象思想和常用设计模式,熟悉主流Java应用开发框架,熟悉MySQL等数据库。 工作地点:上海、福州、成都 2. C语言开发工程师 岗位职责: 1、负责银行软件产品的设计、开发、优化工作; 2、负责银行软件产品应用程序的代码编写和单元测试,确保功能稳定,https://career.cup.edu.cn/campus/view/id/452807
12.推荐4款学习编程的神器APP/网站[建议收藏]人和人的差距就是在今天和大家分享4款对于学习编程非常有帮助的APP/网站,希望可以帮助你提升能力、升职加薪。 #1 书栈网 学好编程离不开优质的书籍和文档,书栈网是一个专门提供计算机相关开源书籍的网站,分类也很详细,前端、后端、移动端、数据库、云计算……它既是一个开源书籍和文档分享站点,也是一套使用Go语言开发的开源程序,助您https://juejin.cn/post/7347911052170657828
13.开发app要学什么专业才能做移动端App开发应用程序开发涉及的专业比较广泛,基本上与计算机相关的专业都是可以从事开发app的以下是一些与app应用程序开发相关的主要专业方向: 1、计算机科学与技术专业: 计算机科学专业注重理论知识和算法原理的学习。学生将学习计算机科学的基本概念,如数据结构、算法设计与分析、操作系统、计算机网络等。这些知识对于理解https://www.abdqn.com/content/6074/
14.念念有词app下载念念有词app官方版v3.1.3安卓版对于中小学生来说,英语单词的学习离不开单词的记忆,所以为了学子能够更好的记忆这些单词,小编为你准备了一个不错的程序,它就是念念有词app官方版,这个程序为用户准备了丰富的课程教学,以学校的教材为基础提供了丰富的教学内容,以图片加文字的方式来吸引学生的注意力,让学生在查看和学习的时候可以有更好的学习效果,https://www.91rjz.com/pcsoft/79112.html
15.基于深度学习算法的数字识别app开发数字识别的基本原理基于深度学习算法的数字识别app开发 数字识别的基本原理,             实战四:手把手教你实现数字识别一、KNN实现数字识别1.原理    最简单最初级的分类器是将全部的训练数据所对https://blog.51cto.com/u_12187/8889633
16.AcWing一个专属于程序员的平台,为大家在漫漫的刷题之旅中,提供最优质的解答https://www.acwing.com/
17.推荐一个程序员必备官方App,名字叫:力扣–厦门璀错商贸有限公司LeetCode 应该是我们程序员极客非常喜欢的的职业编程成长平台,在里面可以学习算法数据结构,职业化编程,包含了上万社区题解,企业面试考题,成为了一个非常不错的算法技术交流分享社区。 而这个官方内测的 App ,也不错,有了它,我们就可以随时随地的刷题,学习算法了。 https://cuicuo.com/?p=1179
18.animeface算法原理 written by zyt 有关训练网络等代码在 https://github.com/taoky/anime-face-recognition/tree/master/work/zyt 中。 训练模型 算法以及具体实现 由于此次实验是在数理方程考试后才开始做数据集个人团体收集较小,因此考虑迁移学习。 本次实验采用 Inception-v3 模型,通过 Inception-v3 提取特征向量(瓶颈层https://github.com/taoky/anime-face-recognition/blob/master/README.md
19.自学编程的app有什么自学编程的网站,APP?二是如果用手机看视频学习的话,编程不建议只看视频学习,一般边看视频边敲代码是最好的学习方法,手机视频上的代码小,看起来也费力。 五、手机自学编程? 可以在手机上编程的app三款较好,分别是c语言编译器(c语言)、AIDE集成开发环境(java)、QPython3(python),都不需要root,可以直接编写程序运行。 https://tool.a5.cn/article/show/74904.html
20.C语言编程学习APP下载C语言编程学习v2.2.7安卓手机版下载C语言编程学习是一款C语言学习软件,软件包括了丰富的内容,C语言语法、数据结构、算法等,从基础知识到进阶知识都有,还有大量的计算机二级考试题目,无论你是大学生还是在职人员,本软件对提升您的编程能力都大有帮助。 功能特色 (1)C语言:C语言程序设计的知识点,包括数据类型、文件、函数等章节;(2)习题练习:大量的Chttps://m.jb51.net/softs/779729.html
21.AppStore上的“算法宝面试算法题又没过?学习算法题太花时间?不是你的问题!在这之前没有一种算法学习方式能如此简单高效。 仅需三步,成为算法大神: 第一步,读题 第二步,播放动画,参考字幕,理解思路和代码 第三步,阅读解析,归纳总结 为什么会做一款算法动画图解App? 和很多程序员一样,每次换工作前都要准备大量时间刷算法。很菜,https://apps.apple.com/cn/app/id1624248084