python与深度学习(一):ANN和手写数字识别

news2024/10/6 8:26:32

目录

  • 1. 神经网络
  • 2. 线性回归
  • 3. 激活函数
    • 3.1 Sigmoid函数
    • 3.2 Relu函数
    • 3.3 Softmax函数
  • 4. ANN(全连接网络)模型结构
  • 5. 误差函数
    • 5.1 均方差误差函数
    • 5.2 交叉熵误差函数
  • 6. 手写数字识别实战
    • 6.1 工具说明
    • 6.2 导入相关库
    • 6.3 加载数据
    • 6.4 数据预处理
    • 6.5 数据处理
    • 6.6 构建网络模型
    • 6.7 模型编译
    • 6.8 模型训练
    • 6.9 模型保存
    • 6.10 模型评价
    • 6.11 模型测试
    • 6.12 模型训练结果的可视化
  • 7. 手写数字识别的ANN模型可视化结果图
  • 8. 完整代码

1. 神经网络

神经网络是学者通过对生物神经元的研究,提出了模拟生物神经元机制的人工神经网络的数学模型,生物神经元的模型抽象为如图所示的数学结构。
在这里插入图片描述
神经元输入向量𝒙 = [𝑥1,   𝑥2, 𝑥3, … , 𝑥𝑛]T,经过函数映射:𝑓: 𝒙 → 𝑦后得到输出𝑦。
考虑一种简化的情况,即线性变换:𝑓(𝒙) = 𝑤1𝑥1 + 𝑤2𝑥2 + 𝑤3𝑥3 + ⋯ + 𝑤𝑛𝑥𝑛 + b。
参数𝜃 = {𝑤1, 𝑤2, 𝑤3, . . . , 𝑤𝑛, 𝑏}确定了神经元的状态,通过固定𝜃参数即可确定此神经元的处理逻辑。当神经元输入节点数𝑛 = 1(单输入)时,神经元数学模型可进一步简化为:𝑦 = 𝑤𝑥 + 𝑏。

2. 线性回归

在这里,我们通过一个线性回归的例子了解神经网络的基本思想。
线性回归问题简单来说就是找到一条曲线使得该曲线到图中各点的距离之和最短,即求出当前模型的所有采样点上的预测值𝑤𝑥(𝑖) + 𝑏与真实值𝑦(𝑖)之间的差的平方和作为总误差ℒ的值最小的𝑤和𝑏。
在这里插入图片描述

在这里插入图片描述
而每次寻找最优值𝑤和𝑏的过程就是训练的过程,其中寻找最优值的方法叫做优化方法,常用优化方法是梯度下降法。也就是在每次训练时让参数𝑤和𝑏按照下列式子进行更新,直到找到最优解,最终结果如下图。
在这里插入图片描述
其中η是学习率。
在这里插入图片描述

3. 激活函数

以上的例子是线性的,但是实际中有很多问题是非线性的。针对于非线性问题,可以在线性模型的基础上嵌套非线性函数,就是激活函数。
在这里插入图片描述
这里的𝜎代表了某个具体的非线性激活函数。

3.1 Sigmoid函数

在这里插入图片描述

它的一个优良特性就是能够把𝑥 ∈ 𝑅的输入“压缩”到𝑥 ∈ (0,1)区间,这个区间的数值在深度学习常用来表示以下意义:
(1) 概率分布 (0,1)区间的输出和概率的分布范围[0,1]契合,可以通过 Sigmoid 函数将输出转译为概率输出。
(2) 信号强度 一般可以将 0~1 理解为某种信号的强度,如像素的颜色强度,1 代表当前通道颜色最强,0 代表当前通道无颜色;抑或代表门控值(Gate)的强度,1 代表当前门控全部开放,0 代表门控关闭。
在这里插入图片描述

3.2 Relu函数

在 ReLU激活函数提出之前,Sigmoid 函数通常是神经网络的激活函数首选。但是 Sigmoid 函数在输入值较大或较小时容易出现梯度值接近于 0 的现象,称为梯度弥散现象。出现梯度弥散现象时,网络参数长时间得不到更新,导致训练不收敛或停滞不动的现象发生,较深层次的网络模型中更容易出现梯度弥散现象。因此为了解决梯度弥散问题,提出了Relu激活函数。
在这里插入图片描述

