记8(高级API实现手写数字识别

目录

  • 1、Keras:
  • 2、Sequential模型:
    • 2.1、建立Sequential模型:model=tf.keras.Sequential()
    • 2.2、添加层:model.add(tf.keras.layers.层)
    • 2.3、查看摘要:model.summary()
    • 2.4、配置训练方法:model.compile(loss,optimizer,metrics)
      • 2.4.1、损失函数:
      • 2.4.2、优化器:
      • 2.4.3、metrics评价指标
      • 2.4.4、其他(tf.keras.metrics.评价方法)
  • 3、训练模型
    • 3.1、model.fit
    • 3.2、手写数字识别的训练模型
    • 3.3、评估模型:model.evaluate(test_set_x,test_set_y,batch_size,verbose)
    • 3.4、使用模型进行预测:model.predict
    • 3.5、保存模型参数:save_weights、save
    • 3.6、保存整个模型.save(...)
    • 3.7、加载
  • 4、Sequential实现手写数字识别
    • 4.1、设计神经网络
    • 4.2、配置训练方法:
    • 4.3、评估模型
    • 4.4、保存模型
    • 4.5、使用模型预测测试集中前4个数据
    • 4.6、重新加载整个模型(对应于save()方法)

1、Keras:

由Python编写的开源人工神经网络库;面向对象,完全模块化;支持神经网络和深度学习的主流算法;
它只是一个库,计算引擎可以指定是TensorFlow、CNTK、Theano等,因此可以

  • 独立安装Keras库,在安装Keras后如果没有检测到TensorFlow,那么会自动地以依赖项的形式自动安装TensorFlow
  • 也可以直接安装TensorFlow,tf.keras会作为子模块被自动安装

2、Sequential模型:

是一种神经网络框架(像一个容器),只有一组输入和一组输出,各个层按照先后顺序堆叠

2.1、建立Sequential模型:model=tf.keras.Sequential()

model=tf.keras.Sequential()
model      #它是keras中的Sequential对象,目前来说是一个空的容器
Out[5]: <tensorflow.python.keras.engine.sequential.Sequential at 0x23e451fc7f0>

2.2、添加层:model.add(tf.keras.layers.层)

layers比如有全连接层(Dense)、卷积层、池化层…

tf.keras.layers.Dense(     #Dense表示inputs   #输入该网络层的数据,表示这个层中神经元的个数activation   #激活函数,字符串形式给出:'relu','softmax','sigmoid','tanh'input_shape  #输入数据的形状,全连接神经网络的第一层接收来自输入层的数据,必须要指明数据,后面的层接收前一层的输出,不用定义输入数据形状
)

2.3、查看摘要:model.summary()

查看网络的结构和参数信息
例如:创建下图三层神经网络(模型参数分别有40、36、15个),输入层4节点,隐含层1有8节点,隐含层2有4节点,输出层3节点
在这里插入图片描述

import tensorflow as tf
model=tf.keras.Sequential()
#下面一行代码:隐含层1共8节点,激活函数为relu函数,输入数据shape=(4,)
model.add(tf.keras.layers.Dense(8,activation="relu",input_shape=(4,)))
model.add(tf.keras.layers.Dense(4,activation="relu"))
model.add(tf.keras.layers.Dense(3,activation="softmax"))
model.summary()   #使用model.summary查看摘要信息
#输出:
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 8)                 40          #Dense表示全连接,(None, 8)是输出的形状,有40个参数
_________________________________________________________________
dense_1 (Dense)              (None, 4)                 36          #dense_1后面的数字1是系统自动加上的
_________________________________________________________________
dense_2 (Dense)              (None, 3)                 15        
=================================================================
Total params: 91
Trainable params: 91
Non-trainable params: 0
_________________________________________________________________

也可以创建Sequential模型时定义多层:(建议用上面的方法,更加清晰)

model=tf.keras.Sequential([tf.keras.layers.Dense(8,activation="relu",input_shape=(4,)),tf.keras.layers.Dense(4,activation="relu"),tf.keras.layers.Dense(3,activation="softmax")])

2.4、配置训练方法:model.compile(loss,optimizer,metrics)

loss:损失函数,optimizer:优化器,metrics:模型训练时我们希望输出的评测指标

2.4.1、损失函数:

