【1-神经网络计算】北京大学TensorFlow2.0

news2024/12/25 12:46:14

课程地址:【北京大学】Tensorflow2.0_哔哩哔哩_bilibili

Python3.7和TensorFlow2.1

六讲:

  1. 神经网络计算:神经网络的计算过程,搭建第一个神经网络模型

  1. 神经网络优化:神经网络的优化方法,掌握学习率、激活函数、损失函数和正则化的使用,用Python语言写出SGD、Momentum、Adagrad、RMSProp、Adam五种反向传播优化器

  1. 神经网络八股:神经网络搭建八股,六步法写出手写数字识别训练模型

  1. 网络八股扩展:神经网络八股扩展,增加自制数据集、数据增强、断点续训、参数提取和acc/loss可视化,实现给图识物的应用程序

  1. 卷积神经网络:用基础CNN、LeNet、AlexNet、VGGNet、InceptionNet和ResNet实现图像识别

  1. 循环神经网络:用基础RNN、LSTM、GRU实现股票预测


课程内容概述

掌握TF2搭建优化神经网络的方法,学会离散数据的分类、连续数据的预测

第一讲:神经网络的计算过程,搭建第一个神经网络模型

  1. 准备数据:采集大量“特征/标签”数据

  1. 搭建网络:搭建神经网络结构(前向传播)

  1. 优化参数:训练网络获取最佳参数(反向传播)

  1. 应用网络:将网络封装为模型,输入未曾见过的新数据,输出分类或预测结果(前向传播)

第二讲:神经网络优化

  1. SGD(No Momentum)

  1. SGD(With Momentum)

  1. Adagrad

  1. RMSProp

  1. Adam

第三讲:神经网络搭建八股,六步法写出手写数字识别训练模型

八股(六步法):

  1. import

  1. train test

  1. model=tf.keras.modes.Sequential / class MyModel(Model) model=MyModel

  1. model.compile

  1. model.fit

  1. model.summary

第四讲:神经网络八股扩展

  1. 自制数据集

  1. 数据增强

  1. 断点续训

  1. 参数提取

  1. acc/loss可视化

第五讲:卷积神经网络

输入一张图片 —> 前向推理 —> 输出识别结果

第六讲:循环神经网络

  1. RNN

  1. LSTM

  1. GRU


安装实验环境

(一)Anaconda

Anaconda是包含conda环境管理器的Python发行版本

  • 若电脑有英伟达GPU,可以安装cudatoolkit和cudnn实现GPU加速(TensorFlow2.1匹配的cudatoolkit版本是10.1,cudnn版本是7.6)

  • 若电脑无英伟达GPU,或在安装这两句GPU加速包时报错,很可能是电脑硬件不兼容,可跳过,直接安装TensorFlow

conda install cudatoolkit=10.1
conda install cudnn=7.6
# 上面两句仅用于兼容的英伟达GPU,如报错,可忽略这两句

pip install tensorflow==2.1

在Anaconda Prompt里输入

conda create -n TF2.1 python=3.7   # 新建一个名叫TF2.1的环境,用python3.7版本
conda activate TF2.1   # 进入TF2.1环境
conda install cudatoolkit=10.1   # 安装英伟达的SDK10.1版本
conda install cudnn=7.6   # 安装英伟达深度学习软件包7.6版本
pip install tensorflow==2.1   # 安装TensorFlow,指定2.1版本

# 安装完成后,进入python验证一下是否成功了
python
import tensorflow as tf
tf.__version__   # 若显示版本号,说明安装成功

(二)PyCharm

PyCharm是一个Python IDE(Python集成开发环境)

PyCharm环境配置:

New Project - Project Interpreter:New Virtualenv environment - Existing interpreter - Conda Environment - Interpreter选择TF2.1中的python作为解释器

测试代码test.py:

import tensorflow as tf

tensorflow_version = tf.__version__
gpu_available = tf.test.is_gpu_available()

print("tensorflow version:", tensorflow_version, "\tGPU available:", gpu_available)

a = tf.constant([1.0,2.0], name="a")
b = tf.constant([1.0,2.0], name="b")
result = tf.add(a,b,name="add")
print(result)

1 神经网络计算过程及模型搭建

例:鸢尾花数据集,4个特征,3分类问题。搭建包含输入层与输出层的神经网络模型

