Machine Learning-Ex4(吴恩达课后习题)Neural Networks Learning

news2024/11/15 15:46:02

目录

1. Neural Networks

1.1 Visualizing the data

1.2 Model representation

1.3 Feedforward and cost function

1.4 Regularized cost function

2. Backpropagation

2.1 Sigmoid gradient 

2.2 Random initialization

2.3 Backpropagation

2.4 Gradient Checking

2.5 Regularized  Neural Networks

2.6 Learning parameters using fmincg

3. Visualizing the hidden layer


1. Neural Networks

内容:我们将使用反向传播来学习神经网络所需的参数(权重)。

1.1 Visualizing the data

内容:一共有5000个训练集,X为5000×400维度,每行样本数据表示一个由20×20像素组成的手写数字识别图像。y为每个样本的真实标签(注意:0对应的标签为10),维度为5000×1。

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']

print(X.shape, y.shape, Theta1.shape, Theta2.shape)
# (5000, 400) (5000, 1) (25, 401) (10, 26)

plot.py

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

def Plot(X):
    sample_idx = np.random.choice(np.arange(X.shape[0]), 100)  # 从0-4999中随机抽取100个数
    sample_image = X[sample_idx, :]
    fig, axisArr = plt.subplots(nrows=10, ncols=10, sharex=True, sharey=True, figsize=(10, 10))
    for r in range(10):
        for c in range(10):
            axisArr[r, c].matshow(sample_image[r * 10 + c].reshape(20, 20).T, cmap=matplotlib.cm.binary)
    plt.xticks(np.array([]))
    plt.yticks(np.array([]))
    plt.show()

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
Plot(X)

1.2 Model representation

内容:Theta1:25×401    Theta2:10 ×26

1.3 Feedforward and cost function

内容:根据已给出的Theta1和Theta2进行前向传播以及计算代价函数。特别注意,这里真实标签y需要重新编码一下,可更新为5000×10维度的矩阵,用于计算代价函数。

sigmoid.py

import numpy as np

def Sigmoid(z):
    return 1 / (1 + np.exp(-z))

forward_propagate.py

import numpy as np
from sigmoid import *

def forwardPropagate(Theta1, Theta2, X):
    X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)
    a1 = X
    z2 = a1 * Theta1.T
    a2 = Sigmoid(z2)
    a2 = np.insert(a2, 0, values=np.ones(a2.shape[0]), axis=1)
    z3 = a2 * Theta2.T
    h_theta = Sigmoid(z3)
    return h_theta

cost_function.py

import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from forward_propagate import *  # 前向传播

def costFunction(Theta1, Theta2, X, y):
    X = np.matrix(X)
    Theta1 = np.matrix(Theta1)
    Theta2 = np.matrix(Theta2)
    m = X.shape[0]
    h_theta = forwardPropagate(Theta1, Theta2, X)
    # 对y标签进行编码,使其变成5000×10维度的矩阵
    encoder = OneHotEncoder(sparse=False)
    y_onehot = encoder.fit_transform(y)
    # print(y[0], y_onehot[0, :])  # [10] [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
    first = np.sum(np.multiply(y_onehot, np.log(h_theta)), axis=1)
    second = np.sum(np.multiply(1 - y_onehot, np.log(1 - h_theta)), axis=1)
    J_theta = -np.sum(first + second) / m
    return J_theta

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图
from cost_function import *  # 代价函数

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
print(costFunction(Theta1, Theta2, X, y))

0.2876291651613189

1.4 Regularized cost function

内容:将代价函数进行正则化

cost_function_reg.py

import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from forward_propagate import *  # 前向传播