可以以字符串形式和函数形式(可以有2种函数形式)给出

函数类型字符串形式函数形式
均方差损失函数‘mse’tf.keras.losses.mean_squared_error()
多分类交叉熵损失函数‘categorical_crossentropy’
‘sparse_categorical_crossentropy’
tf.keras.losses.categorical_crossentropy(from_logits=False)
tf.keras.losses.sparse_categorical_crossentropy(from_logits=False)
二分类交叉熵损失函数'binary_crossentropytf.keras.losses.binary_crossentropy()

注意:

  1. 表格中多分类交叉熵损失函数的标签值采用独热编码用第一行,当采用自然顺序码表示时用第二行;
  2. from_logits=False表示神经网络在输出前已经使用softmax函数,将预测结果变换为概率分布,所有输出值之和为1(前面所做的都是有转化为概率的)
  3. 二分类交叉熵损失函数就是逻辑回归时使用的,与激活函数sigmoid搭配使用,实现二分类任务

2.4.2、优化器:

Ir:学习率 momentum:动量

字符串形式函数形式
‘sgd’tf.keras.optimizers.SGD(lr,momentum)
‘adagrad’tf.keras.optimizers.Adagrad(Ir)
‘adadelta’tf.keras.optimizers.Adadelta(Ir)
‘adam’tf.keras.optimizers.Adam(lr,beta_1=0.9,beta_2=0.999)

注意:tensorflow1.x中也提供了优化器:tf.train.optimizer,但tensorflow2.0+中建议使用tf.keras.optimizer(否则可能会有命名冲突等问题)

2.4.3、metrics评价指标

metrics指定训练模型时使用的评价指标,可以使用keras模型性能评估函数、自定义性能评估函数。
其中,keras中预定义的“准确率函数”(tf.keras.metrics.函数名):

标签值:数值
预测值:数值
‘accuracy’tf.keras.metrics.Accuracy()
二分类标签值:数值
预测值:概率
‘binary_accuracy’tf.keras.metrics.binary_accuracy(threshold=0.5)
tf.keras.metrics.BinaryAccuracy(threshold=0.5)
多分类标签值:独热编码
预测值:独热编码
‘categorical_accuracy’tf.keras.metrics.categorical_accuracy()
tf.keras.metrics.CategoricalAccuracy()
多分类标签值:数值
预测值:独热编码
‘sparse_categorical_accuracy’tf.keras.metrics.sparse_categorical_accuracy()
tf.keras.metrics.SparseCategoricalAccuracy()
多分类k种标签标签值:数值
预测值:独热编码
‘top_k_categorical_accuracy’tf.keras.metrics.top_k_categorical_accuracy()
tf.keras.metrics.TopKCategoricalAccuracy()
多分类k种标签标签值:数值
预测值:独热编码
‘sparse_top_k_categorical_accuracy’tf.keras.metrics.sparse_top_k_categorical_accuracy()
tf.keras.metrics.SparseTopKCategoricalAccuracy()

在这里插入图片描述

注:

  1. “数值”就是标量值
  2. 二分类中的“threshold”表示阈值。例如threshold=0.5时,表示预测值大于0.5为1,小于0.5为0。若标签值为{0, 1, 1, 0},预测值为{0.3, 0.7, 0.6, 0.9},则准确率为75%(前3个预测正确)
  3. 列表最后2行的“k种标签”,若k=3,则表示预测值概率排名前三的类别中只要有一个和标签值一致就预测正确。

2.4.4、其他(tf.keras.metrics.评价方法)

AUCBinaryCrossentropy(二元交叉熵)MeanAbsoluteError
SUM(求和)CategoricalCrossentropyMeanAbsolutePercentageError
Mean(均值)SparseCategoricalCrossentropyMeanRelativeError
PrecisionHingeMeanSquareError
CategoricalHinge
  • 其他预设定的评价标准可以参考:https://tensorflow.google.cn/versions/r2.0/api_docs/python/tf/keras/metrics