代码1:backpropagation

假设损失函数为 loss = (w+1)^2,则其对w的偏导数为2w+2;w的初始值为5,学习率lr=0.2

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))   # 设定参数w的随机初始值为5,设定为可训练
lr = 0.2
epoch = 40

for epoch in range(epoch):  # for epoch定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时constant赋值为5,循环40次迭代

    # 用with结构让损失函数loss对参数w求梯度
    with tf.GradientTape() as tape:  # with结构到grads框起了梯度的计算过程
        loss = tf.square(w + 1)   # 损失函数为(w+1)^2
    grads = tape.gradient(loss, w)  # .gradient函数告知谁对谁求导

    w.assign_sub(lr * grads)  # .assign_sub对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
    print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))   # 打印出每次训练后的参数w和损失函数loss

# lr初始值:0.2   请自改学习率  0.001  0.999 看收敛过程
# 最终目的:找到 loss 最小 即 w = -1 的最优参数w

TensorFlow2基本用法

基本概念

TensorFlow中数据类型包括:

  • tf.int32(32位整型)

  • tf.float32(32位浮点),是Tensor默认数据类型

  • tf.float64(64位浮点)

  • tf.bool(布尔型)

  • tf.string(字符串型)

0阶张量(标量,一个单独的数):如tf.Tensor(2, shape=(), dtype=int32)

1阶张量(向量):如tf.Tensor([6 7], shape=(2,), dtype=int32) shape中的数字2表示一维张量里有2个元素

二阶张量(矩阵):如tf.Tensor([[1 2 3] [2 2 3]], shape(2,3), dtype=int32)

张量的阶数与方括号的数量相同
shape的逗号隔开了几个数字,张量就是几维

创建张量的若干种方法:

# 方法一
tf.constant(张量内容,dtype=数据类型(可选))

# 方法二:将numpy格式化为Tensor格式
tf.convert_to_tensor(数据名,dtype=数据类型(可选)) 

# 方法三
tf.zeros(维度)  # 创建全为0的张量
tf.ones(维度)   # 创建全为1的张量
tf.fill(维度,指定值)   # 创建全为指定值的张量
# 维度部分,一维直接写个数,二维用[行,列],多维用[n,m,j,...]

# 方法四
tf.random.normal(维度,mean=均值,stddev=标准差)   # 生成正态分布的随机数,默认均值为0、标准差为1
tf.random.truncated_normal(维度,mean=均值,stddev=标准差)   # 数据一定在两倍标准差内,数据更向均值集中
tf.random.uniform(维度,minval=最小值,maxval=最大值)  # 生成指定维度的均匀分布随机数,[minval,maxval)

常用函数

tf.cast(张量名,dtype=数据类型)   # 强制将Tensor转换为该数据类型
tf.reduce_min(张量名)  # 计算张量维度上元素的最小值
tf.reduce_max(张量名)  # 计算张量维度上元素的最大值


tf.reduce_mean(张量名,axis=操作轴)   # 计算张量沿着指定维度的平均值
tf.reduce_sum(张量名,axis=操作轴)    # 计算张量沿着指定维度的和
# axis=0纵向;axis=1横向;如不指定axis,则表示对所有元素进行操作


tf.argmax(张量名,axis=操作轴)   # 返回张量沿指定维度最大值的索引
# axis=0列;axis=1行


# 四则运算(只有维度相同的张量才可以做四则运算)
tf.add(张量1,张量2)
tf.subtract(张量1,张量2)
tf.multiply(张量1,张量2)
tf.divide(张量1,张量2)


tf.square(张量名)   # 平方
tf.pow(张量名,n次方)   # n次方
tf.sqrt(张量名)   # 开方


tf.matmul(矩阵1,矩阵2)   # 两个矩阵相乘

tf.Variable

可以将变量标记为“可训练的”,被它标记了的变量会在反向传播中记录自己的梯度信息

tf.Variable(initial_value, trainable, validate_shape, name)
# initial_value默认为None,可以搭配TensorFlow随机生成函数来初始化参数
# trainable默认为True,表示可以后期被算法优化的,如果不想该变量被优化,改为False
# validate_shape默认为True,形状不接受更改,若需要更改,改为False
# name默认为None,给变量确定名称

tf.data.Dataset.from_tensor_slices((输入特征,标签))