def costFunctionReg(Theta1, Theta2, X, y, learningRate):
    X = np.matrix(X)
    Theta1 = np.matrix(Theta1)
    Theta2 = np.matrix(Theta2)
    m = X.shape[0]
    h_theta = forwardPropagate(Theta1, Theta2, X)
    # 对y标签进行编码,使其变成5000×10维度的矩阵
    encoder = OneHotEncoder(sparse=False)
    y_onehot = encoder.fit_transform(y)
    first = np.sum(np.multiply(y_onehot, np.log(h_theta)), axis=1)
    second = np.sum(np.multiply(1 - y_onehot, np.log(1 - h_theta)), axis=1)
    reg = np.sum(np.power(Theta1[:, 1:], 2)) + np.sum(np.power(Theta2[:, 1:], 2))
    J_theta = -np.sum(first + second) / m + learningRate * reg / (2 * m)
    return J_theta

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图
from cost_function_reg import *  # 代价函数

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
learningRate = 1
print(costFunctionReg(Theta1, Theta2, X, y, learningRate))

0.38376985909092365

2. Backpropagation

内容:利用反向传播来计算神经网络代价函数的梯度,从而将代价函数值最小化。

2.1 Sigmoid gradient 

sigmoid_gradient.py

import numpy as np
from sigmoid import *

def sigmoidGradient(z):
    return np.multiply(Sigmoid(z), 1 - Sigmoid(z))

# print(sigmoidGradient(0))  # 0.25

2.2 Random initialization

内容:初始化theta的值。Lin为l层的单元数,Lout为l+1层的单元数。

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图
from cost_function_reg import *  # 代价函数
import numpy as np

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
learningRate = 1
input_size = 400
hidden_size = 25
num_labels = 10
# np.random.random(size):size指所生成随机数0-1的维度大小
# 这里设范围为[-0.12,0.12]
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
# print(params)
# [-0.09845394  0.07595105  0.05357422 ... -0.11991807 -0.08736149
#  -0.09793505]

2.3 Backpropagation

内容: 求误差项,误差项用于衡量此节点对于最后的输出误差的贡献度。

a. 正向传播

b. 反向传播

forward_propagate.py(增加了返回项)

import numpy as np
from sigmoid import *

def forwardPropagate(Theta1, Theta2, X):
    X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)
    a1 = X
    z2 = a1 * Theta1.T
    a2 = Sigmoid(z2)
    a2 = np.insert(a2, 0, values=np.ones(a2.shape[0]), axis=1)
    z3 = a2 * Theta2.T
    h_theta = Sigmoid(z3)
    return a1, z2, a2, z3, h_theta

注意:

1. 在计算误差项时,Z2需要变成26×1(维度)

2. 在训练集上算整体的误差项,所以要在for循环中使用delta_l=delta_l+..

back_propagation.py

import numpy as np
from forward_propagate import *  # 正向传播
from sigmoid_gradient import *  # 激活函数的导数

def backPropagation(params, input_size, hidden_size, num_labels, X, y):
    X = np.matrix(X)
    y = np.matrix(y)
    m = X.shape[0]
    Theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, input_size + 1)))
    Theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, hidden_size + 1)))
    # 1. feedforward->z、a、h
    a1, z2, a2, z3, h_theta = forwardPropagate(Theta1, Theta2, X)
    # print(a1.shape, z2.shape, a2.shape, h_theta.shape)
    # (5000, 401) (5000, 25) (5000, 26) (5000, 10)
    # 1.初始化梯度以及代价函数
    J = 0
    delta1 = np.zeros(Theta1.shape)
    delta2 = np.zeros(Theta2.shape)
    # print(delta1.shape, delta2.shape)  # (25, 401) (10, 26)
    # 2.计算代价函数
    first_term = np.sum(np.multiply(y, np.log(h_theta)))
    second_term = np.sum(np.multiply(1 - y, np.log(1 - h_theta)))
    J = -(first_term + second_term) / m
    # 3.反向传播计算出误差项(在训练集上算整体的误差项,故要用delta=delta+..)、梯度
    for i in range(m):
        a1i = a1[i, :]  # (1,401)
        z2i = z2[i, :]  # (1,25)
        a2i = a2[i, :]  # (1,26)
        h_thetai = h_theta[i, :]  # (1,10)
        yi = y[i, :]  # (1,10)

        d_error3 = h_thetai - yi  # (1,10)
        # 将z2的维度变成26×1
        z2i = np.insert(z2i, 0, values=np.ones(1))  # (1,26)
        # 求隐藏层的误差项
        d_error2 = np.multiply((Theta2.T * d_error3.T).T, sigmoidGradient(z2i))  # (1,26)
        # 求整个训练集的梯度delta1与delta2
        delta1 = delta1 + (d_error2[:, 1:]).T * a1i
        delta2 = delta2 + d_error3.T * a2i
    delta1 = delta1 / m
    delta2 = delta2 / m
    return J, delta1, delta2

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from back_propagation import *  # 反向传播

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagation(params, input_size, hidden_size, num_labels, X, y_onehot)