import tensorflow as tf
model=tf.keras.Sequential()
#配置训练方法:model.compile(),当鸢尾花数据集的标签值用数值表示时(即是0&1)
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),    #优化器采用随机梯度下降法,学习率lr=0.1loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),#损失函数:稀疏交叉熵损失函数,False为默认值可以不写metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])   #稀疏交叉熵准确率,注意要有[],中括号中可以有多个评价函数,用逗号隔开
#当鸢尾花数据集的标签值用独热编码,那么将后2参数改为:
#loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False)
#metrics=[tf.keras.metrics.CategoricalAccuracy()]#手写数字识别数据集Mnist
model2=tf.keras.Sequential()
model2.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])

3、训练模型

3.1、model.fit

model.fit(训练集的输入特征,训练集的标签,batch_size=批量大小,epochs=迭代次数,shuffle=是否每轮训练之前打乱数据,   				#默认Truevalidation_data=(测试集的输入特征,测试集的标签),		#直接给出测试集数据,validation_split=从训练集划分多少比例给测试集,   		#取值0~1*100%validation_freq=测试频率,		#每隔多少轮训练使用测试集并输出一次评测指标,默认1verbose=日志显示形式)

注意:执行顺序是先validation_split划分数据集,然后shuffle打乱参数,因此若数据本身有序,要先打乱数据再进行第一轮训练。
validation_data和validation_split是二选一的,如果同时给出,则只执行前者

verbose取值: verbose=0:不在标准输出流输出
       verbose=1:输出进度条记录
       verbose=2:每个epoch输出一行记录

各参数的默认值:

model.fit(x=None,y=None,batch_size=32,epochs=1,shuffle=True,validation_data=None,validation_split=0.0,validation_freq=1,verbose=1)

3.2、手写数字识别的训练模型

#批量大小batch_size=64,训练5轮,测试数据的比例为0.2(训练集48000条数据,测试集12000条),测试频率validation_freq=1(默认),
model.fit(X_train,y_train,batch_size=64,epochs=5,validation_split=0.2)   #如果validation_split=0.0那么就只有训练集没有测试集
#输出:测试频率validation_freq默认为1,每轮训练后都显示训练指标(在model.compile(metrics=[])设定的)
Epoch 1/5        #下一行的0.0520和0.9848是训练集的损失和准确率,0.0918和0.9721是测试集的损失和准确率
750/750 [==============================] - 2s 2ms/step - loss: 0.0520 - sparse_categorical_accuracy: 0.9848 - val_loss: 0.0918 - val_sparse_categorical_accuracy: 0.9721
Epoch 2/5
750/750 [==============================] - 2s 2ms/step - loss: 0.0418 - sparse_categorical_accuracy: 0.9880 - val_loss: 0.0879 - val_sparse_categorical_accuracy: 0.9732
Epoch 3/5
750/750 [==============================] - 2s 2ms/step - loss: 0.0338 - sparse_categorical_accuracy: 0.9907 - val_loss: 0.0955 - val_sparse_categorical_accuracy: 0.9721
Epoch 4/5
750/750 [==============================] - 2s 2ms/step - loss: 0.0278 - sparse_categorical_accuracy: 0.9921 - val_loss: 0.0796 - val_sparse_categorical_accuracy: 0.9768
Epoch 5/5
750/750 [==============================] - 2s 2ms/step - loss: 0.0222 - sparse_categorical_accuracy: 0.9942 - val_loss: 0.0852 - val_sparse_categorical_accuracy: 0.9758
Out[3]: <tensorflow.python.keras.callbacks.History at 0x2089484ac40>   #fit返回一个History对象,该对象记录了整个训练过程中的性能指标变化情况
model.metrics_names      #性能评价指标(函数)可以这样子查看,这里是损失和稀疏分类准确率,
Out[4]: ['loss', 'sparse_categorical_accuracy']   #损失是默认指标,不用再compile方法中显式说明
history=model.fit(X_train,y_train,batch_size=64,epochs=5,validation_split=0.2)
type(history)
Out[6]: tensorflow.python.keras.callbacks.History
history.history
Out[7]:      #history的history属性是一个字典,4个关键字,分别是训练集和测试集上的损失和准确率,每个关键字的值是一个列表,是每轮训练的结果
{'loss': [0.018985189497470856,0.014733679592609406,0.01280575804412365,0.011680101044476032,0.00846030842512846],'sparse_categorical_accuracy': [0.9948124885559082,0.9963541626930237,0.9968541860580444,0.9971041679382324,0.9983333349227905],'val_loss': [0.08265149593353271,0.09434033930301666,0.09341054409742355,0.09228695929050446,0.09402573853731155],'val_sparse_categorical_accuracy': [0.9772499799728394,0.9754166603088379,0.9754166603088379,0.9768333435058594,0.9768333435058594]}

3.3、评估模型:model.evaluate(test_set_x,test_set_y,batch_size,verbose)

batch_size:批量大小,verbose:输出信息的方式(见上面函数fit()说明)

model.evaluate(X_test,y_test,verbose=2)
313/313 - 0s - loss: 0.0812 - sparse_categorical_accuracy: 0.9745   #损失和准确率
Out[10]: [0.08119513094425201, 0.9745000004768372]

3.4、使用模型进行预测:model.predict

model.predict(x,batch_size,verbose) #根据batch_size分批量预测数据

In [41]: model.predict(X_test[0:3])   #要和输入训练集的属性一致:1、归一化后的属性;2、是一个3维张量
Out[41]:   #返回值是一个2维数组,第一维度元素对应各个样本,第二维度是某样本对应各个标签的概率值,可以用np.argmax查看最大值下标
array([[1.24529450e-07, 2.53378785e-09, 2.86495761e-05, 1.30367815e-03,1.10695474e-10, 6.58034310e-07, 1.65426561e-11, 9.98663902e-01,3.28517558e-07, 2.63686820e-06],[5.17673072e-07, 5.53406135e-04, 9.99354422e-01, 2.06063087e-05,8.16944385e-13, 1.42126032e-06, 7.46596470e-06, 2.53397095e-11,6.20424471e-05, 8.87795566e-12],[3.26827940e-05, 9.94493604e-01, 1.19115051e-03, 1.25147795e-04,1.63687553e-04, 2.60076649e-05, 7.57008092e-05, 3.00905458e-03,8.65864626e-04, 1.69854065e-05]], dtype=float32)
In [42]: np.argmax(model.predict(tf.expand_dims(X_test[0],axis=0)))   #查看第一个元素的值,X_test[0]是二维张量需要在轴0上增加一维
Out[42]: 7

3.5、保存模型参数:save_weights、save

model.save_weights(filepath,    #指定文件路径,默认为当前路径overwrite=True,    #表示当指定文件已经存在时,是否覆盖已经存在的文件save_format=None)

模型参数可以保存为:

  1. HDF5格式(分层数据格式,Hierarchical Data Format):
  • 需要设定:文件名后缀为.hs或.keras,且save_format=None。
  • HDF5格式是一种二进制的文件格式,可以看做是一个包含group(类似于文件夹,其下面可以创建子文件夹和数据)、dataset(具体的数据)的容器
  • 效率高,常用作保存大量数据(图片,数组)
  1. SavedModel格式
  • 若没有指定为HDF5格式,则默认保存为此格式。建议显示设置save_format=‘tf’
  • 它是TensorFlow特有序列化文件格式,这种格式保存参数信息不是保存在一个文件中,而是保存在多个文件中,打开工作目录:checkpoint是检查点文件保存模型的相关信息;data文件保存所有的可训练变量(就是模型参数的值);index文件保存变量关键字和值之间的对应关系
    在这里插入图片描述
  1. 若overwrite=True,且文件已经存在就会提示是否覆盖:[WARNING] mnist_weights.index already exists - overwrite?

3.6、保存整个模型.save(…)

可以保存:神经网络的结构、模型参数、配置信息(优化器,损失函数等)、优化器状态

  • filepath有2种格式:HDF5格式、SavedModel(可参见上面的save_weights()方法)
model.save(filepath,overwrite=True,include_optimizer=True,   #是否存储当前优化器的状态,有时候需要暂时关机明天再继续训练,就需要这个为Truesave_format=None)

这个方法保存后,打开工作目录,有一个文件夹,其包含2个文件夹(assets保存一些辅助资源文件、variables保存模型参数)和一个文件(saved_model.pb保存计算图):
在这里插入图片描述

3.7、加载

  • 加载模型参数(对应于save_weights()方法):model.load_weights(filepath) #仅仅替代了model.fit()方法
    该方法仅仅保存了神经网络的模型参数,在使用前需要首先定义一个完全相同的神经网络模型
  • 加载模型(对应于save()方法):tf.keras.models.load_model()

4、Sequential实现手写数字识别

4.1、设计神经网络

在这里插入图片描述

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
mnist=tf.keras.datasets.mnist
#ndarray数组:train_x.shape=(60000, 28, 28),train_y.shape=(60000,),test_x.shape=(10000, 28, 28),test_y.shape=(10000,)
(train_x,train_y),(test_x,test_y)=mnist.load_data()
# X_train=train_x.reshsape((60000,28*28))   #将60000*28*28改为60000*784,
# X_test=test_x.reshape((10000,28*28))      #这2行可省去,在后面创建神经网络是用tf.keras.layers.Flatten()代替X_train,X_test=tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)   #归一化
y_train,y_test=tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)#建立模型
model=tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))     #flatten层不进行计算,只是把输入的数据拉直,变为一维数组
model.add(tf.keras.layers.Dense(128,activation='relu'))     #隐含层,全连接层,128节点,激活函数:relu
model.add(tf.keras.layers.Dense(10,activation='softmax'))   #隐含层,全连接层,10节点,激活函数softmax
model.summary()                     #查看网络结构和参数信息
#输出:
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten_5 (Flatten)          (None, 784)               0         
_________________________________________________________________
dense_10 (Dense)             (None, 128)               100480    
_________________________________________________________________
dense_11 (Dense)             (None, 10)                1290      
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________