生成输入特征-标签对,构建数据集,对Tensor与Numpy均适用

tf.GradientTape()

搭配with结构,计算损失函数在某一张量处的梯度(可以在with结构中,使用GradientTape实现某个函数对指定参数的求导运算)

配合Variable函数,可以实现损失函数loss对参数w的求导计算

with tf.GradientTape( ) as tape:
    w = tf.Variable(tf.constant(3.0))
    loss = tf.pow(w,2) 
grad = tape.gradient(loss,w) 
print(grad)   # tf.Tensor(6.0, shape=(), dtype=float32)

enumerate(列表名)     # 枚举出每一个元素,并在元素前配上对应的索引号,组合为:索引 元素。常在for循环中使用
# 例子:
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
    print(i, element)



tf.one_hot(待转换数据,depth=几分类)   # 用独热码表示标签
# 例子:
# depth确定列数,待转换数据中元素的个数确定行数
classes = 3
labels = tf.constant([1,0,2]) 
output = tf.one_hot(labels, depth=classes)
print(output)   # tf.Tensor([[0. 1. 0.] [1. 0. 0.] [0. 0. 1.]], shape=(3, 3), dtype=float32)

# 待转换数据中各元素值应小于depth,若待转换元素值≥depth,则该元素输出编码为[0,0...0,0]
classes = 3
labels = tf.constant([1,4,2]) # 输入的元素值 4 超出 depth-1
output = tf.one_hot(labels,depth=classes)
print(output)  # tf.Tensor([[0. 1. 0.] [0. 0. 0.] [0. 0. 1.]], shape=(3, 3), dtype=float32)
# 元素4对应的输出编码为[0. 0. 0.]



tf.nn.softmax()  # 使前向传播的输出值符合概率分布,进而与独热码形式的标签作比较
# 例子:
y = tf.constant ( [1.01, 2.01, -0.66] )
y_pro = tf.nn.softmax(y)
print("After softmax, y_pro is:", y_pro)  # After softmax, y_pro is: tf.Tensor([0.25598174 0.69583046 0.0481878], shape=(3,), dtype=float32)

softmax函数可以使n分类的n个输出符合概率分布,也就是每个输出值变为0-1之间的概率值,这些概率的和是1

assign_sub  # 实现参数自更新
# 使用前需利用tf.Variable定义变量w为可训练(可自更新)
# 例子:
w = tf.Variable(4)
w.assign_sub(1)  # w-=1,即w=w-1
print(w)  # <tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>

代码2:datasets.load_iris

from sklearn import datasets
from pandas import DataFrame
import pandas as pd

x_data = datasets.load_iris().data  # .data返回iris数据集所有输入特征
y_data = datasets.load_iris().target  # .target返回iris数据集所有标签
print("x_data from datasets: \n", x_data)
print("=====================================")
print("y_data from datasets: \n", y_data)
print("=====================================")

x_data = DataFrame(x_data, columns=['花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'])  # 为表格增加行索引(左侧)和列标签(上方)
pd.set_option('display.unicode.east_asian_width', True)  # 设置列名对齐
print("x_data add index: \n", x_data)
print("=====================================")

x_data['类别'] = y_data  # 新加一列,列标签为‘类别’,数据为y_data
print("x_data add a column: \n", x_data)

#类型维度不确定时,建议用print函数打印出来确认效果

150行 4列

150行 5列

代码3:iris(用神经网络实现鸢尾花分类)

  1. 准备数据:数据集读入、数据集乱序、生成train和test、把训练集和测试集中的数据配成 [输入特征,标签] 对

  1. 搭建网络:定义神经网络中的所有可训练参数

  1. 优化可训练参数,利用嵌套循环在with结构中求得损失函数loss对每个可训练参数的偏导数,更改这些可训练参数

  1. 为了查看效果,程序中可以加入每遍历一次数据集显示当前准确率,还可以画出准确率acc和损失函数loss的变化曲线图

# -*- coding: UTF-8 -*-
# 利用鸢尾花数据集,实现前向传播、反向传播,可视化loss曲线

# 导入所需模块
import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np

# 导入数据,分别为输入特征和标签
x_data = datasets.load_iris().data  # 150行4列
y_data = datasets.load_iris().target

