Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【方向盘】认为:开发者已无理由再用Java EE

【方向盘】认为:开发者已无理由再用Java EE

作者头像
YourBatman
发布于 2022-10-31 03:12:26
发布于 2022-10-31 03:12:26
82200
代码可运行
举报
文章被收录于专栏:BAT的乌托邦BAT的乌托邦
运行总次数:0
代码可运行

本系列是由“MATRIX.矩阵之芯”精炼的AI快速入门系列,特色是内容简洁,学习快速。 相关要求:学员需要掌握Python编程基础,另外还需要有一定的线性代数、概率论基础

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,常用于计算机视觉领域的图像分类、目标检测和图像分割任务中。它的核心思想是通过卷积运算从原始数据中提取特征,然后将这些特征传递给全连接层进行分类或回归。

在传统的图像分类任务中,我们需要手动提取图像的特征,例如边缘、纹理、颜色等。然而,这些特征的提取是非常困难的,因为它们通常是高度抽象和主观的。而卷积神经网络的卷积层可以自动学习图像的特征,大大简化了特征提取的过程。因此,它可以更好地适应不同的任务和数据集。

卷积神经网络由多个卷积层、池化层和全连接层组成。卷积层是卷积神经网络的核心,它包括多个卷积核,每个卷积核都可以提取图像中的一种特征。卷积操作可以理解为将卷积核在图像上滑动,将图像中每个像素与卷积核中的权重进行乘积,再将乘积相加得到一个新的像素值,最终得到一个新的特征图。通过多个卷积层的堆叠,可以得到越来越抽象的特征图,从而更好地区分不同的物体。

------------------------

卷积核(Convolution Kernel)是卷积运算中的一个重要概念,它是一个可学习的滤波器,用来提取输入数据的特征。卷积操作可以理解为用一个小的窗口在输入数据上滑动,对每个窗口内的数据进行加权求和,得到一个新的值作为输出。这个小的窗口就是卷积核。 卷积核的大小通常是正方形或矩形,可以根据需要自行指定大小。卷积核的参数值是由模型训练得到的,通过反向传播算法不断更新,使得模型能够逐渐学习到更好的特征和参数,从而提高模型的性能。 在卷积神经网络中,卷积核被用来提取输入数据的特征。在每一层中,都会有若干个卷积核进行卷积操作,每个卷积核提取的特征不同。这样就可以从不同的角度提取输入数据的特征,从而得到更加丰富的特征表示。

假设我们有一张灰度图像,大小为5x5像素,像素值表示为矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1  2  3  4  5
  6  7  8  9 10
 11 12 13 14 15
 16 17 18 19 20
 21 22 23 24 25

我们可以定义一个2x2的卷积核(也称为过滤器),如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1  0
  0 -1

卷积操作将卷积核放置在图像上,以每个像素为中心进行乘法并对结果求和。例如,将卷积核放置在第一个像素位置(1)上,我们得到卷积操作的结果为:(1 * 1) + (2 * 0) + (6 * 0) + (7 * -1) = -6。

在将卷积核应用于整个图像时,我们将其向右移动一个像素,然后再次应用卷积。我们重复此过程,直到将卷积核应用于图像的每个位置。最后,我们得到一个新的图像,大小为4x4像素,像素值表示为矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  -6 -8 -10 -4
 -11 -13 -15 -9
  -16 -18 -20 -14
  -21 -23 -25 -19

这个矩阵经过卷积操作后提取了图像的边缘特征。可以看到,经过卷积操作后,原始图像中的垂直边缘被突出了出来,而水平边缘则被抑制了。这是因为卷积核中的权重与垂直边缘的像素值较为接近,而与水平边缘的像素值差异较大,因此垂直边缘的特征得到了突出,水平边缘的特征则被抑制。

--------------------------------

池化层是为了减小特征图的尺寸和参数数量,通常在卷积层之间添加。它可以将特征图中的每个小区域(例如2x2)压缩成一个单独的像素值,从而减少计算量和内存占用。