4.2、配置训练方法:

#配置训练方法:
model.compile(optimizer='adam',     #优化器:adam,不用设计adam算法中的参数,因为keras中已经使用常用的公开参数作为默认值loss='sparse_categorical_crossentropy',   #损失函数:稀疏交叉熵损失函数metrics=['sparse_categorical_accuracy'])   #准确率:稀疏准确率分布函数(标签值:0~9,预测值:概率分布)
#训练模型,每次训练的结果不一样的,若已经存在模型则直接加载模型,此时模型参数将和之前结果一样
model.fit(X_train,y_train,batch_size=64,epochs=5,validation_split=0.2)     #加载模型:model.save_weights('mnist_weights.h5')
#输出:
Epoch 1/5
750/750 [==============================] - 2s 3ms/step - loss: 0.3325 - sparse_categorical_accuracy: 0.9072 - val_loss: 0.1857 - val_sparse_categorical_accuracy: 0.9482
Epoch 2/5
750/750 [==============================] - 2s 3ms/step - loss: 0.1518 - sparse_categorical_accuracy: 0.9555 - val_loss: 0.1282 - val_sparse_categorical_accuracy: 0.9647
Epoch 3/5
750/750 [==============================] - 2s 3ms/step - loss: 0.1064 - sparse_categorical_accuracy: 0.9681 - val_loss: 0.1103 - val_sparse_categorical_accuracy: 0.9677
Epoch 4/5
750/750 [==============================] - 2s 3ms/step - loss: 0.0803 - sparse_categorical_accuracy: 0.9764 - val_loss: 0.1014 - val_sparse_categorical_accuracy: 0.9695
Epoch 5/5
750/750 [==============================] - 2s 2ms/step - loss: 0.0637 - sparse_categorical_accuracy: 0.9810 - val_loss: 0.0932 - val_sparse_categorical_accuracy: 0.9720

4.3、评估模型

#评估模型,这里是损失和准确率
In [50]: ...: model.evaluate(X_test,y_test,verbose=2)
313/313 - 0s - loss: 0.0869 - sparse_categorical_accuracy: 0.9733
Out[50]: [0.08692450821399689, 0.9732999801635742]

4.4、保存模型

model.save_weights('mnist_weights.h5')   #保存模型的参数
#model.save('mnist_model.h5')   #保存模型

4.5、使用模型预测测试集中前4个数据

#使用模型
y_pred=np.argmax(model.predict(X_test[0:4]),axis=1)
for i in range(4):plt.subplot(1,4,i+1)plt.axis("off")plt.imshow(test_x[i],cmap='gray')plt.title('y='+str(test_y[i])+"\ny_pred="+str(y_pred[i]))
plt.show()In [58]: model.predict(X_test[0:4])
Out[58]:
array([[1.0333792e-06, 1.7836443e-09, 3.7520505e-05, 2.2237692e-03,8.4596380e-10, 3.6472747e-07, 4.6298947e-11, 9.9771035e-01,3.2618391e-06, 2.3784525e-05],[4.3476388e-07, 6.9682335e-04, 9.9892431e-01, 3.0969214e-04,1.7906347e-12, 1.0973981e-05, 1.4038921e-05, 2.8779685e-11,4.3727505e-05, 1.3733418e-11],[1.4807856e-06, 9.9750793e-01, 7.4583240e-04, 9.0791560e-05,1.2258282e-04, 8.2332235e-06, 2.0272743e-04, 8.5284153e-04,4.1387818e-04, 5.3609900e-05],[9.9927765e-01, 4.4347512e-08, 8.4634876e-06, 3.8136254e-06,1.9439985e-05, 3.5597732e-05, 6.4988859e-04, 4.1058142e-06,8.5573371e-09, 1.0365890e-06]], dtype=float32)

在这里插入图片描述
随机取4个样本预测:

for i in range(4):num=np.random.randint(1,10000)y_pred=np.argmax(model.predict(tf.expand_dims(X_test[num],axis=0)))plt.subplot(1,4,i+1)plt.axis("off")plt.imshow(test_x[num],cmap='gray')plt.title('y='+str(test_y[num])+"\ny_pred="+str(y_pred))
plt.show()

在这里插入图片描述

4.6、重新加载整个模型(对应于save()方法)

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
mnist=tf.keras.datasets.mnist
#ndarray数组:train_x.shape=(60000, 28, 28),train_y.shape=(60000,),test_x.shape=(10000, 28, 28),test_y.shape=(10000,)
(train_x,train_y),(test_x,test_y)=mnist.load_data()X_train,X_test=tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)   #归一化
y_train,y_test=tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)model=tf.keras.models.load_model('mnist_model.h5')
#测试模型,参数和上一次完全一样
In [9]: model.evaluate(X_test,y_test,verbose=2)
313/313 - 0s - loss: 0.0889 - sparse_categorical_accuracy: 0.9718
Out[9]: [0.08891819417476654, 0.9718000292778015]

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

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