# 随机打乱数据(因为原始数据是顺序的,顺序不打乱会影响准确率)
# seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样(为方便教学,以保每位同学结果一致)
np.random.seed(116)  # 使用相同的seed,保证打乱顺序后输入特征和标签仍然一一对应
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)  # 保证每次运行这个代码文件的结果跟上次运行的结果一样

# 将打乱后的数据集分割为训练集和测试集,训练集为前120行,测试集为后30行
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]

# 转换x的数据类型,否则后面矩阵相乘时会因数据类型不一致报错
# tf.cast(张量名,dtype=数据类型) 强制将Tensor转换为该数据类型
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)

# 使输入特征和标签值一一对应(把数据集分批次,每个批次batch组数据)
# tf.data.Dataset.from_tensor_slices((输入特征,标签))  配成[输入特征,标签]对,每次喂入一小撮(batch)
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)  # 每32组数据打包为一个batch
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

# 定义神经网络中的所有可训练参数
# 4个输入特征,故输入层为4个输入节点;因为3分类,故输出层为3个神经元(只用一层网络,输出节点数就等于分类数)
# tf.random.truncated_normal(维度,mean=均值,stddev=标准差)   默认均值为0、标准差为1。数据一定在两倍标准差内,数据更向均值集中
# 用tf.Variable()标记参数可训练
# 使用seed使每次生成的随机数相同(方便教学,使大家结果都一致,在现实使用时不写seed)
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))
b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))

lr = 0.1  # 学习率为0.1
train_loss_results = []  # 将每轮的loss记录在此列表中,为后续画loss曲线提供数据
test_acc = []  # 将每轮的acc记录在此列表中,为后续画acc曲线提供数据
epoch = 500  # 循环500轮
loss_all = 0  # 每轮分4个step,loss_all记录4个step生成的4个loss的和

# 训练部分(嵌套循环迭代,with结构更新参数,显示当前loss)
for epoch in range(epoch):  # 数据集级别的循环,每个epoch循环一次数据集
    # enumerate(列表名)  枚举出每一个元素,并在元素前配上对应的索引号,组合为:索引 元素。常在for循环中使用
    for step, (x_train, y_train) in enumerate(train_db):  # batch级别的循环,每个step循环一个batch
        '''
        在with结构中计算前向传播的预测结果y,计算损失函数loss;
        loss分别对参数w1和b1计算偏导数,更新参数w1和b1的值,打印出这一轮epoch后的损失函数值
        '''
        with tf.GradientTape() as tape:  # with结构记录梯度信息
            y = tf.matmul(x_train, w1) + b1  # 神经网络乘加运算
            y = tf.nn.softmax(y)  # 使输出y符合概率分布(此操作后与独热码同量级,可相减求loss)
            y_ = tf.one_hot(y_train, depth=3)  # 将标签值转换为独热码格式,方便计算loss和accuracy
            loss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方误差损失函数mse = mean(sum(y-out)^2)
            loss_all += loss.numpy()  # 将每个step计算出的loss累加,为后续求loss平均值提供数据,这样计算的loss更准确
        # 计算loss对各个参数的梯度
        grads = tape.gradient(loss, [w1, b1])   # 嵌套循环loss对w1和b1求偏导

        # 实现梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_grad
        # 每个step更新参数w1和b1
        w1.assign_sub(lr * grads[0])  # 参数w1自更新
        b1.assign_sub(lr * grads[1])  # 参数b自更新

    # 每个epoch,打印loss信息
    '''
    因为训练集有120组数据,batch=32,每个step只能喂入32组数据,
    需要batch级别循环4次,所以loss/4,求得每次step迭代的平均loss
    '''
    print("Epoch {}, loss: {}".format(epoch, loss_all/4))
    train_loss_results.append(loss_all / 4)  # 将4个step的loss求平均,记录在此变量中
    loss_all = 0  # loss_all归零,为记录下一个epoch的loss做准备

    # 测试部分(计算当前参数前向传播后的准确率,显示当前准确率acc)
    '''
    希望每个epoch循环后可以显示当前模型的效果,即识别准确率,
    故在epoch循环中又嵌套了一个batch级别的循环
    '''
    # total_correct为预测对的样本个数, total_number为测试的总样本数,将这两个变量都初始化为0
    total_correct, total_number = 0, 0
    # 测试时会遍历测试集中的所有数据
    for x_test, y_test in test_db:
        # 使用更新后的参数进行预测
        y = tf.matmul(x_test, w1) + b1  # 计算前向传播的预测结果y
        y = tf.nn.softmax(y)   # 变为概率分布
        pred = tf.argmax(y, axis=1)  # 返回y中最大值的索引,即预测的分类(axis=1为横向)
        pred = tf.cast(pred, dtype=y_test.dtype)   # 将pred转换为y_test即标签的数据类型
        correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)  # 若分类正确,则correct=1,否则为0,将bool型的结果转换为int型
        correct = tf.reduce_sum(correct)  # 将每个batch的correct数加起来
        total_correct += int(correct)  # 将所有batch中的correct数加起来
        total_number += x_test.shape[0]  # total_number为测试的总样本数,也就是x_test的行数,shape[0]返回变量的行数
    # 总的准确率等于total_correct/total_number
    acc = total_correct / total_number
    test_acc.append(acc)
    print("Test_acc:", acc)
    print("--------------------------")