可以看到,ReLU 对小于 0 的值全部抑制为 0;对于正数则直接输出。
在这里插入图片描述

3.3 Softmax函数

在这里插入图片描述

Softmax 函数不仅可以将输出值映射到[0,1]区间,还满足所有的输出值之和为 1 的特性。
如图的例子,输出层的输出为[2.0,1.0,0.1],经过 Softmax 函数计算后,得到输出为[0.7,0.2,0.1],每个值代表了当前样本属于每个类别的概率,概率值之和为 1。通过 Softmax函数可以将输出层的输出转译为类别概率,在分类问题中使用的非常频繁。
在这里插入图片描述

4. ANN(全连接网络)模型结构

由每个输出节点与全部的输入节点相连接,这种网络层称为全连接层。
在这里插入图片描述
通过层层堆叠上图中的全连接层,保证前一层的输出节点数与当前层的输入节点数匹配,即可堆叠出任意层数的网络。我们把这种由神经元相互连接而成的网络叫做神经网络。如下图所示,通过堆叠 4 个全连接层,可以获得层数为 4 的神经网络,由于每层均为全连接层,称为全连接网络。其中第 1~3 个全连接层在网络中间,称之为隐藏层 1、2、3,最后一个全连接层的输出作为网络的输出,称为输出层。隐藏层 1、2、3 的输出节点数分别为[256,128,64],输出层的输出节点数为 10。
在设计全连接网络时,网络的结构配置等超参数可以按着经验法则自由设置。
在这里插入图片描述

5. 误差函数

在搭建完模型结构后,下一步就是选择合适的误差函数来计算误差。常见的误差函数有均方差、交叉熵、KL 散度、Hinge Loss 函数等,其中均方差函数和交叉熵函数在深度学习中比较常见,均方差函数主要用于回归问题,交叉熵函数主要用于分类问题。

5.1 均方差误差函数

均方差(Mean Squared Error,简称 MSE)误差函数通过计算这两个点之间的欧式距离的平方来衡量两个向量之间的差距。
在这里插入图片描述
MSE 误差函数的值总是大于等于 0,当 MSE 函数达到最小值 0 时,输出等于真实标签,此时神经网络的参数达到最优状态。均方差误差函数广泛应用在回归问题中,实际上,分类问题中也可以应用均方差误差函数。

5.2 交叉熵误差函数

在这里插入图片描述

交叉熵误差函数常用于分类问题中。

6. 手写数字识别实战

6.1 工具说明

该代码是基于TensorFlow框架书写,需要下载相关库。

6.2 导入相关库

以下第三方库是python专门用于深度学习的库

# 导入tensorflow
import tensorflow as tf
# 导入keras
from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
# 引入绘制acc和loss曲线的库
import matplotlib.pyplot as plt
# 引入ANN的必要的类
from keras.layers import Dense
from keras.models import Sequential
from keras import optimizers, losses

6.3 加载数据

把MNIST数据集进行加载

"1.加载数据"
"""
x_train是mnist训练集图片,大小的28*28的,y_train是对应的标签是数字
x_test是mnist测试集图片,大小的28*28的,y_test是对应的标签是数字
"""
(x_train, y_train), (x_test, y_test) = mnist.load_data()  # 加载mnist数据集
print('mnist_data:', x_train.shape, y_train.shape, x_test.shape, y_test.shape)  # 打印训练数据和测试数据的形状

6.4 数据预处理