2.4 Gradient Checking

内容:用于检查梯度是否正确。

2.5 Regularized  Neural Networks

内容:正则化神经网络,即在之前的式子中加入正则项。

注意:用于偏置项的那一列不需要正则化。

back_propagation_reg.py

import numpy as np
from forward_propagate import *  # 正向传播
from sigmoid_gradient import *  # 激活函数的导数

def backPropagationReg(params, input_size, hidden_size, num_labels, X, y, learningRate):
    X = np.matrix(X)
    y = np.matrix(y)
    m = X.shape[0]
    Theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, input_size + 1)))
    Theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, hidden_size + 1)))
    # 1. feedforward->z、a、h
    a1, z2, a2, z3, h_theta = forwardPropagate(Theta1, Theta2, X)
    # print(a1.shape, z2.shape, a2.shape, h_theta.shape)
    # (5000, 401) (5000, 25) (5000, 26) (5000, 10)
    # 1.初始化梯度以及代价函数
    J = 0
    delta1 = np.zeros(Theta1.shape)
    delta2 = np.zeros(Theta2.shape)
    # print(delta1.shape, delta2.shape)  # (25, 401) (10, 26)
    # 2.计算代价函数
    first_term = np.sum(np.multiply(y, np.log(h_theta)))
    second_term = np.sum(np.multiply(1 - y, np.log(1 - h_theta)))
    J = -(first_term + second_term) / m
    # 3.反向传播计算出误差项(在训练集上算整体的误差项,故要用delta=delta+..)、梯度
    for i in range(m):
        a1i = a1[i, :]  # (1,401)
        z2i = z2[i, :]  # (1,25)
        a2i = a2[i, :]  # (1,26)
        h_thetai = h_theta[i, :]  # (1,10)
        yi = y[i, :]  # (1,10)

        d_error3 = h_thetai - yi  # (1,10)
        # 将z2的维度变成26×1
        z2i = np.insert(z2i, 0, values=np.ones(1))  # (1,26)
        # 求隐藏层的误差项
        d_error2 = np.multiply((Theta2.T * d_error3.T).T, sigmoidGradient(z2i))  # (1,26)
        # 求整个训练集的梯度delta1与delta2
        delta1 = delta1 + (d_error2[:, 1:]).T * a1i
        delta2 = delta2 + d_error3.T * a2i
    delta1 = delta1 / m
    delta2 = delta2 / m
    # 3.添加正则项(用于偏置项的那一列不需要正则化)
    delta1[:, 1:] = delta1[:, 1:] + (learningRate * Theta1[:, 1:]) / m
    delta2[:, 1:] = delta2[:, 1:] + (learningRate * Theta2[:, 1:]) / m
    # np.ravel:用于将多维数组变成一维数组
    # np.concatenate((a,b)):用于将多个数组拼接
    grad = np.concatenate((np.ravel(delta1), np.ravel(delta2)))
    return J, grad

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from back_propagation_reg import *  # 反向传播

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)

2.6 Learning parameters using fmincg