# 绘制 loss 曲线
plt.title('Loss Function Curve')  # 图片标题
plt.xlabel('Epoch')  # x轴变量名称
plt.ylabel('Loss')  # y轴变量名称
plt.plot(train_loss_results, label="$Loss$")  # 逐点画出trian_loss_results值并连线,连线图标是Loss
plt.legend()  # 画出曲线图标
plt.show()  # 画出图像

# 绘制 Accuracy 曲线
plt.title('Acc Curve')  # 图片标题
plt.xlabel('Epoch')  # x轴变量名称
plt.ylabel('Acc')  # y轴变量名称
plt.plot(test_acc, label="$Accuracy$")  # 逐点画出test_acc值并连线,连线图标是Accuracy
plt.legend()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS基础实验操作100例--实验99三维爆炸分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验99 三维爆炸分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

Open3D ICP精配准(使用鲁棒性核函数,Python版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 标准的ICP算法(点到平面)是使得下面这个目标函数最小化: 其中 p 、 q p、q p、q是相对应的匹配点,

RocketMQ5.0.0路由中心NameServer

一、NameServer概览NameServer是RocketMQ的注册中心&#xff0c;是消息存储Broker、生产者、消费者沟通的桥梁。NameServer集群之间是相互独立的&#xff0c;Broker启动时向所有NameServer注册中心注册。通过DLedger构建NameServer集群&#xff0c;实现如主从切换等功能。启动N…

【笔记】大话设计模式24-28

【笔记】大话设计模式24-28 文章目录【笔记】大话设计模式24-2824 职责链模式24.1 Example24.2 定义24.3 Show me the code24.4 总结25 中介者模式25.1 Example25.2 定义25.3 Show me the code25.4 总结26 享元模式26.1 Example26.2 定义26.3 Show me the code26.4 总结27 解释…

aws s3 参与s3game寻找宝藏游戏挑战学习s3对象存储

参考资料 Pirates S3game workshop http://s3game-level1.s3-website.us-east-2.amazonaws.com/level1.html https://blog.benclmnt.com/notes/s3-game/ https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/index.html 强烈推荐这种寓教于乐的方式学…

【ROS2 入门】ROS 2 actions 概述

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中Parameters&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的概念“Actions ”来…

Linux 系统调用的实现(x86_64)

目录 1、系统调用的定义 1.1 SYSCALL_METADATA宏 1.2 __SYSCALL_DEFINEx定义 2、系统调用表-sys_call_table数组的定义 3、用户态系统调用流程 kernel 5.10 1、系统调用的定义 系统调用的定义我们其实都不陌生&#xff0c;类似这样的函数SYSCALL_DEFINE0&#xff0c; SYSC…

C语言常见错误汇总

1 数组遍历时使用sizeof(a) 任务&#xff1a;有个数组&#xff0c;找出第二大的数&#xff0c;并且打印出来&#xff08;使用*操作数组元素个数&#xff0c;不要使用[]&#xff09; #include<stdio.h> int main01() {int a[] { 100,100,100,234,123,500,32,68,41,99,1…

code.org免费的少儿编程入门平台

现在市面上的少儿编程课&#xff0c;都是先花9.9就能体验几节课&#xff0c;然后要花几千块才能继续学习后面的课程。这些钱大可不必花。 现在给大家推荐一个免费的网站&#xff0c;code.org&#xff0c;它是一个非营利组织创办的网站&#xff0c;目标是让每个学生都能像生物、…

高并发系统设计 --多级缓存

为了提高系统的性能&#xff0c;一般会引入“缓存机制”&#xff0c;将部分热点数据存入缓存中&#xff0c;用空间换取时间&#xff0c;以达到快速响应的目的。 我们对缓存的认知停留在redis&#xff0c;但其实缓存远远不是只有redis的&#xff0c;从客户端发起请求开始&#…

MySQL整体使用》导入数据、约束、多表查询、事务、变量类型、资源占用

我发的MySQL相关内容&#xff1a; C#基础知识体系框架图&#xff0c;及起对应我发过的博客 linux安装mysql8配置使用&#xff0c;并解决常见问题 MySQL常用命令&#xff08;DQL&#xff09; 执行脚本命令&#xff0c;本地生成SQL文件后在服务器执行 // 进入mysql命令控制 m…

svg绘(viewBox viewport preserveAspectRatio)代替png图片等

当我们的代码中需要一个小图标的时候没必要去iconfont进行下载图标使用 要是下载的png格式那么容量还很大 远不如svg 直接自己代码写 记住svg的坐标朝向和数学坐标轴不一样 实现下图添加的小图标 <svg width"20px" height"20px" style"border: …

2023java面试之Zookeeper基础

一、说说 Zookeeper 是什么&#xff1f;直译&#xff1a;从名字上直译就是动物管理员&#xff0c;动物指的是 Hadoop 一类的分布式软件&#xff0c;管理员三个字体现了 ZooKeeper 的特点&#xff1a;维护、协调、管理、监控。简述&#xff1a;有些软件你想做成集群或者分布式&a…

冯诺依曼体系结构

冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成&#xff1a; 输入单元&#xff1a;包括键盘, 鼠…

netbeans中配置maven

deploy-发布到远程maven库本节默认maven库为nexusnetbeans中按ctrl1&#xff0c;打开Project窗口&#xff1b;在Project窗口中找到相关的project或module,在项目名上点击鼠标右键&#xff1b;在弹出菜单中找到菜单“Run Maven”的子菜单“Goals”&#xff0c;并点击&#xff0c…

PCB封装创建(IC类+USB)

目录 一&#xff1a;IC类 封装原理图 规格参数选最大。创建过程 1.放置焊盘 2.我们需要八个上图焊盘&#xff0c;可以用特殊粘贴 3.丝印层设置 封装向导 右击0805R&#xff0c;选择footprint 输入焊盘尺寸 二&#xff1a;USB封装 原理图 创建过程 1.放置焊盘&#x…

SSM 03_SpringMVC REST风格 Postman SSM整合 拦截器

01-SpringMVC简介SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端&#xff0c;所…

元宇宙时代业务扩张,专精特新小巨人找到了增长“神器”

进入2023年&#xff0c;元宇宙时代正扑面而来。自从脸书公司更名为Meta以来&#xff0c;元宇宙就在全球迅速走红。《福布斯》认为&#xff0c;2030年全球元宇宙的市场规模有望高达5万亿美元。更为重要的是&#xff0c;元宇宙正在成为数实融合的新界面、未来商业的新型基础设施。…

如何在浏览器中安装使用Vue开发者工具?Vue开发者工具的安装使用?可直接提取插件安装使用

一个混迹于Github、Stack Overflow、开源中国、CSDN、博客园、稀土掘金、51CTO等 的野生程序员。 目标&#xff1a;分享更多的知识&#xff0c;充实自己&#xff0c;帮助他人 GitHub公共仓库&#xff1a;https://github.com/zhengyuzh 以github为主&#xff1a; 1、分享前端后端…

【阶段四】Python深度学习08篇:深度学习项目实战:循环神经网络SimpleRNN、LSTM进行淘宝商品评论文本情感分析

本篇的思维导图: 项目背景 随着信息化社会的发展,互联网成为方便、快捷的信息获取渠道之一。在电子商务和社会网站中,大量非结构化的评论文本作为最直观的用户体验数据被保存下来。如何利用这些文字信息归纳出用户对某一事、物的观点态度成为自然语言(NLP)领域一项…