相关文章

Android 音视频 --- EGL介绍和使用

EGL的功能 EGL API作为一套与OpenGL ES各个版本相互独立的API&#xff0c;其作用主要是管理绘图表面。EGL提供以下机制&#xff1a; 与设备的原生窗口系统通信查询绘图表面的可用类型和配置创建绘图表面在OpenGL ES3.0或其他渲染API之间同步渲染管理纹理贴图等渲染资源

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…

grpc 和 http 的区别---二进制vsJSON编码

gRPC 和 HTTP 是两种广泛使用的通信协议&#xff0c;各自适用于不同的场景。以下是它们的详细对比与优势分析&#xff1a; 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf&#xff08;二进制&#xff09;通常使用 JSON/…

文字投影效果

大家好&#xff0c;我是喝西瓜汁的兔叽&#xff0c;今天给大家分享一个常见的文字投影效果。 效果展示 我们来实现一个这样的文字效果。 思路分析 这样的效果如何实现的呢? 实际上是两组相同的文字&#xff0c;叠合在一块&#xff0c;只不过对应的css不同罢了。 首先&…

deepseek使用教程

一、准备工作 注册账号 访问 DeepSeek 官网&#xff08;如 https://www.deepseek.com/&#xff09;或对应平台。完成注册并登录&#xff0c;部分服务可能需要企业认证或申请权限。 获取 API 密钥&#xff08;如使用 API&#xff09; 进入控制台或开发者页面&#xff0c;创建 A…