内容:使用fmincg得到参数最优解。

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from scipy.optimize import minimize  # 提供最优化算法函数
from back_propagation_reg import *  # 反向传播

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)
# 1.fun:目标函数
# 2.x0:初始的猜测
# 3.args=():优化的附加参数
# 4.method:要使用的方法名称,这里使用的TNC(截断牛顿算法)
# 5.jac=True,则假定fun会返回梯度以及目标函数,若为False,则将以数字方式估计梯度
# 6.options={..},带字典类型进去,maxiter指最大迭代次数
fmin = minimize(fun=backPropagationReg, x0=params,
                args=(input_size, hidden_size, num_labels, X, y_onehot, learningRate), method='TNC', jac=True,
                options={'maxiter': 250})
print(fmin)  # x-解决方案

 message: Max. number of function evaluations reached
 success: False
  status: 3
     fun: 0.1509371037493068
       x: [ 1.432e-01 -5.233e-03 ... -5.369e-01 -2.709e-01]
     nit: 22
     jac: [ 1.612e-04 -1.047e-06 ... -9.244e-05 -9.776e-05]
    nfev: 250

用优化后的参数来进行预测(精确度可达98%):

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from sklearn.metrics import classification_report  # 常用的输出模型评估报告方法
from scipy.optimize import minimize  # 提供最优化算法函数
from back_propagation_reg import *  # 反向传播
from forward_propagate import *  # 前向传播

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)
fmin = minimize(fun=backPropagationReg, x0=params,
                args=(input_size, hidden_size, num_labels, X, y_onehot, learningRate), method='TNC', jac=True,
                options={'maxiter': 250})
X = np.matrix(X)
thetafinal1 = np.matrix(np.reshape(fmin.x[:(input_size + 1) * hidden_size], (hidden_size, input_size + 1)))
thetafinal2 = np.matrix(np.reshape(fmin.x[(input_size + 1) * hidden_size:], (num_labels, hidden_size + 1)))
a1, z2, a2, z3, h_theta = forwardPropagate(thetafinal1, thetafinal2, X)
# 对于argmax,axis=1,是在行中比较,选出最大的列索引
y_pred = np.array(np.argmax(h_theta, axis=1) + 1)
print(classification_report(y, y_pred))
# precision recall f1-score support
# 精确率     召回率  调和平均数  支持度(指原始的真实数据中属于该类的个数)

              precision    recall  f1-score   support

           1       0.98      0.99      0.99       500
           2       0.99      0.98      0.99       500
           3       0.99      0.98      0.98       500
           4       0.99      0.99      0.99       500
           5       0.99      0.99      0.99       500
           6       0.99      0.99      0.99       500
           7       0.99      0.99      0.99       500
           8       0.99      1.00      1.00       500
           9       0.99      0.98      0.98       500
          10       0.99      1.00      0.99       500

    accuracy                           0.99      5000
   macro avg       0.99      0.99      0.99      5000
weighted avg       0.99      0.99      0.99      5000

3. Visualizing the hidden layer

内容:将隐藏层(25个单元)所表达的东西可视化出来。

plot.py

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

def Plot(X):
    sample_idx = np.random.choice(np.arange(X.shape[0]), 100)  # 从0-4999中随机抽取100个数
    sample_image = X[sample_idx, :]
    fig, axisArr = plt.subplots(nrows=10, ncols=10, sharex=True, sharey=True, figsize=(10, 10))
    for r in range(10):
        for c in range(10):
            axisArr[r, c].matshow(sample_image[r * 10 + c].reshape(20, 20).T, cmap=matplotlib.cm.binary)
    plt.xticks(np.array([]))
    plt.yticks(np.array([]))
    plt.show()