最后是全连接层,它接收所有汇集在一起的特征图,并将它们转换为向量进行分类或回归。全连接层与传统神经网络中的层类似,但是由于它们需要处理大量的特征,因此在卷积神经网络中使用的全连接层通常比传统神经网络中使用的层更少。

卷积神经网络的训练通常使用反向传播算法。反向传播算法是一种基于梯度下降的优化算法,可以通过计算网络预测与实际标签之间的误差来更新网络参数。通过多次迭代,网络可以逐渐学习到更好的特征和参数,从而提高模型的性能。

这就相当于是网络通过不断地自我调整来适应数据的过程,从而提高了网络对数据的理解和分类能力。因此,卷积神经网络成为了许多计算机视觉、语音识别、自然语言处理等领域中最为流行的深度学习模型之一。

在卷积神经网络中,卷积层和池化层的使用可以减少参数数量和计算量,从而使网络更加高效。同时,通过加入更多的卷积层和池化层,网络可以逐渐提取出更加抽象的特征,从而提高网络的性能。

除了卷积层和池化层之外,卷积神经网络还有许多其他的层,例如全连接层、批标准化层、Dropout层等等。这些层的使用可以进一步提高网络的性能,并且可以避免网络出现过拟合等问题。

卷积神经网络是一种非常强大的深度学习模型,可以在计算机视觉、语音识别、自然语言处理等领域中取得非常优秀的成果。在未来,随着深度学习技术的不断发展和完善,卷积神经网络将会在更多的领域中发挥出更加重要的作用。

我们举一个例子:用Keras库来构建一个简单的卷积神经网络,并用它来对手写数字进行分类。

首先,我们需要准备数据集,这里我们使用MNIST手写数字数据集,它包含了60,000个训练样本和10,000个测试样本。可以在Keras中直接下载和加载这个数据集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

这个数据集中的图像都是28x28像素的灰度图像,像素值的范围是0到255。我们需要将这些图像转换成网络可以处理的形式,即将像素值缩放到0到1之间,并将其转换为4维张量,张量的形状为(样本数,高度,宽度,通道数)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

接下来,我们构建一个简单的卷积神经网络模型。这个模型包含了两个卷积层,一个池化层和两个密集连接层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

最后,我们编译模型并开始训练。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5, batch_size=64)

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

通过训练,我们可以看到模型的准确率随着迭代次数的增加而不断提高。最后我们可以使用测试集对模型进行评估,并输出测试集的准确率。

这是一个简单的卷积神经网络的例子,它可以很好地完成手写数字的分类任务。在实际应用中,我们可以根据具体任务的需求来设计更加复杂的卷积神经网络。

以下是一个判断手写数字的小案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
import numpy as np
import cv2

# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 归一化数据
x_train, x_test = x_train / 255.0, x_test / 255.0