Hutool工具类

Hutool 是一个非常流行的 Java 工具类库&#xff0c;它提供了丰富的功能来简化开发中的常见任务&#xff0c;比如文件操作、加密、日期处理、字符串操作、数据库工具等。它是一个轻量级的工具库&#xff0c;可以减少开发者编写常用代码的工作量&#xff0c;提高开发效率。 主要…

正态分布与柯西分布的线性组合与副本随机变量同分布

正态分布与柯西分布的线性组合与副本随机变量同分布 对于标准差为 σ \sigma σ&#xff0c;期望为0的正态分布&#xff0c;其概率密度函数为 f ( x ) 1 2 π σ exp ⁡ − x 2 2 σ 2 f(x) \frac{1}{\sqrt{2\pi}\sigma}\exp^{-\frac{x^2}{2\sigma^2}} f(x)2π ​σ1​exp−…

【C++语言】卡码网语言基础课系列----13. 链表的基础操作I

文章目录 背景知识链表1、虚拟头节点(dummyNode)2、定义链表节点3、链表的插入 练习题目链表的基础操作I具体代码实现 小白寄语诗词共勉 背景知识 链表 与数组不同&#xff0c;链表的元素存储可以是连续的&#xff0c;也可以是不连续的&#xff0c;每个数据除了存储本身的信息…