(1) 将输入的图片进行归一化,从0-255变换到0-1;
(2) 将输入图片的形状(60000,28,28)转换成(60000,28*28),相当于将图片拉直,便于输入给神经网络;
(3) 将标签y进行独热编码,因为神经网络的输出是10个概率值,而y是1个数, 计算loss时无法对应计算,因此将y进行独立编码成为10个数的行向量,然后进行loss的计算 独热编码:例如数值1的10分类的独热编码是[0 1 0 0 0 0 0 0 0 0,即1的位置为1,其余位置为0。

"2.数据预处理"


def preprocess(x, y):  # 数据预处理函数
    x = tf.cast(x, dtype=tf.float32) / 255.  # 将输入的图片进行归一化,从0-255变换到0-1
    x = tf.reshape(x, [28 * 28])
    """
    # 将输入图片的形状(60000,28,28)转换成(60000,28*28),
    相当于将图片拉直,便于输入给神经网络
    """
    y = tf.cast(y, dtype=tf.int32)  # 将输入图片的标签转换为int32类型
    y = tf.one_hot(y, depth=10)
    """
    # 将标签y进行独热编码,因为神经网络的输出是10个概率值,而y是1个数,
    计算loss时无法对应计算,因此将y进行独立编码成为10个数的行向量,然后进行loss的计算
    独热编码:例如数值1的10分类的独热编码是[0 1 0 0 0 0 0 0 0 0,即1的位置为1,其余位置为0
    """
    return x, y

6.5 数据处理

数据加载进入内存后,需要转换成 Dataset 对象,才能利用 TensorFlow 提供的各种便捷功能。
通过 Dataset.from_tensor_slices 可以将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象

batchsz = 128  # 每次输入给神经网络的图片数
"""
数据加载进入内存后,需要转换成 Dataset 对象,才能利用 TensorFlow 提供的各种便捷功能。
通过 Dataset.from_tensor_slices 可以将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象
"""
db = tf.data.Dataset.from_tensor_slices((x_train, y_train))  # 构建训练集对象
db = db.map(preprocess).shuffle(60000).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理
ds_val = tf.data.Dataset.from_tensor_slices((x_test, y_test))  # 构建测试集对象
ds_val = ds_val.map(preprocess).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理

6.6 构建网络模型

构建了5层ANN网络,每层的神经元个数分别是256,128,64,32,10,隐藏层的激活函数是relu,输出层的激活函数是sortmax

"3.构建网络模型"
model = Sequential([Dense(256, activation='relu'),
                      Dense(128, activation='relu'),
                      Dense(64, activation='relu'),
                      Dense(32, activation='relu'),
                      Dense(10,activation='softmax')])
"""
构建了5层ANN网络,每层的神经元个数分别是256,128,64,32,10,
隐藏层的激活函数是relu,输出层的激活函数是sortmax
"""
model.build(input_shape=(None, 28 * 28))  # 模型的输入大小
model.summary()  # 打印网络结构

6.7 模型编译

模型的优化器是Adam,学习率是0.01,
损失函数是losses.CategoricalCrossentropy,
性能指标是正确率accuracy

"4.模型编译"
model.compile(optimizer=optimizers.Adam(lr=0.01),
                loss=tf.losses.CategoricalCrossentropy(from_logits=False),
                metrics=['accuracy']
                )
"""
模型的优化器是Adam,一种优化方法,学习率是0.01,
损失函数是losses.CategoricalCrossentropy,多分类交叉熵损失函数
性能指标是正确率accuracy
"""

6.8 模型训练

模型训练的次数是5,每1次循环进行测试

"5.模型训练"
history = model.fit(db, epochs=5, validation_data=ds_val, validation_freq=1)
"""
模型训练的次数是5,每1次循环进行测试
"""

6.9 模型保存

以.h5文件格式保存模型

"6.模型保存"
model.save('ann_mnist.h5')  # 以.h5文件格式保存模型

6.10 模型评价

得到测试集的正确率

"7.模型评价"
model.evaluate(ds_val)  # 得到测试集的正确率

6.11 模型测试

对模型进行测试

"8.模型测试"
sample = next(iter(ds_val))  # 取一个batchsz的测试集数据
x = sample[0]  # 测试集数据
y = sample[1]  # 测试集的标签
pred = model.predict(x)  # 将一个batchsz的测试集数据输入神经网络的结果
pred = tf.argmax(pred, axis=1)  # 每个预测的结果的概率最大值的下标,也就是预测的数字
y = tf.argmax(y, axis=1)  # 每个标签的最大值对应的下标,也就是标签对应的数字
print(pred)  # 打印预测结果
print(y)  # 打印标签数字

6.12 模型训练结果的可视化

对模型的训练结果进行可视化

"9.模型训练时的可视化"
# 显示训练集和验证集的acc和loss曲线
acc = history.history['accuracy']  # 获取模型训练中的accuracy
val_acc = history.history['val_accuracy']  # 获取模型训练中的val_accuracy
loss = history.history['loss']  # 获取模型训练中的loss
val_loss = history.history['val_loss']  # 获取模型训练中的val_loss
# 绘值acc曲线
plt.figure(1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
# 绘制loss曲线
plt.figure(2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()  # 将结果显示出来

7. 手写数字识别的ANN模型可视化结果图

Epoch 1/5
469/469 [==============================] - 5s 6ms/step - loss: 0.2726 - accuracy: 0.9186 - val_loss: 0.1712 - val_accuracy: 0.9542
Epoch 2/5
469/469 [==============================] - 3s 5ms/step - loss: 0.1341 - accuracy: 0.9632 - val_loss: 0.1232 - val_accuracy: 0.9654
Epoch 3/5
469/469 [==============================] - 3s 5ms/step - loss: 0.1126 - accuracy: 0.9691 - val_loss: 0.1032 - val_accuracy: 0.9702
Epoch 4/5
469/469 [==============================] - 3s 5ms/step - loss: 0.0926 - accuracy: 0.9750 - val_loss: 0.1217 - val_accuracy: 0.9690
Epoch 5/5
469/469 [==============================] - 3s 5ms/step - loss: 0.0900 - accuracy: 0.9759 - val_loss: 0.1246 - val_accuracy: 0.9676

在这里插入图片描述
在这里插入图片描述
从以上结果可知,模型的准确率达到了96%。

8. 完整代码

# 导入tensorflow
import tensorflow as tf
# 导入keras
from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
# 引入绘制acc和loss曲线的库
import matplotlib.pyplot as plt
# 引入ANN的必要的类
from keras.layers import Dense
from keras.models import Sequential
from keras import optimizers, losses

"1.加载数据"
"""
x_train是mnist训练集图片,大小的28*28的,y_train是对应的标签是数字
x_test是mnist测试集图片,大小的28*28的,y_test是对应的标签是数字
"""
(x_train, y_train), (x_test, y_test) = mnist.load_data()  # 加载mnist数据集
print('mnist_data:', x_train.shape, y_train.shape, x_test.shape, y_test.shape)  # 打印训练数据和测试数据的形状

"2.数据预处理"


def preprocess(x, y):  # 数据预处理函数
    x = tf.cast(x, dtype=tf.float32) / 255.  # 将输入的图片进行归一化,从0-255变换到0-1
    x = tf.reshape(x, [28 * 28])
    """
    # 将输入图片的形状(60000,28,28)转换成(60000,28*28),
    相当于将图片拉直,便于输入给神经网络
    """
    y = tf.cast(y, dtype=tf.int32)  # 将输入图片的标签转换为int32类型
    y = tf.one_hot(y, depth=10)
    """
    # 将标签y进行独热编码,因为神经网络的输出是10个概率值,而y是1个数,
    计算loss时无法对应计算,因此将y进行独立编码成为10个数的行向量,然后进行loss的计算
    独热编码:例如数值1的10分类的独热编码是[0 1 0 0 0 0 0 0 0 0,即1的位置为1,其余位置为0
    """
    return x, y


batchsz = 128  # 每次输入给神经网络的图片数
"""
数据加载进入内存后,需要转换成 Dataset 对象,才能利用 TensorFlow 提供的各种便捷功能。
通过 Dataset.from_tensor_slices 可以将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象
"""
db = tf.data.Dataset.from_tensor_slices((x_train, y_train))  # 构建训练集对象
db = db.map(preprocess).shuffle(60000).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理
ds_val = tf.data.Dataset.from_tensor_slices((x_test, y_test))  # 构建测试集对象
ds_val = ds_val.map(preprocess).batch(batchsz)  # 将数据进行预处理,随机打散和批量处理

"3.构建网络模型"
model = Sequential([Dense(256, activation='relu'),
                      Dense(128, activation='relu'),
                      Dense(64, activation='relu'),
                      Dense(32, activation='relu'),
                      Dense(10,activation='softmax')])
"""
构建了5层ANN网络,每层的神经元个数分别是256,128,64,32,10,
隐藏层的激活函数是relu,输出层的激活函数是sortmax
"""
model.build(input_shape=(None, 28 * 28))  # 模型的输入大小
model.summary()  # 打印网络结构

"4.模型编译"
model.compile(optimizer=optimizers.Adam(lr=0.01),
                loss=tf.losses.CategoricalCrossentropy(from_logits=False),
                metrics=['accuracy']
                )
"""
模型的优化器是Adam,学习率是0.01,
损失函数是losses.CategoricalCrossentropy,
性能指标是正确率accuracy
"""

"5.模型训练"
history = model.fit(db, epochs=5, validation_data=ds_val, validation_freq=1)
"""
模型训练的次数是5,每1次循环进行测试
"""
"6.模型保存"
model.save('ann_mnist.h5')  # 以.h5文件格式保存模型

"7.模型评价"
model.evaluate(ds_val)  # 得到测试集的正确率

"8.模型测试"
sample = next(iter(ds_val))  # 取一个batchsz的测试集数据
x = sample[0]  # 测试集数据
y = sample[1]  # 测试集的标签
pred = model.predict(x)  # 将一个batchsz的测试集数据输入神经网络的结果
pred = tf.argmax(pred, axis=1)  # 每个预测的结果的概率最大值的下标,也就是预测的数字
y = tf.argmax(y, axis=1)  # 每个标签的最大值对应的下标,也就是标签对应的数字
print(pred)  # 打印预测结果
print(y)  # 打印标签数字

"9.模型训练时的可视化"
# 显示训练集和验证集的acc和loss曲线
acc = history.history['accuracy']  # 获取模型训练中的accuracy
val_acc = history.history['val_accuracy']  # 获取模型训练中的val_accuracy
loss = history.history['loss']  # 获取模型训练中的loss
val_loss = history.history['val_loss']  # 获取模型训练中的val_loss
# 绘值acc曲线
plt.figure(1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
# 绘制loss曲线
plt.figure(2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()  # 将结果显示出来


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

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

相关文章

MySQL 备份和还原

目录 一、数据备份的重要性 二、数据库备份类型 2.1 物理备份 2.2 逻辑备份 1.完全备份 2.差异备份 3.增量备份 三、常见的备份方法 3.1 物理冷备 3.2 专用备份工具 mysqldump 或 mysqlhotcopy 3.3 启用二进制日志进行增量备份 3.4 第三方工具备份 四、MySQL完全备份…

HJ53 杨辉三角的变形

描述 以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。 求第n行第一个偶数出现的位置。如果没…

v-bind复习

1.v-bind 绑定元素属性  前端讲的一系列指令,主要是将值插入到模板内容中。  但是,除了内容需要动态来决定外,某些属性我们也希望动态来绑定。  比如动态绑定 a 元素的 href 属性;  比如动态绑定 img 元素的 src 属性&am…

企业数字化转型的“有为”与“数字化”

对企业而言,推动数字化转型势在必行,但困难重重,需要破旧立新的战略设计,更需要循序渐进的策略部署。对企业而言,唯有坚持“有为数据、有为组织、有为决策、有为创新”的理念和目标,探索战略、设施、资源、…

Python对Excel不同的行分别复制不同的次数

本文介绍基于Python语言,读取Excel表格文件数据,并将其中符合我们特定要求的那一行加以复制指定的次数,而不符合要求的那一行则不复制;并将所得结果保存为新的Excel表格文件的方法。 这里需要说明,在我们之前的文章Pyt…

动态规划——粉刷房子

题目链接 leetcode在线oj题——粉刷房子 题目描述 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油…

NTFS权限

文章目录 一、NTFS权限概述二、文件系统概述三、NTFS文件系统特点1. 提高磁盘读写性能2. 可靠性3. 磁盘利用率4. 支持单个文件大于4个G 四、修改NTFS权限1. 取消权限继承2. 文件及文件夹权限3. 权限累加4. 拒绝最大5. 取得所有权6. 强制继承7. 文件复制对权限的影响 一、NTFS权…

天津良心python培训班品牌(Python开发的主要领域)

Python可以用于各种领域,如数据科学、机器学习、人工智能、网络编程等等,因此,学习Python可以为零基础同学提供广泛的职业选择,并为其他编程语言打下坚实的基础。 自学python要多久 python是一门非常适合初学者入门的编程语言&a…

Resultful风格代码代码实践

1.原则 GET 查询 POST 添加 PUI(全字段更新)、PATCH(更新部分字段)更新 DELETE 删除 2.使用复数名词 user> users car > cars product > products 3.请求和响应时候指定accpect: RequestBody reponse: ResponseBody 4.资源唯一标识在通过参数传递时使用路径传递传递 u…

128TB只要128元,国产山寨 SSD 把老外割疯了

国产颗粒崛起带动的 SSD 白菜价,你永远不知道现在的史低价是不是又在山顶。 不过,我如果拿出几乎1折的 990 Pro ,阁下应该如何应对? 正如上图所见,Amazon、AliExpress、Ebay 等老外用的网购平台上有很多这样「做慈善」…

Error:(3, 32) java: 程序包org.springframework.boot不存在

idea2018创建springboot的maven项目,之前创建项目都可以正常使用,突然创建这个项目之后就无法拉取依赖,反复刷新maven都没有用。 在网上看了一大堆文件说改这改那,结果都是错的。 最总解决方法: 错误原因是springboo…

JavaScript基础篇(1-10题)

此文章,来源于印客学院的资料【第一部分:基础篇(105题)】,这里只是分享,便于查漏补缺。 诸君可以根据自己实际情况,自行衡量,看看哪里需要加强。 概述如下: 闭包说说你对作用域链的理解JavaSc…

JavaCV音视频开发宝典:如何使用JavaCV读取mp3文件ID3V2专辑封面图片显示并保存成jpg图片和png图片并保留png透明度

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 在此之前,我们已经使用开源库"MP3AGIC“去操作mp3,读取封面图像,那么使用JavaCV能不能做到呢? 当然可以。 当然封面图片有两种情况,一种是使用jpg图片作为封面的,这种比较简…

Oracle Profile概念与示例

Profile和SQL Profile是不同的,前者是用CREATE PROFILE创建,后者和SQL Tuning有关。 profile的定义为: which is a set of limits on database resources. If you assign the profile to a user, then that user cannot exceed these limits…

【简单易懂版】使用IDEA操作Hadoop(增删改查)

文章目录 一、引入hdfs依赖二、创建hdfs工具类三、测试hdfs工具类反思 前提:服务器中已经配置好了hadoop 本人亲测,以下代码已经跑通,基础功能都可以完成!!!希望对大家有用!!&#x…

2023年,如何顺利通过品牌备案?

众所周知,在当今社会一个产品要想在市场上立足的话,那树立自己的品牌形象就显得尤为重要了,品牌形象树立起来了,才能够更好的得到消费者的认可,才会有更多的消费者来购买产品。 品牌代表了专业、规范、保证、服务等维…

解密算法王国:揭秘程序员必备技能(超详细)

解密算法王国:揭秘程序员必备技能(超详细) 概述一、算法基础二、排序算法2.1 冒泡排序 (Bubble Sort)2.2 插入排序 (Insertion Sort)2.3 快速排序 (Quick Sort)2.4 归并排序 (Merge Sort) 三、查找算法3.1 线性查找 (Linear Search)3.2 二分查…

idea专业版和idea社区版整合Tomcat,并将war包部署

文章目录 idea专业版和idea社区版整合Tomcat,并将war包部署一、idea专业版部署二、idea社区版部署三、错误案例 idea专业版和idea社区版整合Tomcat,并将war包部署 开发过程中,由于需要运用云平台,所以从新配置开发环境&#xff0…

嵌入式软件测试笔记11 | 测试设计技术简单说明

11 | 测试设计技术简单说明 1 测试设计技术的步骤1.1 确定测试情形1.2 确定逻辑测试用例1.3 确定物理测试用例1.4 建立初始化环境1.5 组合测试脚本1.6 定义测试方案 2 测试设计技术的优点3 测试设计技术的特征3.1 白盒或黑盒3.2 导出测试用例的原则3.2.1 处理逻辑3.2.2 等价类划…

Git问题:git拉取/推送github代码出现Connection closed by问题

目录 问题原因解决方法一方法二方法三 问题 使用git去拉取github代码的时候,出现了如下问题 Connection closed by ip port 致命错误:无法读取远程仓库。 请确认您有正确的访问权限并且仓库存在。 或 Connection closed by ip port fatal : Could not r…