def plotHidden(theta):
    fig, axisArr = plt.subplots(nrows=5, ncols=5, sharex=True, sharey=True, figsize=(8, 8))
    # 1.matplotlib.pyplot.matshow(A,cmap),A-"矩阵"(一个矩阵元素对应一个图像像素),cmap-一种颜色映射方式
    # 2.matplotlib.cm为色表,binary为灰度图像标准色表,matshow为可绘制矩阵的函数
    # 3.xticks(),若传入空列表则不显示x轴
    for r in range(5):
        for c in range(5):
            axisArr[r][c].matshow(theta[r * 5 + c].reshape(20, 20), cmap=matplotlib.cm.binary)
    plt.xticks(np.array([]))
    plt.yticks(np.array([]))
    plt.show()

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from scipy.optimize import minimize  # 提供最优化算法函数
from back_propagation_reg import *  # 反向传播
from plot import *  # 可绘制隐藏层

data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)
fmin = minimize(fun=backPropagationReg, x0=params,
                args=(input_size, hidden_size, num_labels, X, y_onehot, learningRate), method='TNC', jac=True,
                options={'maxiter': 250})
X = np.matrix(X)
thetafinal1 = np.matrix(np.reshape(fmin.x[:(input_size + 1) * hidden_size], (hidden_size, input_size + 1)))
thetafinal2 = np.matrix(np.reshape(fmin.x[(input_size + 1) * hidden_size:], (num_labels, hidden_size + 1)))
plotHidden(thetafinal1[:, 1:])  # 不带偏置项

注意: 在运用神经网络的过程中,需要正则化,否则可能会引起过拟合现象。

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

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

相关文章

工厂模式白话 - 3种都有哦

前言 工厂模式(Factory Pattern)里所谓的“工厂”和现实生活中的工厂一样 主要作用都是生产产品 像食品厂、服装厂、汽车厂生产吃的、穿的、开的 设计模式里的工厂则是生产对象 划分 工厂模式可分为简单工厂、工厂方法、抽象工厂3种 有啥不同呢&a…

RecvByteBufAllocator内存分配计算

虽然了解了整个内存池管理的细节,包括它的内存分配的具体逻辑,但是每次从NioSocketChannel中读取数据时,应该分配多少内存去读呢? 例如,客户端发送的数据为1KB , 应该分配多少内存去读呢? 例如:…

梳理ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系

数字化转型中少不了ERP系统的存在,CRM、MRP、PLM、APS、MES、WMS、SRM这些系统都需要一起上吗? 如下图所示,是某企业IT系统集成架构流图。 先了解一下ERP是做什么的,ERP就是企业资源管理系统,从企业的价值链分析&…

在CSDN创作了6个月,我收获了什么?文末送书~

作者主页:阿玥的小东东主页! 正在学习:python和C/C 期待大家的关注哦 目录 一次很好的机会,让我开始了CSDN之旅 首先来看看我的几位领路人 创作动力 1W粉丝 在CSDN我收获了什么? 很高的展现量 认证创作者身份 社…

构建自动过程:FinalBuilder 8.0 Crack

使用 FinalBuilder 自动化您的构建过程很简单。使用 FinalBuilder,您无需编辑 xml 或编写脚本。可视化定义和调试您的构建脚本,然后使用 Windows 调度程序安排它们,或将它们与 Continua CI、Jenkins 或任何其他 CI 服务器集成。 成千上万的软…

手把手调参 YOLOv8 模型之 训练|验证|推理配置-详解

