基于TensorFlow,2024年最新java初级面试官常问的问题及答案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

// Instantiate the knn model

this.knn = new KNNImageClassifier(NUM_CLASSES, TOPK);

// Load knn model

this.knn.load().then(() => this.start());

第一行代码创建一个KNNImageClassifier对象,并分配给this.knn。KNNImageClassifier的构造器需传入两个参数:numClasses和k。numClasses定义模型期望分类的类别数。在本例中,numClasses为3(每种手势一个类别)。k是KNN算法模型的参数,它定义模型决定一个样本分类时所要考虑的邻居数。

第二行代码调用KNNImageClassifier的load函数。load函数用来下载预训练的SqueezeNet模型的权重。你将注意到这里then函数的使用,这说明load函数是一个异步函数,其返回一个Promise对象。当SqueezeNet模型的权重下载完成时,Promise对象决定执行。这时我们将调用this.start()开始TensorFlow.js迭代训练过程。

TensorFlow.js迭代训练

Main.start()函数定义如下:

start() {

this.video.play();

this.timer = requestAnimationFrame(() => this.animate());

}

上面的代码做了两件事:this.video.play()开启webcam流。this.animate()调用 TensorFlow.js迭代训练的第一次迭代。你会注意到,我们用requestAnimationFrame封装this.animate()调用。requestAnimationFrame是一个异步函数,当浏览器打开时requestAnimationFrame函数会调用传入的函数。这能确保在迭代训练时同步更新浏览器的视口。你也会注意到this.animate()末尾的一行代码:

this.timer = requestAnimationFrame(() => this.animate());

所以,在this.animate()的单个迭代的最后,我们会等待浏览器刷新它的视口,然后调用迭代训练的下一个迭代。这个常规的模式会确保,在更多的张量排队等待GPU处理时,浏览器得到合适的渲染。如果没有该模式浏览器会挂住,渲染web页面不可用。

你也应该注意到了,我们将requestAnimationFrame的返回结果分配给this.timer变量。虽然在本例中我们并没有使用该变量,但是它会基于某些事件给我们停止/暂停迭代训练的选项。stop函数会暂停我们的迭代训练,代码如下:

stop(){

this.video.pause();

cancelAnimationFrame(this.timer);

}

下面让我们看一下迭代训练中每个迭代都做了什么。在animate()函数中,我们从下面这行代码讲起:

const image = dl.fromPixels(this.video);

fromPixels函数的功能是把浏览器图片转化成一个3D张量,该张量包含图片的像素亮度。fromPixels函数可以从 ImageData、HTMLImageElement、HTMLCanvasElement或者HTMLVideoElement抓取图片。在本例子中,我们传入webcam的HTMLVideoElement。fromPixels函数把webcam的当前显示图片转换成一个3D张量,以供给其它TF.js函数使用。

接着,我们看下面一段代码:

// Train class if one of the buttons is held down

if (this.training != -1) {

// Add current image to classifier

this.knn.addImage(image, this.training);

}

当训练按钮被点击时,上面的代码会检测是否在训练三种手势其中的一种,并增加图片到KNN模型。这步很容易用KNNImageClassifier实例的addImage函数实现。addImage函数传入新训练图片的3D张量和相应的分类。KNNImageClassifier在SqueezeNet模型基础上处理图片,输入特征抽取的结果,并将其增加到训练样本的数组。

迭代训练的下一个代码块如下:

const exampleCount = this.knn.getClassExampleCount();

if (Math.max(…exampleCount) > 0) {

this.knn.predictClass(image)

.then((res)=>{

// Do something with our model’s prediction res

})

.then(()=> image.dispose());

}else{

image.dispose();

}

我们调用this.knn.getClassExampleCount()获取每个分类的图片数目。如果我们对至少一张图片进行了模型训练,那么我们会继续并使用模型进行图片预测。

为了预测一张图片的分类,我们传入一个3D张量到KNN图片分类器的predictClass函数。predictClass函数是一个异步函数,提供的图片进行推断,并返回一个Promise。Promise会决定推断的结果。predictClass函数紧跟的.then函数调用会定义一个函数,当推断完成会执行该函数。在本例子中,我们使用推断的结果更新UI上相应的变量、文本和图片。因为.then函数也会在传入的函数完成时返回一个Promise,所以我们用另外一个.then函数链式地调用函数。这时我们调用图片的3D张量对象的dispose()方法,它会释放指定部分张量的GPU的内存。如果不这么操作,随着迭代训练每次迭代都会持续地分配图片张量对象,我们会出现内存泄漏 。

最后注意,如果我们没有对单个类别进行训练,那么同时也会忽略对当前图片的推断,并用image.dispose()丢弃图片张量对象。

下面总结一下,TensorFlow.js 的迭代训练过程如下:

  1. 从摄像头抓取一张图片,并使用tf.fromPixels 函数将其转换成一个3D张量

  2. 检查我们当前是否在处理某个手势。如果是,则用KNNImageClassifier.addImage函数增加图片和相应的类别到我们的模型

  3. 检查我们的模型当前是否在训练最近的一个手势。如果是,使用KNNImageClassifier.predictClass函数推断当前处理的图片。基于这个结果去更新类别的变量和UI元素

  4. 使用张量对象的.dispose()方法丢弃图片

  5. 使用requestAnimationFrame,调用this.animate() 运行迭代训练的下一次迭代。在我们不断地迭代之前,requestAnimationFrame确保在浏览器时间重绘视口

  6. 回到第一步

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-l9iUIxgI-1713460951175)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值