图像处理之图像灰度化

目录 1 图像灰度化简介 2 图像灰度化处理方法 2.1 均值灰度化 2.2 经典灰度化 2.3 Photoshop灰度化 2.4 C语言代码实现 3 演示Demo 3.1 开发环境 3.2 功能介绍 3.3 下载地址 参考 1 图像灰度化简介 对于24位的RGB图像而言&#xff0c;每个像素用3字节表示&#xff0…

MySQL的GROUP BY与COUNT()函数的使用问题

在MySQL中&#xff0c;GROUP BY和 COUNT()函数是数据聚合查询中非常重要的工具。正确使用它们可以有效地统计和分析数据。然而&#xff0c;不当的使用可能会导致查询结果不准确或性能低下。本文将详细讨论 GROUP BY和 COUNT()函数的使用方法及常见问题&#xff0c;并提供相应的…

【课题推荐】基于t分布的非高斯滤波框架在水下自主导航中的应用研究

水下自主导航系统在海洋探测、环境监测及水下作业等领域具有广泛的应用。然而&#xff0c;复杂的水下环境常常导致传感器输出出现野值噪声&#xff0c;这些噪声会严重影响导航信息融合算法的精度&#xff0c;甚至导致系统发散。传统的卡尔曼滤波算法基于高斯噪声假设&#xff0…

知识库管理系统为企业赋能与数字化转型的关键解决方案分析

内容概要 在当今快速发展的商业环境中&#xff0c;知识库管理系统成为企业进行数字化转型的重要支撑工具。这类系统不仅可以帮助企业高效整合和管理其知识资产&#xff0c;还能提升信息共享与沟通的效率。通过科学的知识管理策略&#xff0c;企业可以在动态市场中实现精益管理…

HTML(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…

线性代数复习笔记

1. 课程学习 1.1 3Blue1Brown 线性代数 2. 基本术语 eigenvector&#xff08;特征向量&#xff09;&#xff1a;线性变换中方向保持不变的向量 可以视作3D旋转矩阵形成的旋转的轴

vue入门到实战 二

目录 2.1 计算属性computed 2.1.1什么是计算属性 2.1.2 只有getter方法的计算属性 2.1.3 定义有getter和setter方法的计算属性 2.1.4 计算属性和methods的对比 2.2 监听器属性watch 2.2.1 watch属性的用法 2.2.2 computed属性和watch属性的对比 2.1 计算属性computed…

Python从0到100(八十六):神经网络-ShuffleNet通道混合轻量级网络的深入介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

Baklib赋能企业实现高效数字化内容管理提升竞争力

内容概要 在数字经济的浪潮下&#xff0c;企业面临着前所未有的机遇与挑战。随着信息技术的迅猛发展&#xff0c;各行业都在加速推进数字化转型&#xff0c;以保持竞争力。在这个过程中&#xff0c;数字化内容管理成为不可或缺的一环。高效的内容管理不仅能够优化内部流程&…

springboot中路径默认配置与重定向/转发所存在的域对象

Spring Boot 是一种简化 Spring 应用开发的框架&#xff0c;它提供了多种默认配置和方便的开发特性。在 Web 开发中&#xff0c;路径配置和请求的重定向/转发是常见操作。本文将详细介绍 Spring Boot 中的路径默认配置&#xff0c;并解释重定向和转发过程中存在的域对象。 一、…

六十分之三十七——一转眼、时光飞逝

一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.第三版分组、激励、立体化权限、智能设备、AIPPT做课 2.8本书 3.得到&#xff1a;头条、吴军来信2、卓克科技参考3 4.总结思考 二、计划 科学规律的&#xff0c;要结合番茄工作法、快速阅读、…

实验十 Servlet(一)

实验十 Servlet(一) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 1、参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c…