YOLO系列模型在目标检测领域有着十分重要的地位,随着版本不停的迭代,模型的性能在不断地提升,源码提供的功能也越来越多,那么如何使用源码就显得十分的重要,接下来通过文章带大家手把手去了解Yolov8(最新版…

Android开发—Jetpack四件套

2017年,Google发布了Android Architecture Components,包括Room、LiveData、ViewModel和Paging等组件,旨在帮助开发者更轻松地实现MVVM架构。 2018年,Google在I/O大会上推出的一套Android开发组件库,旨在帮助开发者更…

Python 小型项目大全 56~60

五十六、质数 原文:http://inventwithpython.com/bigbookpython/project56.html 质数是只能被 1 和它自己整除的数。质数有各种各样的实际应用,但是没有算法可以预测它们;我们必须一次计算一个。然而,我们知道有无限多的质数有待发…

技术招聘漫谈 | Java工程师招聘难?你可能需要这份独家指南

两周前,我们发布了一篇关于怎样招聘前端工程师的文章(点击此处顾)。在文章中,我们分析了前端岗位有哪些必不可少的考察要点,以及如何在面试中考核对方是否能写出高质量的代码,这篇文章得到了大量技术面试官…

高完整性系统工程(四): An Overview of Alloy

目录 1. 概述 2. 指定软件设计 3. 验证设计规范 4. 验证预期属性 1. 概述 在第一章中,我们将解释如何使用 Alloy 来探索一个非常简单的软件组件的设计,即大多数操作系统中存在的众所周知的垃圾箱 或回收站。目的是对如何使用 Alloy 指定和分析软件设…

MyBatis注解开发---实现自定义映射关系和关联查询

目录 一、使用注解实现自定义映射关系 1. 编写注解方法 2. 编写测试方法 3. 查看运行结果 二、使用注解实现一对一关联查询 1. 编写注解方法 2. 编写测试方法 3. 查看运行结果 三、使用注解实现一对多关联查询 1. 编写注解方法 2. 编写测试方法 3. 查看运行结果 四…

List接口中的ArrayList与LinkedList

ArrayList ArrayList的继承实现关系图 ArrayList 底层就是⼀个 Object[] 数组,当实例化ArrayList时没有指定数组容量大小,、第⼀次添加元素(调⽤ add() ⽅法)时会初始化为⼀个⻓度为 10 的数组(即默认初始化容量为 1…

[Netty源码] ByteBufAllocator内存管理器相关问题 (十一)

文章目录1.ByteBufAllocator 内存管理器2.UnpooledByteBufAllocator2.1 heap内存的分配2.2 direct内存的分配3.PooledByteBufAllocator3.1 heap内存和direct内存的分配3.2 directArena分配direct内存的流程3.3 内存规格的介绍4.缓存的相关问题4.1 缓存的数据结果4.2 命中缓存的…

一维差分思想【算法推导、深刻思考】

797. 差分 - AcWing题库 差分本质上就是前缀和的逆运算 算法推导 其实在最开始自己去完成这个题目的时候,感觉好像是可以往前缀和方向靠的,但是一下子没有想到实现方法就无疾而终了。所以最后选择的算法就只是单纯的暴力(虽然知道过不了&…

【操作系统复习】第5章 存储器管理

存储器的层次结构 存储层次 ➢ CPU寄存器 ➢ 主存:高速缓存、主存储器、磁盘缓存 ➢ 辅存:固定磁盘、可移动介质 层次越高,访问速度越快,价格也越高,存储容量也最小 寄存器和主存掉电后存储的信息不再存在&a…

2024软件工程考研之《软件工程导论》专业课复习

一、考察《软件工程导论》的学校 截止目前,考察《软件工程导论》的学校主要有: 大连理工大学887 北京航天航空大学991 北京交通大学901 河海大学846 海南大学835 新疆大学841 成都信息工程大学809 长安大学846 天津工业大学840 华东交通大学837 大连交通…

采购招投标系统-高效管控招采流程-降低采购成本

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

软考证书找工作有用吗?软考找工作用处大吗

软考证书是衡量IT技术人才能力的一种重要评价标准。 一、软考高级证书对找工作的帮助 1. 竞争力增强 软考高级证书具有一定难度和较高的专业技能要求,拥有该证书的人的技术水平和专业能力会得到认可和尊重,从而增强求职者的竞争力。 2. 拓宽职业发展…

防火墙NAT实验,双机热备实验

目录 NAT防火墙基础实验 源地址转换 服务器映射 域内双向NAT 域间双向NAT 双机热备基础实验 主备备份 负载分担 NAT防火墙基础实验 实验拓扑: 1.进入防火墙图形化页面进行配置 接口列表的配置 源地址转换 企业内部网络访问外部网络,进行源地…

如何用nodejs构造一个网站爬虫

爬虫是个什么东西 英文spider,网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些…