【深度学习】神经网络的建立与推理

文章目录

  • 神经网络(neural network)的结构
  • 神经元中常用的激活函数(activation function)
  • 神经网络的表示
  • 神经网络的代码实现
  • 使用已学习完毕的神经网络进行推理(inference)

源代码文件请点击此处!

神经网络(neural network)的结构

在这里插入图片描述

  • 输入层(input layer):第 0 层(layer 0)
  • 隐藏层(hidden layer):第 1 层(layer 1)、第 2 层(layer 2)、······、第 l − 1 l-1 l1 层(layer l − 1 l-1 l1
  • 输出层(output layer):第 l l l 层(layer l l l

神经元中常用的激活函数(activation function)

  • 线性激活函数(linear activation function)(用于线性回归):输出可正可负,相当于没有使用激活函数,所以不能使用该函数作为激活函数!

g ( z ) = z g(z) = z g(z)=z

  • ReLU(rectified linear unit)函数(用于线性回归):输出为非负,常用于神经网络的隐藏层

g ( z ) = max ⁡ ( 0 , z ) = { 0 , z < 0 z , z ≥ 0 g(z) = \max (0, z) = \begin{cases} 0, z < 0 \\ z, z \geq 0 \end{cases} g(z)=max(0,z)={0,z<0z,z0

  • sigmoid 函数(用于二元分类/逻辑回归):输出只能为正,常用于神经网络的输出层

g ( z ) = 1 1 + e − z = P ( y ^ = 1 ∣ x ⃗ ) g(z) = \frac{1}{1+e^{-z}} = P(\hat{y} = 1 | \vec{x}) g(z)=1+ez1=P(y^=1∣x )

  • softmax 函数(用于多元分类):常用于神经网络的输出层

g ( z i ) = e z i ∑ j = 1 N e z j = P ( y ^ = i ∣ x ⃗ ) g(z_{i}) = \frac{e^{z_i}}{\sum_{j=1}^{N}e^{z_j}} = P(\hat{y} = i | \vec{x}) g(zi)=j=1Nezjezi=P(y^=ix )

  • 改良的 softmax 函数:指数运算的结果容易过大而导致溢出,因此可进行如下改进:

g ( z i ) = e z i ∑ j = 1 N e z j = C e z i C ∑ j = 1 N e z j = e z i + ln ⁡ C ∑ j = 1 N e z j + ln ⁡ C = e z i + C ′ ∑ j = 1 N e z j + C ′ \begin{aligned} g(z_{i}) &= \frac{e^{z_i}}{\sum_{j=1}^{N}e^{z_j}} \\ &= \frac{Ce^{z_i}}{C\sum_{j=1}^{N}e^{z_j}} \\ &= \frac{e^{z_i + \ln C}}{\sum_{j=1}^{N}e^{z_j + \ln C}} \\ &= \frac{e^{z_i + C'}}{\sum_{j=1}^{N}e^{z_j + C'}} \\ \end{aligned} g(zi)=j=1Nezjezi=Cj=1NezjCezi=j=1Nezj+lnCezi+lnC=j=1Nezj+Cezi+C

为防止溢出,一般 C ′ C' C 取输入信号的最大值。

神经网络的表示

继续以上图为例(设神经元的激活函数为 g ( z ) g(z) g(z)):

  • 输入层 x ⃗ = a ⃗ [ 0 ] = ( a 1 [ 0 ] , a 2 [ 0 ] ) \vec{x} = \vec{a}^{[0]} = (a^{[0]}_1, a^{[0]}_2) x =a [0]=(a1[0],a2[0])
  • 第 1 层:输入 a ⃗ [ 0 ] = ( a 1 [ 0 ] , a 2 [ 0 ] ) \vec{a}^{[0]} = (a^{[0]}_1, a^{[0]}_2) a [0]=(a1[0],a2[0]),输出 a ⃗ [ 1 ] = ( a 1 [ 1 ] , a 2 [ 1 ] , a 3 [ 1 ] , a 4 [ 1 ] ) \vec{a}^{[1]} = (a^{[1]}_1, a^{[1]}_2, a^{[1]}_3, a^{[1]}_4) a [1]=(a1[1],a2[1],a3[1],a4[1])
    • a 1 [ 1 ] = g ( w ⃗ 1 [ 1 ] ⋅ a ⃗ [ 0 ] + b 1 [ 1 ] ) a^{[1]}_1 = g(\vec{w}^{[1]}_1 \cdot \vec{a}^{[0]} + b^{[1]}_1) a1[1]=g(w 1[1]a [0]+b1[1])
    • a 2 [ 1 ] = g ( w ⃗ 2 [ 1 ] ⋅ a ⃗ [ 0 ] + b 2 [ 1 ] ) a^{[1]}_2 = g(\vec{w}^{[1]}_2 \cdot \vec{a}^{[0]} + b^{[1]}_2) a2[1]=g(w 2[1]a [0]+b2[1])
    • a 3 [ 1 ] = g ( w ⃗ 3 [ 1 ] ⋅ a ⃗ [ 0 ] + b 3 [ 1 ] ) a^{[1]}_3 = g(\vec{w}^{[1]}_3 \cdot \vec{a}^{[0]} + b^{[1]}_3) a3[1]=g(w 3[1]a [0]+b3[1])
    • a 4 [ 1 ] = g ( w ⃗ 4 [ 1 ] ⋅ a ⃗ [ 0 ] + b 4 [ 1 ] ) a^{[1]}_4 = g(\vec{w}^{[1]}_4 \cdot \vec{a}^{[0]} + b^{[1]}_4) a4[1]=g(w 4[1]a [0]+b4[1])
    • 矩阵形式:令 W [ 1 ] = ( w ⃗ 1 [ 1 ] , w ⃗ 2 [ 1 ] , w ⃗ 3 [ 1 ] , w ⃗ 4 [ 1 ] ) 2 × 4 W^{[1]} = (\vec{w}^{[1]}_1, \vec{w}^{[1]}_2, \vec{w}^{[1]}_3, \vec{w}^{[1]}_4)_{2 \times 4} W[1]=(w 1[1],w 2[1],w 3[1],w 4[1])2×4 B [ 1 ] = ( b 1 [ 1 ] , b 2 [ 1 ] , b 3 [ 1 ] , b 4 [ 1 ] ) 1 × 4 B^{[1]} = (b^{[1]}_1, b^{[1]}_2, b^{[1]}_3, b^{[1]}_4)_{1 \times 4} B[1]=(b1[1],b2[1],b3[1],b4[1])1×4,则 a ⃗ [ 1 ] = g ( a ⃗ [ 0 ] W [ 1 ] + B [ 1 ] ) \vec{a}^{[1]} = g(\vec{a}^{[0]} W^{[1]} + B^{[1]}) a [1]=g(a [0]W[1]+B[1])
  • 第 2 层:输入 a ⃗ [ 1 ] = ( a 1 [ 1 ] , a 2 [ 1 ] , a 3 [ 1 ] , a 4 [ 1 ] ) \vec{a}^{[1]} = (a^{[1]}_1, a^{[1]}_2, a^{[1]}_3, a^{[1]}_4) a [1]=(a1[1],a2[1],a3[1],a4[1]),输出 a ⃗ [ 2 ] = ( a 1 [ 2 ] , a 2 [ 2 ] , a 3 [ 2 ] , a 4 [ 2 ] , a 5 [ 2 ] ) \vec{a}^{[2]} = (a^{[2]}_1, a^{[2]}_2, a^{[2]}_3, a^{[2]}_4, a^{[2]}_5) a [2]=(a1[2],a2[2],a3[2],a4[2],a5[2])
    • a 1 [ 2 ] = g ( w ⃗ 1 [ 2 ] ⋅ a ⃗ [ 1 ] + b 1 [ 2 ] ) a^{[2]}_1 = g(\vec{w}^{[2]}_1 \cdot \vec{a}^{[1]} + b^{[2]}_1) a1[2]=g(w 1[2]a [1]+b1[2])
    • a 2 [ 2 ] = g ( w ⃗ 2 [ 2 ] ⋅ a ⃗ [ 1 ] + b 2 [ 2 ] ) a^{[2]}_2 = g(\vec{w}^{[2]}_2 \cdot \vec{a}^{[1]} + b^{[2]}_2) a2[2]=g(w 2[2]a [1]+b2[2])
    • a 3 [ 2 ] = g ( w ⃗ 3 [ 2 ] ⋅ a ⃗ [ 1 ] + b 3 [ 2 ] ) a^{[2]}_3 = g(\vec{w}^{[2]}_3 \cdot \vec{a}^{[1]} + b^{[2]}_3) a3[2]=g(w 3[2]a [1]+b3[2])
    • a 4 [ 2 ] = g ( w ⃗ 4 [ 2 ] ⋅ a ⃗ [ 1 ] + b 4 [ 2 ] ) a^{[2]}_4 = g(\vec{w}^{[2]}_4 \cdot \vec{a}^{[1]} + b^{[2]}_4) a4[2]=g(w 4[2]a [1]+b4[2])
    • a 5 [ 2 ] = g ( w ⃗ 5 [ 2 ] ⋅ a ⃗ [ 1 ] + b 5 [ 2 ] ) a^{[2]}_5 = g(\vec{w}^{[2]}_5 \cdot \vec{a}^{[1]} + b^{[2]}_5) a5[2]=g(w 5[2]a [1]+b5[2])
    • 矩阵形式:令 W [ 2 ] = ( w ⃗ 1 [ 2 ] , w ⃗ 2 [ 2 ] , w ⃗ 3 [ 2 ] , w ⃗ 4 [ 2 ] , w ⃗ 5 [ 2 ] ) 4 × 5 W^{[2]} = (\vec{w}^{[2]}_1, \vec{w}^{[2]}_2, \vec{w}^{[2]}_3, \vec{w}^{[2]}_4, \vec{w}^{[2]}_5)_{4 \times 5} W[2]=(w 1[2],w 2[2],w 3[2],w 4[2],w 5[2])4×5 B [ 2 ] = ( b 1 [ 1 ] , b 2 [ 1 ] , b 3 [ 1 ] , b 4 [ 1 ] , b 5 [ 1 ] ) 1 × 5 B^{[2]} = (b^{[1]}_1, b^{[1]}_2, b^{[1]}_3, b^{[1]}_4, b^{[1]}_5)_{1 \times 5} B[2]=(b1[1],b2[1],b3[1],b4[1],b5[1])1×5,则 a ⃗ [ 2 ] = g ( a ⃗ [ 1 ] W [ 2 ] + B [ 2 ] ) \vec{a}^{[2]} = g(\vec{a}^{[1]} W^{[2]} + B^{[2]}) a [2]=g(a [1]W[2]+B[2])
  • 第 3 层:输入 a ⃗ [ 2 ] = ( a 1 [ 2 ] , a 2 [ 2 ] , a 3 [ 2 ] , a 4 [ 2 ] , a 5 [ 2 ] ) \vec{a}^{[2]} = (a^{[2]}_1, a^{[2]}_2, a^{[2]}_3, a^{[2]}_4, a^{[2]}_5) a [2]=(a1[2],a2[2],a3[2],a4[2],a5[2]),输出 a ⃗ [ 3 ] = ( a 1 [ 3 ] , a 2 [ 3 ] , a 3 [ 3 ] ) \vec{a}^{[3]} = (a^{[3]}_1, a^{[3]}_2, a^{[3]}_3) a [3]=(a1[3],a2[3],a3[3])
    • a 1 [ 3 ] = g ( w ⃗ 1 [ 3 ] ⋅ a ⃗ [ 2 ] + b 1 [ 3 ] ) a^{[3]}_1 = g(\vec{w}^{[3]}_1 \cdot \vec{a}^{[2]} + b^{[3]}_1) a1[3]=g(w 1[3]a [2]+b1[3])
    • a 2 [ 3 ] = g ( w ⃗ 2 [ 3 ] ⋅ a ⃗ [ 2 ] + b 2 [ 3 ] ) a^{[3]}_2 = g(\vec{w}^{[3]}_2 \cdot \vec{a}^{[2]} + b^{[3]}_2) a2[3]=g(w 2[3]a [2]+b2[3])
    • a 3 [ 3 ] = g ( w ⃗ 3 [ 3 ] ⋅ a ⃗ [ 2 ] + b 3 [ 3 ] ) a^{[3]}_3 = g(\vec{w}^{[3]}_3 \cdot \vec{a}^{[2]} + b^{[3]}_3) a3[3]=g(w 3[3]a [2]+b3[3])
    • 矩阵形式:令 W [ 3 ] = ( w ⃗ 1 [ 3 ] , w ⃗ 2 [ 3 ] , w ⃗ 3 [ 3 ] ) 5 × 3 W^{[3]} = (\vec{w}^{[3]}_1, \vec{w}^{[3]}_2, \vec{w}^{[3]}_3)_{5 \times 3} W[3]=(w 1[3],w 2[3],w 3[3])5×3 B [ 3 ] = ( b 1 [ 3 ] , b 2 [ 3 ] , b 3 [ 3 ] ) 1 × 3 B^{[3]} = (b^{[3]}_1, b^{[3]}_2, b^{[3]}_3)_{1 \times 3} B[3]=(b1[3],b2[3],b3[3])1×3,则 a ⃗ [ 3 ] = g ( a ⃗ [ 2 ] W [ 3 ] + B [ 3 ] ) \vec{a}^{[3]} = g(\vec{a}^{[2]} W^{[3]} + B^{[3]}) a [3]=g(a [2]W[3]+B[3])
  • 第 4 层:输入 a ⃗ [ 3 ] = ( a 1 [ 3 ] , a 2 [ 3 ] , a 3 [ 3 ] ) \vec{a}^{[3]} = (a^{[3]}_1, a^{[3]}_2, a^{[3]}_3) a [3]=(a1[3],a2[3],a3[3]),输出 a ⃗ [ 4 ] = ( a 1 [ 4 ] ) \vec{a}^{[4]} = (a^{[4]}_1) a [4]=(a1[4])
    • a 1 [ 4 ] = g ( w ⃗ 1 [ 4 ] ⋅ a ⃗ [ 3 ] + b 1 [ 4 ] ) a^{[4]}_1 = g(\vec{w}^{[4]}_1 \cdot \vec{a}^{[3]} + b^{[4]}_1) a1[4]=g(w 1[4]a [3]+b1[4])
    • 矩阵形式:令 W [ 4 ] = ( w ⃗ 1 [ 4 ] ) 3 × 1 W^{[4]} = (\vec{w}^{[4]}_1)_{3 \times 1} W[4]=(w 1[4])3×1 B [ 4 ] = ( b 1 [ 3 ] , ) 1 × 1 B^{[4]} = (b^{[3]}_1,)_{1 \times 1} B[4]=(b1[3],)1×1,则 a ⃗ [ 4 ] = g ( a ⃗ [ 3 ] W [ 4 ] + B [ 4 ] ) \vec{a}^{[4]} = g(\vec{a}^{[3]} W^{[4]} + B^{[4]}) a [4]=g(a [3]W[4]+B[4])
  • l l l:输入 a ⃗ [ l − 1 ] = ( . . . , a j [ l − 1 ] , . . . ) \vec{a}^{[l-1]} = (..., a^{[l-1]}_j, ...) a [l1]=(...,aj[l1],...),输出 a ⃗ [ l ] = ( . . . , a j [ l ] , . . . ) \vec{a}^{[l]} = (..., a^{[l]}_j, ...) a [l]=(...,aj[l],...)
    • a j [ l ] = g ( w ⃗ j [ l ] ⋅ a ⃗ [ l − 1 ] + b j [ l ] ) a^{[l]}_j = g(\vec{w}^{[l]}_j \cdot \vec{a}^{[l-1]} + b^{[l]}_j) aj[l]=g(w j[l]a [l1]+bj[l])

神经网络的代码实现

以上图为例:

import numpy as np# sigmoid 函数
def sigmoid_function(x):return 1 / (1 + np.exp(-x))# softmax 函数
def softmax_function(a):exp_a = np.exp(a)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y# 改良的 softmax 函数(防止在指数运算时发生溢出)
def softmax_function_trick(a):c = np.max(a)exp_a = np.exp(a - c)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y# ReLU 函数
def relu_function(x):return np.maximum(0, x)# 线性激活函数(恒等函数)
def linear_activation_function(x):return x# 初始化配置各个神经元的参数
def init_network():network = {} # 字典类型# 隐藏层第 1 层(layer 1):一共 4 个神经元network['W1'] = np.array([[0.1, 0.2, 0.3, 0.4],[0.5, 0.6, 0.7, 0.8]])network['B1'] = np.array([[0.1, 0.2, 0.3, 0.4]])# 隐藏层第 2 层(layer 2):一共 5 个神经元network['W2'] = np.array([[0.1, 0.2, 0.3, 0.4, 0.5],[0.6, 0.7, 0.8, 0.9, 1.0],[0.1, 0.2, 0.3, 0.4, 0.5],[0.6, 0.7, 0.8, 0.9, 1.0]])network['B2'] = np.array([[0.1, 0.2, 0.3, 0.4, 0.5]])# 隐藏层第 3 层(layer 3):一共 3 个神经元network['W3'] = np.array([[0.1, 0.2, 0.3],[0.4, 0.5, 0.6],[0.7, 0.8, 0.9],[0.6, 0.7, 0.8],[0.1, 0.2, 0.3]])network['B3'] = np.array([[0.1, 0.2, 0.3]])# 隐藏层第 4 层(layer 4):一共 1 个神经元network['W4'] = np.array([[0.1],[0.2],[0.3]])network['B4'] = np.array([[0.1]])return network# 神经元的内部实现:输入A,权重W,偏置B,激活函数g(),输出A_out
def dense(A, W, B, g):Z = np.matmul(A, W) + B # 这里是矩阵乘法,而非点乘A_out = g(Z)return A_out# 神经网络的搭建
def predict(network, X):W1, W2, W3, W4 = network['W1'], network['W2'], network['W3'], network['W4']B1, B2, B3, B4 = network['B1'], network['B2'], network['B3'], network['B4']A1 = dense(X, W1, B1, sigmoid_function) # layer 1A2 = dense(A1, W2, B2, sigmoid_function) # layer 2A3 = dense(A2, W3, B3, sigmoid_function) # layer 3A4 = dense(A3, W4, B4, linear_activation_function) # layer 4return A4# 从这里开始执行
if __name__ == '__main__':network = init_network() # 配置神经网络的参数X = np.array([[1.0, 0.5]]) # 输入层(layer 0)Y = predict(network, X) # 输出层(layer 4)print(Y)

使用已学习完毕的神经网络进行推理(inference)

  • 测试集:源自 MNIST 数据集(研究手写数字识别的数据集),数据集的下载脚本位于代码仓库的 /dataset/mnist.py
  • one-hot 表示:将正确解标签表示为 1,其他错误解标签表示为 0 的表示方法,例如:
# y: 图像数据经过神经网络计算后的输出结果,对应数字 0~9 的概率,即“0”的概率为 0.1,“2”的概率最高,为 0.6
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
# t: 监督数据,将正确解标签表示为 1,其他错误解标签表示为 0,这里正确解对应数字“2”
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
  • 代码执行流程:

    • 第一次调用函数 load_mnist 时,会自动下载 MNIST 数据集并转换为字典类型的数据,并创建文件 mnist.pkl;以后再调用时,会直接读入该文件,节省时间
    • 调用函数 init_network,这里读入文件 sample_weight.pkl,内容为已学习好的神经网络参数(至于如何学习到这些参数会在下一篇介绍)
    • 对 MNIST 中的每个图像数据,调用函数 predict,用上述参数构建神经网络,对该图像进行推理(具体是对 0 到 9 依次给出一个概率,概率最高的数字 x 说明图像最有可能是数字 x)
    • 与正确解标签进行对比,统计正确分类的个数,并得出精度结果
  • 代码实现:

# coding: utf-8import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist# ============================= activation functions ===================================# sigmoid 函数
def sigmoid_function(x):return 1 / (1 + np.exp(-x))# softmax 函数
def softmax_function(a):exp_a = np.exp(a)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y# 改良的 softmax 函数(防止在指数运算时发生溢出)
def softmax_function_trick(a):c = np.max(a)exp_a = np.exp(a - c)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y# ReLU 函数
def relu_function(x):return np.maximum(0, x)# 线性激活函数(恒等函数)
def linear_activation_function(x):return x# ============================= neural network ===================================# 神经元的内部实现:输入A,权重W,偏置B,激活函数g(),输出A_out
def dense(A, W, B, g):Z = np.matmul(A, W) + B # 这里是矩阵乘法,而非点乘A_out = g(Z)return A_out# 初始化配置各个神经元的参数,可直接导入记录了神经网络参数的pickle文件
def init_network(filename):with open(filename, 'rb') as f:network = pickle.load(f)return network# 神经网络的搭建
def predict(network, X):W1, W2, W3 = network['W1'], network['W2'], network['W3']B1, B2, B3 = network['b1'], network['b2'], network['b3']A1 = dense(X, W1, B1, sigmoid_function) # layer 1A2 = dense(A1, W2, B2, sigmoid_function) # layer 2A3 = dense(A2, W3, B3, softmax_function_trick) # layer 3return A3# 获取训练集和测试集
def get_data():# 训练集数据和结果,测试集数据和结果# 参数说明:展开为一维数组,不使用归一化,不使用 one-hot 标签(直接使用 7,2 这样简单保存正确解标签)# 详细参数说明见代码仓库内的 dataset/mnist.py(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False)return x_train, t_train, x_test, t_test# 模型评估
def assessment():pass# ============================= main ===================================if __name__ == '__main__':network = init_network('sample_weight.pkl') # 配置神经网络的参数_, _, X, T = get_data() # X:测试集数据,T:测试集正确结果accuracy_cnt = 0 # 记录推理正确的个数for i in range(X.shape[0]): # X.shape[0] 即为测试集数据个数Y = predict(network, X[i])  # 对测试集每个数据进行推理,得到 10 个概率数值的一维数组# print(Y)# axis=0:返回每一列最大值的索引;axis=1:返回每一行最大值的索引# axis=None:降为一维数组后,返回最大值的索引p = np.argmax(Y, axis=None) # 返回概率最大的索引if p == T[i]: # 如果推理结果与测试集结果相同,说明推理正确accuracy_cnt += 1print(f"accuracy: {float(accuracy_cnt) / X.shape[0]}") # 精度结果:93.52%

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

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

相关文章

毕设(二)——NB-IOT通信模块(nb卡通信测试)+gps定位

文章目录 一、关于接线2月1日记录2月4日记录 二、网络连接测试三、HTTP通信3.1 网络调试3.2 nb-lot的连接测试 一、关于接线 如果pico的供电能力不行&#xff0c;可能会直接用4.2V的锂电池对右下引脚进行供电 这个模块只支持nb卡&#xff0c;我哭死&#xff0c;20块钱&#xff…

01 Qt自定义风格控件的基本原则

目录 1.继承原生控件 2.组合原生控件 3.仿写原生控件 PS:后续将继续分享开发实践中各类自定义控件的方法、思路以及组件库 1.继承原生控件 关键字&#xff1a;继承、paintEvent 这里想说的是&#xff0c;Qt的Gui框架在封装原生控件的同时&#xff0c; 也为开发者提供了各…

每日一题——LeetCode1464.数组中两元素的最大乘积

这题就是找数组里的最大值和次大值 方法一 排序 var maxProduct function(nums) {nums.sort((a,b)>b-a)return (nums[0] - 1) * (nums[1] - 1); }; 消耗时间和内存情况&#xff1a; 方法二 一次遍历&#xff1a; var maxProduct function(nums) {let first-1,second-…

MySQL的备份与恢复案例

新建数据库 数据库备份&#xff0c;数据库为school&#xff0c;素材如下1.创建student和score表CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address…

打码半年,开源一款自定义大屏设计软件!

hi&#xff0c;大家好&#xff0c;我是Tduck马马。 最近我们开源了一款大屏软件-TReport&#xff0c;与大家分享。 TReport是一款基于Vue3技术栈的数据可视化系统&#xff0c;支持静态、动态api等数据源&#xff1b;可用于数据可视化分析、报表分析、海报设计使用。 提供自定…

leetcode hot100 分割等和子集

在本题中&#xff0c;我们是要把一个数组&#xff0c;分割成两个子集&#xff0c;并且两个子集的元素和相等。那么也就是说&#xff0c;两个子集的和是相等的&#xff0c;并且都是整个数组的一半。那我们考虑这是一个01背包问题&#xff0c;物品的价值和物品的质量一样&#xf…

linux 10 定时任务

作用: 计划任务主要是做一些周期性的任务&#xff0c; 目前最主要的用途是定期备份数据。 at命令的时间格式&#xff1a; 例子&#xff1a; crontab有系统级别的任务&#xff0c;用户的不放在这里 查看用户任务 或者用

VSCODE使用Django

https://code.visualstudio.com/docs/python/tutorial-django#_use-a-template-to-render-a-page 通过模板渲染页面 HTML文件 实现步骤 1&#xff0c; 修改代码&#xff0c;hello的App名字增加到installed_apps表中。 2&#xff0c; hello子目录下&#xff0c;创建 .\templat…

一文搞懂LDO !

7.LDO 1.原理 通过运放调节P-MOS的输出 低压差&#xff1a; 输出压降比较低&#xff0c;例如输入3.3V&#xff0c;输出可以达到3.2V。 线性&#xff1a; LDO内部的MOS管工作于线性状态。&#xff08;可变电阻区&#xff09; 稳压器&#xff1a; 说明了LDO的用途是用来给电…

Panalog大数据日志审计系统libres_syn_delete.php存在命令执行漏洞

文章目录 前言声明一、Panalog大数据日志审计系统简介二、漏洞描述三、影响版本四、漏洞复现五、整改意见 前言 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流量的信息进行日志留存&#xff0c…

Maven(基础)、MyBatis

简介 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型 (POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档 官网: http://maven.apache.org/ Maven作用 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#x…

C语言——从头开始——深入理解指针(1)

一.内存和地址 我们知道计算上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;是通过地址总线把需要的数据从内存中读取的&#xff0c;后通过数据总线把处理后的数据放回内存中。如下图所示&#xff1a; 计算机把内存划分为⼀个个的内存单元&#xff0c;每…

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload&#xff0c;然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

Android EditText关于imeOptions的设置和响应

日常开发中&#xff0c;最绕不开的一个控件就是EditText&#xff0c;随之避免不了的则是对其软键盘事件的监听&#xff0c;随着需求的不同对用户输入的软键盘要求也不同&#xff0c;有的场景需要用户输入完毕后&#xff0c;有一个确认按钮&#xff0c;有的场景需要的是回车&…

GPIO控制和命名规则

Linux提供了GPIO子系统驱动框架&#xff0c;使用该驱动框架即可灵活地控制板子上的GPIO。 GPIO命名 泰山派开发板板载了一个40PIN 2.54间距的贴片排针&#xff0c;排针的引脚定义兼容经典40PIN接口。 在后续对GPIO进行操作前&#xff0c;我们需要先了解k3566的GPIO命名规则&a…

Unity开发过程中背包系统性能优化方案

在游戏开发中&#xff0c;背包系统是非常常见并且重要的一部分。然而&#xff0c;如果不合理地设计与实现&#xff0c;它可能导致游戏运行效率降低&#xff0c;影响玩家的游戏体验。在Unity中&#xff0c;背包系统的优化需要考虑以下几个方面&#xff1a; 1. 使用对象池&#x…

SQL-2

刷题知识点&#xff1a; null不能用这种判断&#xff0c;要用is null 或者is not null 或者可用 ifnull来判断。 明确&#xff1a;数据库DB是数据存储仓库。 数据库管理系统&#xff08;Database management system&#xff0c;DBMS&#xff09;&#xff0c;是操纵和管理数据库…

《Solidity 简易速速上手小册》第8章:高级 Solidity 概念(2024 最新版)

文章目录 8.1 高级数据类型和结构8.1.1 基础知识解析更深入的理解实际操作技巧 8.1.2 重点案例&#xff1a;构建一个去中心化身份系统案例 Demo&#xff1a;创建去中心化身份系统案例代码DecentralizedIdentityContract.sol 测试和验证拓展案例 8.1.3 拓展案例 1&#xff1a;管…

http相关概念以及apache的功能

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

见微知著:数据可视化助力数字化时代决策智慧

在数字化时代的浪潮中&#xff0c;数据可视化显然是推动数字化进程不可或缺的利器。通过将复杂的数据转化为直观的图形和图表&#xff0c;数据可视化为企业和组织提供了更清晰、更有效的方式来理解和应用大量的数字信息。下面我就以可视化从业者的角度&#xff0c;来简单聊聊这…