# 构建模型
model = tf.keras.models.Sequential([
    tf.keras.layers.Reshape((28, 28, 1), input_shape=(28, 28)),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=5)

# 测试模型
model.evaluate(x_test, y_test)

# 读取图片并进行处理
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
resized = cv2.resize(gray, (28, 28), interpolation=cv2.INTER_AREA)
normalized = resized / 255.0

# 对图片进行预测
pred = model.predict(normalized.reshape(1, 28, 28, 1))

# 打印出预测的结果
pred_label = np.argmax(pred[0])
print("预测的数字为:", pred_label)

# 显示图片
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
架构师的道法术:架构师是否需要下场写代码?
前几天,我在社区抛出了一个问题 (在此),没想到获得了众多架构师的热烈讨论与回应。在认真阅读了大家的解答后,我也陷入了深思:在技术日新月异的今天,架构师的角色早已超越了画架构图和撰写文档的传统范畴。随着软件开发的复杂性与日俱增,架构师的职责正在发生深刻变化。而一个备受争议的话题始终萦绕在行业中:架构师究竟是否需要下场写代码?
不惑
2024/12/27
1460
架构师的道法术:架构师是否需要下场写代码?
为何架构设计对软件开发至关重要
在任何领域,事前的准备和规划都是成功的关键,正如那句古话所说:“预则立,不预则废。”在软件开发这一高度复杂且变化迅速的行业中,这一点尤为重要。
参谋带个长
2024/12/06
1750
架构师的职责是什么?
在当今时代,随着信息技术的不断发展,各种软件系统和应用程序变得越来越复杂,其架构设计和开发难度也越来越大。因此,架构师的作用和重要性也越来越受到关注。架构师是一个拥有丰富经验和广泛技术视野的高级职位,主要负责设计、构建和维护各种软件系统的架构,以满足业务需求和技术要求,同时为公司提供技术支持和解决方案。
coderidea
2023/05/17
1.8K0
架构师的职责是什么?
架构与架构师
“架构”这个词给人的直观感受就充满了权力与神秘感,因此谈论架构总让人有一种正在进行责任重大的决策或者深度技术分析的感觉。毕竟,进阶到软件架构这一层次是我们走技术路线的人的终极目标
码农戏码
2021/03/23
5770
业务架构师、系统架构师、软件架构师:职责、技能要求及对比分析
业务架构师、系统架构师和软件架构师在企业技术层面扮演着不同角色,各自有其独特的职责和技能要求。了解和明确这三者的不同,有助于组织有效地分配资源和角色,促进企业的技术和业务目标的实现。
运维开发王义杰
2023/08/10
3.5K0
业务架构师、系统架构师、软件架构师:职责、技能要求及对比分析
12种常见的软件架构风格,架构师必备
软件架构是定义软件系统的高级结构和组织的过程。它涉及识别和选择正确的组件,决定它们之间如何交互,以及确定它们应该如何组织以实现特定的目标。软件架构的目标是创建一个可维护、可扩展和安全的系统,能够满足用户和组织的需求。
程序新视界
2023/12/02
3.2K0
12种常见的软件架构风格,架构师必备
如何成为一名优秀的架构师?
想一下软件架构的评审过程:一位架构师参与进来,俯视一切然后指指点点,高谈阔论。他发表的评论要么过于粗浅,要么严重脱离实际。
Spark学习技巧
2018/11/08
1.3K0
【愚公系列】软考高级-架构设计师 109-软件架构演化原则
软件架构演化原则是指在软件架构设计和演化过程中应该遵循的一些指导性原则和规范,以确保软件系统在不断变化和迭代的过程中保持稳健、可维护和可扩展。
愚公搬代码
2024/08/15
2090
浅谈软件架构师的素质与职责
最近开始学习如何成为一名合格的架构师。首先参照别人的观点,在结合自己的实际经验,写出自己对如何成为一名架构师的理解,希望大家热心于与援手,能够指点一二. 沟通能力和自我表达 我认为沟通能力是基本中的基本,最为重要,最为普遍的素质。技术人员好像容易忽略,想成为架构师就不能忽略。因为架构师要做的第一件事就是与团队成员、项目经理、客户认同沟通,获得认同。我知道,这对于现在做技术,以后想转做架构的人也许很难.对本人也是如此。也许 你会注意到虽然你兢兢业业,老黄牛的做了很多事,但每次升迁的总是那些平时最活跃的人。抛除
张善友
2018/01/30
6790
资深架构师十年总结:成为架构师,你必须具备这五点能力
作者 | Alan Tai 译者 | 冬雨 策划 | 闫园园 在过去的 20 年里,作为一名软件工程师和软件架构师,我与不同领域和不同学科的软件工程师聊过很多次。他们中有一些人是有着 8 到 10 年经验的高级工程师,有许多人还在职业生涯早期,有着 3 到 5 年的经验。其中一些人是我的同事。有些人是求职者。聊到最后,他们几乎都会问到同样一个问题: “我想成为一名解决方案架构师。了解更多架构相关内容的资源有哪些?“——很多软件工程师都会问的一个问题。 他们问错了问题。如果你读下去,就会知道为什么我
深度学习与Python
2023/03/29
5910
资深架构师十年总结:成为架构师,你必须具备这五点能力
浅谈一下编程思想(二)软件架构
浅谈一下编程思想(一) - 掘金 前面写了编程范式与设计原则,这次写一下软件架构。
Coder昊白
2023/11/22
3130
如何成为一名优秀的架构师
同时期进入到同一间公司,参与同一个项目的同学,时间长了之后,有同学的架构能力很强,有的却还像一个新手,造成这种差别的原因除了个体素质的差异,还有一个是工作方式和思考方式上的差异。
路人甲Java
2019/12/11
4210
软件架构与系统架构:区别与联系的分析
引言: 在信息技术领域,软件架构和系统架构这两个术语经常被提及。尽管它们在某些方面有重叠,但它们确实代表了不同的概念和聚焦点。理解这两种架构之间的区别和联系对于任何从事技术开发和设计的专业人士都是至关重要的。本文旨在深入探讨软件架构与系统架构的定义、差异以及它们之间的相互关系。
运维开发王义杰
2024/02/04
8530
软件架构与系统架构:区别与联系的分析
成为java架构师需要具备那些技能?
大家好,又见面了,我是你们的朋友全栈君。架构师定义 百度百科,系统架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。 架构师工作职能 软件架构师在整个软件开发过程中都起着重要的作用,并随着开发进程的推进而其职责或关注点不断地变化,在需求阶段,软件架构师主要负责理解和管理非功能性系统需求,比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等,此外,架构师还要经常审查客户及市场人员所提出的需求,确认开发团队所提出的设计;在需求越来越明确后,架构师的关注点开始转移到组织开发团队成员和开发过程定义上;在软件设计阶段,架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计;在编码阶段,架构师则成为详细设计者和代码编写者的顾问,并且经常性地要举行一些技术研讨会、技术培训班等;随着软件开始测试、集成和交付,集成和测试支持将成为软件架构师的工作重点;在软件维护开始时,软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。 成为java架构师所需要具备那些技能? 所谓架构师,思考的是全局的东西,是如何组织你的系统,以达到业务要求,性能要求,具备可扩展性(scalability),可拓展性(extendability),前后兼容性等。可能涉及到的东西包括了从硬件到软件的方方面面,实在是一言难尽。 既然java架构师,首先你要是一个高级java攻狮城,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池…:;java反射技术,写框架必备的技术,但是有严重的性能问题,替代方案java字节码技术;nio,没什么好说的,值得注意的是”直接内存”的特点,使用场景;java多线程同步异步;java各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如hashmap的实现原理,好多五年以上经验的人都弄不清楚,还有为什扩容时有性能问题?不弄清楚这些原理,就写不出高效的代码,还会认为自己做的很对;总之一句话越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用api而已,离会用还差的远。 熟练使用各种数据结构和算法,数组、哈希、链表、排序树…,一句话要么是时间换空间要么是空间换时间,这里展开可以说一大堆,需要有一定的应用经验,用于解决各种性能或业务上的问题。 熟练使用linux操作系统,必备,没什么好说的。 熟悉tcp协议,创建连接三次握手和断开连接四次握手的整个过程,不了解的话,无法对高并发网络应用做优化;熟悉http协议,尤其是http头,我发现好多工作五年以上的都弄不清session和cookie的生命周期以及它们之间的关联。 系统集群、负载均衡、反向代理、动静分离,网站静态化。 分布式存储系统nfs,fastdfs,tfs,Hadoop了解他们的优缺点,适用场景。 分布式缓存技术memcached,redis,提高系统性能必备,一句话,把硬盘上的内容放到内存里来提速,顺便提个算法一致性hash。 工具nginx必备技能超级好用,高性能,基本不会挂掉的服务器,功能多多,解决各种问题。 数据库的设计能力,mysql必备,最基础的数据库工具,免费好用,对它基本的参数优化,慢查询日志分析,主从复制的配置,至少要成为半个mysqldba。其他nosql数据库如mongodb。 还有队列中间件。如消息推送,可以先把消息写入数据库,推送放队列服务器上,由推送服务器去队列获取处理,这样就可以将消息放数据库和队列里后直接给用户反馈,推送过程则由推送服务器和队列服务器完成,好处异步处理、缓解服务器压力,解藕系统。 想成为架构师不是懂了一大堆技术就可以了,这些是解决问题的基础、是工具,不懂这些怎么去提解决方案呢?这是成为架构师的必要条件。 架构师还要针对业务特点、系统的性能要求提出能解决问题成本最低的设计方案才合格,人家一个几百人用户的系统,访问量不大,数据量小,你给人家上集群、上分布式存储、上高端服务器,为了架构而架构,这是最扯淡的,架构师的作用就是第一满足业务需求,第二最低的硬件网络成本和技术维护成本。 架构师还要根据业务发展阶段,提前预见发展到下一个阶段系统架构的解决方案,并且设计当前架构时将架构的升级扩展考虑进去,做到易于升级;否则等系统瓶颈来了,出问题了再去出方案,或现有架构无法扩展直接扔掉重做,或扩展麻烦问题一大堆,这会对企业造成损失。
全栈程序员站长
2022/09/08
3780
软件架构可能不是你想象的那个样子
软件架构在敏捷社区中存在争议。在许多人的经验中,架构只会导致毫无价值的会议和无关紧要的文件,“地图不是领土”的说法可以恰当地概括这一观点。然而,架构不佳的应用程序很快就会变得像被遗弃在路边的车辆一样,破损且无法修复。那么,在毫无意义的两极之间是否有一个有用的中间地带呢?
深度学习与Python
2022/06/11
3020
软件架构可能不是你想象的那个样子
架构设计深入学习01--概论与预架构阶段
完成一个比较复杂的项目后,终于有空看看书了,这次决定将架构设计的方法论进行一次系统的学习,借助温昱大师的《一线架构师》一书。我将把这次学习分成三部分,分别是概论&预架构阶段&非功能目标的方法论、概念架
用户1216676
2018/01/24
9570
软件架构发展历程分享
架构的形式与特点 设计文档和代码 我们一般说的架构既包括架构的设计过程,也包括设计的产出物,一般可以包括各类设计文档、设计图,也可以包括一些技术验证代码、Demo 或者其他相关程序。文档的目的在于准确记录我们的思维产物,在软件尚未实现时,作为指导蓝图,尽量精确的描述清楚软件。 在软件的实现过程中,可能随时随着我们的深入研究,根据具体情况对文档做出局部的一些调整和修改。文档作为结项或交接的一部分,也是整个软件项目的产出物的一部分,成为公司 IT 资产的有机组成部分。 架构服务于业务 正如19世纪的伟大建筑
CSDN技术头条
2018/04/18
1.4K0
【愚公系列】软考高级-架构设计师 097-基于架构的软件开发(ABSD)
基于架构的软件开发(Architecturally Based Software Development,ABSD)是一种软件开发方法,它强调在整个软件开发过程中对软件体系结构的重视和管理。ABSD 的主要作用包括:
愚公搬代码
2024/08/09
4240
系统架构设计师|关于系统架构设计师(下)
本篇为系统架构设计师的第二篇,主要说说何为系统架构设计师,他与系统架构之间的关系以及如何成为系统架构设计师,如有描述不清,还望指出。
六月暴雪飞梨花
2024/08/20
8230
系统架构设计师|关于系统架构设计师(下)
【愚公系列】软考高级-架构设计师 092-系统架构设计概述
系统架构设计是指在软件工程、信息系统、计算机系统等领域中,定义系统的高层结构和组织方式的过程。系统架构设计的目的是确保系统满足业务需求、性能要求、可维护性和扩展性等方面的需求,同时提供一个清晰的蓝图,指导系统的详细设计和实现。
愚公搬代码
2024/08/06
2440
推荐阅读
相关推荐
架构师的道法术:架构师是否需要下场写代码?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验