当前位置: 首页 > news >正文

[机器学习]-3 万字话清从传统神经网络到深度学习

神经网络(Neural Networks, NNs)是机器学习的一种重要方法,灵感来源于生物神经系统,由大量互联的节点(称为神经元或单元)组成,通过调整这些节点间的连接权重来学习和表示复杂的非线性关系。传统神经网络包括感知机、Sigmoid神经元,以及更复杂的多层感知器。深度学习是基于深层次的神经网络,通过多层非线性变换从数据中学习特征和模式,通常由输入层、隐藏层和输出层组成,每一层由若干神经元构成,层与层之间通过权重连接;主流的深度学习有卷积神经网络、循环神经网络、生成对抗网络、Transformer等。

一 基于感知机的传统神经网络

感知机是最简单的也是最早的人工神经网络模型之一,由Frank Rosenblatt在1958年提出,它是一个二分类的线性分类器,可以看作是单层神经网络的基本形式。感知机模型的主要目标是找到一组权重,使得输入数据在这些权重的作用下能够正确分类。

1 模型组成

1)神经元

神经网络的基本构件是神经元。每个神经元接收多个输入信号,进行加权求和,并通过一个激活函数输出结果,即前向传播计算。

数学表达式为: y= f (∑i=1n(wixi+b)),其中xi是输入,wi是权重,b是偏置, f是激活函数,y是输出。

2)激活函数

激活函数用于引入非线性特性,使神经网络能够学习复杂的模式,常用的激活函数有:

  • Sigmoid: f(x)=1/{1 + e^{-x}}​
  • ReLU(Rectified Linear Unit): f(x)=max(0,x)
  • Tanh: f(x)=tanh(x)=(ex+e−x)/(ex−e−x)

3)层

神经网络由多个层组成:

  • 输入层输入特征向量 x=[x1,x2,...,xn]
  • 权重与输入特征对应的权重向量 w=[w1,w2,...,wn]
  • 偏置:一个常数 b
  • 输出层:通过激活函数(通常是符号函数)输出分类结果 y

2 训练过程

1)前向传播

输入数据经过各层网络的处理,最终产生输出。前向传播用于计算网络的预测结果。

2)损失函数

用于衡量预测结果与实际结果之间的差距。常见的损失函数有:

  • 均方误差(MSE):用于回归问题。MSE=1/n ∑i=1n(yi​−y^i)2
  • 交叉熵损失(Cross-Entropy Loss):用于分类问题。 常用二元交叉熵损失函数:L(y,y^)=−(ylog(y^)+(1−y)log(1−y^))

3)反向传播

通过计算损失函数相对于每个权重的梯度,更新网络权重以最小化损失。反向传播步骤:

  • 计算梯度:利用链式法则计算损失函数相对于每个权重的梯度。

∂L/∂w =(y^−y)x

∂L/∂b =y^−y

  • 更新权重:使用优化算法(如梯度下降)更新权重。

w←w−η(∂L/∂w )​

b←b−η(∂L/∂b)

4)优化算法

用于调整网络权重以最小化损失函数。常用的优化算法有:

  • 梯度下降:基本的优化算法,通过不断调整权重以最小化损失。
  • 随机梯度下降:每次仅使用一个样本计算梯度,适用于大规模数据。
  • Adam:结合了动量和自适应学习率,具有更好的收敛性。

二 深度学习

深度学习模型的组成与传统感知机模型类似,每个神经元接收输入信号,通过激活函数进行非线性变换后输出。前向传播就是指从输入层到输出层的计算过程,在每一层输入信号通过权重进行线性变换,然后通过激活函数进行非线性变换。损失函数用于衡量模型预测值与真实值之间的差异,常用的损失函数是均方误差和交叉熵损失函数。反向传播用于计算损失函数相对于每个权重和偏置的梯度,通过优化算法例如梯度下降用于最小化损失函数,从而更新模型参数。

卷积神经网络(CNN)

卷积神经网络是深度学习的一种专门用于处理具有网格拓扑结构(如图像)的数据的神经网络,在计算机视觉和图像处理等领域表现出色,并且广泛应用于诸如图像分类、目标检测和语义分割等任务。

1 网络组成

卷积神经网络由卷积层、池化层和全连接层组成,通过这几种层的组合,CNN能够有效地捕捉图像的空间和局部信息。

1)卷积层

卷积层是CNN的核心组件,用于提取输入数据的局部特征。卷积层通过卷积核(滤波器)在输入数据上滑动,并计算卷积运算的结果,产生特征图。

- 卷积运算:卷积运算是将卷积核与输入数据的每个局部区域进行逐元素相乘并求和,结果作为该区域的特征值。

- 卷积核:卷积核是一个小的权重矩阵,其大小通常远小于输入数据。卷积核的权重是通过训练学习得到的。

- 步幅:步幅决定卷积核在输入数据上滑动的步长。

- 填充:为了保持输出尺寸与输入尺寸一致,可以在输入数据的边缘填充零值。

2)池化层

池化层用于降低特征图的尺寸,从而减少参数数量和计算量,同时保留最重要的特征。池化操作通常有最大池化(Max Pooling)和平均池化(Average Pooling)。

- 最大池化:取池化窗口中的最大值作为特征值。

- 平均池化:取池化窗口中的平均值作为特征值。

3)全连接层

全连接层将前一层输出的特征图展平成一维向量,并与权重矩阵相乘,再加上偏置,最后通过激活函数进行非线性变换。全连接层用于综合高层次特征,并进行分类或回归任务。

2 典型结构示例

1)输入层:输入图像,例如28x28x1的灰度图像。

2)卷积层1:使用32个3x3的卷积核,步幅为1,填充方式为"SAME",输出尺寸为28x28x32。

3)池化层1:使用2x2的最大池化窗口,步幅为2,输出尺寸为14x14x32。

4)卷积层2:使用64个3x3的卷积核,步幅为1,填充方式为"SAME",输出尺寸为14x14x64。

5)池化层2:使用2x2的最大池化窗口,步幅为2,输出尺寸为7x7x64。

6)展平层:将特征图展平成一维向量,尺寸为7x7x64=3136。

7)全连接层1:具有128个神经元,激活函数为ReLU。

8)全连接层2:具有10个神经元,激活函数为Softmax,用于10类分类任务。

3 工作机制

卷积神经网络通过前向传播和反向传播来进行训练和预测。

1)前向传播

前向传播是指将输入数据依次通过卷积层、池化层和全连接层,最终得到输出结果。

2)反向传播

反向传播用于训练CNN模型,通过计算损失函数的梯度并更新权重和偏置,以最小化损失函数。反向传播包括以下步骤:

- 计算损失函数:根据预测值和真实值计算损失,例如交叉熵损失或均方误差。

- 梯度计算:使用链式法则计算损失函数对每层参数的梯度。

- 参数更新:使用梯度下降或其变种(如Adam优化算法)更新每层的权重和偏置。

4 典型应用

卷积神经网络在许多领域有广泛的应用,以下是几个主要的应用场景:

图像分类:CNN在图像分类任务中表现出色,例如在著名的ImageNet竞赛中,许多顶级模型都是基于CNN的。通过学习图像的局部特征和全局模式,CNN能够高效地进行图像分类。

目标检测:识别图像中的多个对象并确定它们的位置,Faster R-CNN、YOLO和SSD等基于CNN的模型在目标检测领域取得了显著成果。

语义分割:需要将图像中的每个像素分配给一个类别。U-Net和SegNet等基于CNN的模型在医学图像分割和自动驾驶等领域得到广泛应用。

5 实现示例

以下是一个使用Python和Keras框架实现的简单卷积神经网络,用于MNIST手写数字分类任务:

import tensorflow as tf

from tensorflow.keras.datasets import mnist

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

from tensorflow.keras.utils import to_categorical

# 加载MNIST数据集

(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 预处理数据

X_train = X_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0

X_test = X_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0

y_train = to_categorical(y_train, 10)

y_test = to_categorical(y_test, 10)

# 构建卷积神经网络模型

model = Sequential([

    Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),

    MaxPooling2D(pool_size=(2, 2)),

    Conv2D(64, kernel_size=(3, 3), activation='relu'),

    MaxPooling2D(pool_size=(2, 2)),

    Flatten(),

    Dense(128, activation='relu'),

    Dense(10, activation='softmax')

])

# 编译模型

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型

model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2)

# 评估模型

loss, accuracy = model.evaluate(X_test, y_test)

print(f'Test accuracy: {accuracy}')

循环神经网络(RNN)

循环神经网络是一种用于处理序列数据的神经网络,具有时间记忆能力能够捕捉输入数据中的时序信息,在自然语言处理、语音识别和时间序列预测等领域有广泛的应用。常见变种包括长短期记忆(LSTM)和门控循环单元(GRU)。

1 网络组成

RNN的核心思想是利用隐藏状态来存储和传递序列信息,与其它神经网络不同的是它在每个时间步都会将前一个时间步的隐藏状态作为当前时间步的输入之一,从而在序列中传递信息。RNN由输入层、隐藏层和输出层组成:

1)输入层:接收当前时间步的输入向量 xt。

2)隐藏层:计算当前时间步的隐藏状态ht,隐藏状态由当前输入向量 xt和前一时间步的隐藏状态 h{t-1} 共同决定。

ht​=σ(Wh​xt​+Uh​ h{t-1} +bh​)

3)输出层:计算当前时间步的输出向量 yt。

yt​=σ(Wy​ht​+by​)

其中Wh、Uh、Wy、bh和by是网络的权重和偏置参数,σ是激活函数。

2 RNN的变种

虽然RNN能够捕捉序列中的时序信息,但它在处理长序列时会遇到梯度消失和梯度爆炸问题。为了解决这些问题,出现了多种RNN的变种,包括长短期记忆网络(LSTM)和门控循环单元(GRU)。

1)长短期记忆网络

LSTM通过引入门控机制来控制信息的流动,从而有效地缓解了梯度消失问题。LSTM包括三个门:输入门、遗忘门和输出门,用于控制信息的存储、更新和输出。

- 遗忘门:控制前一时间步的记忆细胞 c{t-1} 是否保留。

ft​=σ(Wf xt​+Uf h{t-1} +bf​)

- 输入门:控制当前输入 xt是否写入记忆细胞。

it​=σ(Wi xt​+Ui h{t-1} +bi​)

c~t = tanh (Wc xt​+Uc h{t-1} +bc​)

- 输出门:控制记忆细胞 ct是否输出到隐藏状态ht。

ot =σ(Wo xt​+Uo h{t-1} +bo​)

ct =ft ⊙ct−1​+it ⊙c~t​

ht =ot ⊙tanh(ct )

2)门控循环单元(GRU)

GRU是LSTM的简化版,通过合并输入门和遗忘门来减少参数数量,从而提高计算效率。GRU包括两个门:更新门和重置门。

- 更新门:控制隐藏状态ht的更新。

zt =σ(Wz xt​+Uzh{t-1} +bz​)

- 重置门:控制前一时间步的隐藏状态h{t-1} 是否重置。

rt =σ(Wr xt​+Ur h{t-1} +br​)

h~t =tanh(Wh xt​+Uh (rt ⊙h{t-1} )+bh​)

ht =(1−zt )⊙h{t-1} +zt⊙h~t​

3 工作机制

RNN通过前向传播和反向传播进行训练和预测。

1)前向传播

前向传播是指将输入序列依次通过RNN的每个时间步,最终得到输出序列。

1.1)初始化隐藏状态:将隐藏状态h0初始化为零或随机值。

1.2)计算隐藏状态和输出:从时间步1到T,依次计算每个时间步的隐藏状态ht和输出 yt。

1.3)保存隐藏状态和输出:将每个时间步的隐藏状态和输出保存下来,用于后续的反向传播。

2)反向传播

反向传播用于计算损失函数的梯度,并更新RNN的参数。由于RNN具有时间步的依赖性,反向传播需要通过时间展开(Unrolling)来计算每个时间步的梯度。

2.1)计算损失函数:根据预测值和真实值计算损失,例如交叉熵损失或均方误差。

2.2)时间展开:将RNN在时间步上的计算展开为一个展开图。

2.3)计算梯度:使用链式法则计算损失函数对每层参数的梯度。

2.4)参数更新:使用梯度下降或其变种(如Adam优化算法)更新每层的权重和偏置。

4 典型应用

RNN在许多领域有广泛的应用,以下是几个主要的应用场景:

自然语言处理(NLP)

- 语言模型:预测句子中下一个词语的概率。

- 机器翻译:将输入语言序列翻译为目标语言序列。

- 文本生成:根据给定的起始文本生成自然语言文本。

语音识别:RNN在语音识别任务中用于将语音信号转换为文本,能够捕捉语音信号中的时序信息,从而提高识别准确率。

时间序列预测:RNN在时间序列预测任务中用于预测未来的数据点,例如使用RNN预测股票价格、天气变化和经济指标等。

5 实现示例

以下是一个使用Python和Keras框架实现的简单RNN,用于文本生成任务:

import numpy as np

import tensorflow as tf

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import SimpleRNN, Dense

from tensorflow.keras.utils import to_categorical

# 生成示例数据

data = "hello world"

chars = sorted(list(set(data)))

char_to_index = {char: index for index, char in enumerate(chars)}

index_to_char = {index: char for index, char in enumerate(chars)}

X = []

y = []

for i in range(len(data) - 1):

    X.append(char_to_index[data[i]])

    y.append(char_to_index[data[i + 1]])

X = np.array(X).reshape(-1, 1, 1)

y = to_categorical(y, num_classes=len(chars))

# 构建RNN模型

model = Sequential([

    SimpleRNN(50, input_shape=(1, 1), return_sequences=True),

    SimpleRNN(50),

    Dense(len(chars), activation='softmax')

])

# 编译模型

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型

model.fit(X, y, epochs=100, verbose=2)

# 文本生成函数

def generate_text(model, start_char, num_chars):

    generated = start_char

    for _ in range(num_chars):

        x = np.array([char_to_index[generated[-1]]]).reshape(-1, 1, 1)

        pred = model.predict(x, verbose=0)

        next_char = index_to_char[np.argmax(pred)]

        generated += next_char

    return generated

# 生成文本

print(generate_text(model, 'h', 10))

生成对抗网络(GAN)

GAN由Ian Goodfellow等人在2014年提出的深度学习模型,由生成器和判别器两个网络组成,通过博弈过程生成与真实数据分布相似的新数据。GANs在图像生成、视频生成、文本生成等领域有广泛的应用。

1 网络组成

GANs由两个神经网络组成:生成器(Generator)和判别器(Discriminator),生成器试图生成逼真的数据,而判别器则尝试区分生成的数据和真实数据。两个网络通过一个零和博弈相互对抗,最终生成器能够生成与真实数据难以区分的数据。

1)生成器

生成器接受一个随机噪声向量作为输入,通过一系列非线性变换,输出一个与真实数据分布相似的样本。生成器的目标是最大化判别器对生成样本的误判率。

生成器的目标函数:minG​V(G,D)=Ez∼pz(z) [log(1−D(G(z)))]

2)判别器

判别器接受一个样本作为输入,输出一个表示样本为真实数据的概率。判别器的目标是最大化对真实数据的正确分类率,同时最小化对生成数据的误分类率。

判别器的目标函数:maxD​V(G,D)=Ex∼pdata(x) [logD(x)] + Ez∼pz(z) [log(1−D(G(z)))]

3)GAN的总体目标函数

GAN的总体目标是找到生成器和判别器的纳什均衡点,使得生成器生成的样本与真实数据难以区分。

总体目标函数:minG maxD​V(G,D)=Ex∼pdata(x) [logD(x)]+Ez∼pz(z) [log(1−D(G(z)))]

2 典型网络

GAN的基本结构包括生成器和判别器两个部分。生成器通常是一个深度神经网络,接受随机噪声作为输入,生成与真实数据分布相似的样本。判别器也是一个深度神经网络,接受样本作为输入,输出样本为真实数据的概率。

1)生成器的结构

生成器的输入是一个低维的随机噪声向量,通过一系列的全连接层、卷积层或反卷积层,生成高维的样本。例如,生成图像的生成器通常包括反卷积层和批量归一化层。

2)判别器的结构

判别器的输入是一个样本,通过一系列的卷积层、全连接层和激活函数,输出样本为真实数据的概率。判别器通常使用卷积层和最大池化层来提取特征。

3 训练过程

GAN的训练过程是生成器和判别器交替优化的过程。具体步骤如下:

1)初始化生成器和判别器的参数。

2)训练判别器:

   - 从真实数据分布中采样一个真实样本。

   - 从随机噪声分布中采样一个噪声向量,通过生成器生成一个样本。

   - 计算判别器对真实样本和生成样本的分类损失,并更新判别器的参数。

3)训练生成器:

   - 从随机噪声分布中采样一个噪声向量,通过生成器生成一个样本。

   - 计算判别器对生成样本的分类损失,并更新生成器的参数。

4)重复步骤2和步骤3,直到模型收敛。

4 典型应用

GANs在许多领域都有广泛的应用,包括但不限于以下几个方面:

图像生成:GANs在图像生成方面取得了显著的成功。通过训练GANs,可以生成高质量的图像,如人脸生成、风格迁移(如CycleGAN)、超分辨率图像生成等。

图像修复:GANs可以用于图像修复任务,如去噪、补全缺失部分等。例如使用GANs可以将有缺陷的图像修复为完整的图像。

图像超分辨率:使用GANs可以将低分辨率图像放大为高分辨率图像,同时保持细节和清晰度。例如SRGAN是一种用于超分辨率图像生成的GAN模型。

生成文本:GANs也可以用于文本生成任务,如生成与真实文本相似的句子、段落等。例如TextGAN是一种用于文本生成的GAN模型。

生成视频:GANs可以用于生成连续的视频帧,从而生成与真实视频相似的视频内容。例如MoCoGAN是一种用于生成视频的GAN模型。

5 实现示例

以下是一个使用Python和Keras框架实现的简单GAN,用于生成手写数字图像(MNIST数据集)

import numpy as np

from tensorflow.keras.layers import Input, Dense, Reshape, Flatten, Dropout

from tensorflow.keras.layers import BatchNormalization, Activation, LeakyReLU

from tensorflow.keras.models import Sequential, Model

from tensorflow.keras.optimizers import Adam

from tensorflow.keras.datasets import mnist

# 定义生成器模型

def build_generator():

    model = Sequential()

    model.add(Dense(256, input_dim=100))

    model.add(LeakyReLU(alpha=0.2))

    model.add(BatchNormalization(momentum=0.8))

    model.add(Dense(512))

    model.add(LeakyReLU(alpha=0.2))

    model.add(BatchNormalization(momentum=0.8))

    model.add(Dense(1024))

    model.add(LeakyReLU(alpha=0.2))

    model.add(BatchNormalization(momentum=0.8))

    model.add(Dense(28 * 28 * 1, activation='tanh'))

    model.add(Reshape((28, 28, 1)))

    return model

# 定义判别器模型

def build_discriminator():

    model = Sequential()

    model.add(Flatten(input_shape=(28, 28, 1)))

    model.add(Dense(512))

    model.add(LeakyReLU(alpha=0.2))

    model.add(Dense(256))

    model.add(LeakyReLU(alpha=0.2))

    model.add(Dense(1, activation='sigmoid'))

    return model

# 构建并编译GAN模型

optimizer = Adam(0.0002, 0.5)

discriminator = build_discriminator()

discriminator.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

generator = build_generator()

z = Input(shape=(100,))

img = generator(z)

discriminator.trainable = False

valid = discriminator(img)

combined = Model(z, valid)

combined.compile(loss='binary_crossentropy', optimizer=optimizer)

# 训练GAN模型

(X_train, _), (_, _) = mnist.load_data()

X_train = X_train / 127.5 - 1.0

X_train = np.expand_dims(X_train, axis=3)

valid = np.ones((batch_size, 1))

fake = np.zeros((batch_size, 1))

for epoch in range(epochs):

    idx = np.random.randint(0, X_train.shape[0], batch_size)

    imgs = X_train[idx]

    noise = np.random.normal(0, 1, (batch_size, 100))

    gen_imgs = generator.predict(noise)

    d_loss_real = discriminator.train_on_batch(imgs, valid)

    d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)

    d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

    noise = np.random.normal(0, 1, (batch_size, 100))

    g_loss = combined.train_on_batch(noise, valid)

    if epoch % 100 == 0:

        print(f"{epoch} [D loss: {d_loss[0]}] [D accuracy: {d_loss[1]}] [G loss: {g_loss}]")

Transformer

Transformer模型基于自注意力机制,其主要组件包括多头自注意力机制和前馈神经网络,广泛应用于自然语言处理任务。由于Transformer目前在AI领域的重要地位,后面将单独成文进行全面介绍。

相关文章:

[机器学习]-3 万字话清从传统神经网络到深度学习

神经网络(Neural Networks, NNs)是机器学习的一种重要方法,灵感来源于生物神经系统,由大量互联的节点(称为神经元或单元)组成,通过调整这些节点间的连接权重来学习和表示复杂的非线性关系。传统…...

网络安全等级保护2.0(等保2.0)全面解析

一、等保2.0的定义和背景 网络安全等级保护2.0(简称“等保2.0”)是我国网络安全领域的基本制度、基本策略、基本方法。它是在《中华人民共和国网络安全法》指导下,对我国网络安全等级保护制度进行的重大升级。等保2.0的发布与实施&#xff0c…...

用Lobe Chat部署本地化, 搭建AI聊天机器人

Lobe Chat可以关联多个模型,可以调用外部OpenAI, gemini,通义千问等, 也可以关联内部本地大模型Ollama, 可以当作聊天对话框消息框来集成使用 安装方法参考: https://github.com/lobehub/lobe-chat https://lobehub.com/zh/docs/self-hosting/platform/…...

基于ARM的通用的Qt移植思路

文章目录 实验环境介绍一、确认Qt版本二、确认交叉编译工具链三、配置Qt3.1、修改qmake.conf3.2、创建autoConfig.sh配置文件 四、编译安装Qt五、移植Qt安装目录六、配置Qt creator6.1、配置qmake6.2、配置GCC编译器6.3、配置G编译器6.4、配置编译器套件6.5、创建应用 七、总结…...

IT专业入门,高考假期预习指南

七月来临,各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束,而是新旅程的开始。对于有志于踏入IT领域的高考少年们,这个假期是开启探索IT世界的绝佳时机。 一、基础课程预习指南 IT专业是一个广泛的领域,涵盖了从软件开…...

芯片详解——AD7606C

芯片详解——AD7606C AD7607C 是一款由 Analog Devices(模拟器件公司)生产的 6 通道同步采样模数转换器(ADC),适用于高速数据采集系统。 工作原理 AD7607C 的工作原理主要包括以下几个步骤: 模拟信号输入:AD7607C 有六个模拟输入通道,可以同时进行采样。这些模拟信号…...

IDEA 编译单个Java文件

文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件,点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…...

人工智能业务分析

人工智能业务分析的组成图 #mermaid-svg-SKV0WrbMSANzQz4U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SKV0WrbMSANzQz4U .error-icon{fill:#552222;}#mermaid-svg-SKV0WrbMSANzQz4U .error-text{fill:#552222;s…...

随机文本生成器

目录 开头程序程序的流程图程序打印的效果(不必细看&#xff0c;因为字符太多)例1例2例3 结尾 开头 大家好&#xff0c;我叫这是我58。看&#xff01;这下面有一个程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <random> #includ…...

java中输入输出流的继承关系

在 Java 中,输入输出流的继承关系主要围绕两个抽象基类展开:字节流基类 InputStream 和 OutputStream,以及字符流基类 Reader 和 Writer。这些类形成了 Java I/O 系统的基础,提供了丰富的子类以适应不同的输入输出需求。 字节流 字节流用于处理原始的二进制数据。 Input…...

c++应用网络编程之一基本介绍

一、网络编程介绍 c编程的应用场景在前面分析过&#xff0c;一个重要的方向就是网络编程。一般来说&#xff0c;开发者说的服务端编程在c方向上简单的可以认为是网络编程。首先需要说明的&#xff0c;本系列不对网络编程的相关基础知识展开详细的说明&#xff0c;因为这种知识…...

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件&#xff0c;让…...

Java 位运算详解

位运算是一种直接在二进制位上进行操作的方式。位运算符包括按位与 (&)、按位或 (|)、按位异或 (^)、按位非 (~)、左移 (<<)、右移 (>>) 和无符号右移 (>>>)。这些操作符用于操作整型数据类型&#xff0c;如 int 和 long。 一、按位与 (&) 按位…...

智能体实战:开发一个集成国内AI平台的GPTs,自媒体高效智能助手

文章目录 一&#xff0c;什么是GPTs二&#xff0c;开发GPTs1&#xff0c;目标2&#xff0c;开发2.1 打开 GPTS&#xff1a;https://chat.openai.com/gpts2.2 点击 Create 创建一个自己的智能体 2.3 配置GPTs2.4 配置外挂工具2.4.1 配置Authentication-授权2.4.1.1 生成语聚AI的…...

完美世界|单机版合集(共22个版本)

前言 我是研究单机的老罗&#xff0c;今天给大家带来的是完美世界的单机版合集&#xff0c;一共22个版本。本人亲自测试了一个版本&#xff0c;运行视频如下&#xff1a; 完美世界|单机版合集 先看所有的版本的文件&#xff0c;文件比较大&#xff0c;准备好空间&#xff0c;差…...

Jenkins的一些记录

设置环境变量 在 Jenkins 流水线中&#xff0c;取决于使用的是声明式还是脚本式流水线&#xff0c;设置环境变量的方法不同。 声明式流水线支持 environment 指令&#xff0c;而脚本式流水线的使用者必须使用 withEnv 步骤。 pipeline {agent anyenvironment { CC clang}stag…...

讲讲js中的prototype和__proto__

在Javascript中&#xff0c;prototype和__proto__是两个重要的概念&#xff0c;在对象的原型链中扮演重要的角色。 prototype prototype是js函数的内置属性&#xff0c;每个函数都有一个prototype属性&#xff0c;它是一个指针&#xff0c;指向一个对象&#xff08;原型对象&a…...

JavaScript的学习之DOM的查询(一)

一、获得元素 通过document对象调用&#xff1a; getElementById()&#xff1a;通过id属性获取一个元素节点对象getElementsByTagName()&#xff1a;通过标签名获取一组元素节点对象getElementsByName()&#xff1a;通过name属性来获取一组元素节点对象 核心学习代码 <scrip…...

充电宝哪个品牌比较好一点?多维度实测西圣、绿联、倍思充电宝!

在这个快节奏的时代&#xff0c;智能手机已成为我们日常生活不可或缺的一部分&#xff0c;而充电宝作为其能量补给站&#xff0c;重要性不言而喻。面对市场上琳琅满目的充电宝品牌与型号&#xff0c;如何挑选一款既实用又高效的充电伴侣&#xff0c;成为了许多消费者的难题。今…...

ubuntu安装QT

以QT5.15.14为例 下载地址&#xff1a;Index of /archive/qt 安装步骤&#xff1a; 解压qt-everywhere-src-5.15.14运行&#xff1a; cd qt-everywhere-src-5.15.14 mkdir build cd build ../configure -prefix /opt/qt5.15.14 -opensource -confirm-license make -j16 sudo…...

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…...

《C++ Primer》导学系列:第 13 章 - 拷贝控制

13.1 拷贝、赋值与析构函数 拷贝控制是C++中类设计的重要组成部分,用于管理对象的复制、赋值和销毁过程。理解并正确实现拷贝控制函数(拷贝构造函数、拷贝赋值运算符和析构函数)对于编写健壮和高效的C++程序至关重要。 13.1.1 拷贝构造函数 拷贝构造函数用于创建对象的副…...

c++ 图论2 深度优先算法和广度优先算法

修改一下深度优先算法和广度优先算法&#xff0c;标出每一个节点相对于遍历起始位置的层级&#xff0c;遍历起始起点为第一层&#xff0c;和第一层相连的节点为第二层&#xff0c;以此类推 定义一个新的结构 struct NodeWithLevel {TreeNode* node;int level;NodeWithLevel(T…...

【Qt】初识QtQt Creator

一.简述Qt 1.什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…...

Android 11.0 修改系统显示大小导航栏消失

Android 11.0 修改系统显示大小导航栏消失 1.显示大小设置为大时&#xff0c;导航栏图标不显示。 设置为大&#xff0c;较大&#xff0c;最大时&#xff0c;导航栏图标不显示。 2.开始怀疑是导航栏被隐藏了&#xff0c;各种折腾无效。 3.发现&#xff1a; frameworks/base/pa…...

RocketMQ源码学习笔记:Producer启动流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview1.1、创建MQClientInstance1.1.1、检查1.1.1、MQClientInstance的ID 1.2、MQClientInstance.start() 1、Overview 这是发送信息的代码样例&#xff0c; DefaultMQProducer produ…...

Node.js 和浏览器环境中都使用 WebSocket

使用WebSocket为什么不适配双端 浏览器环境本身就支持 WebSocket&#xff0c;直接使用 JavaScript 内置的 WebSocket 对象来建立连接。 Node中本身并没有内置 WebSocket 协议的支持&#xff0c;所以需要使用第三方库 ws来实现 WebSocket 功能。 一. 使用跨平台 WebSocket 库 …...

css美化滚动条样式

效果展示 实现 滚动条宽&#xff0c;高度 /* 整体滚动条 */ ::-webkit-scrollbar {width: 10px; }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background-color: #ffffff;border-radius: 6px; }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background-color: #888;borde…...

由浅入深,走进深度学习(补充篇:转置卷积和FCN)

本期内容是针对神经网络层结构的一个补充&#xff0c;主要内容是&#xff1a;转置卷积和全连接卷积网络 相关内容&#xff1a; 由浅入深&#xff0c;走进深度学习&#xff08;2&#xff09;_卷积层-CSDN博客 由浅入深&#xff0c;走进深度学习&#xff08;补充篇&#xff1a…...

Linux基础篇——目录结构

基本介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录"/"&#xff0c;然后在根目录下再创建其他的目录 在Linux中&#xff0c;有一句经典的话&#xff1a;在Linux世界里&#xff0c;一切皆文件 Linux中根目录下的目录 具体的…...

星际编码:Swifter.Json,.NET宇宙中的数据处理新星

概述 在数字化的星辰大海中&#xff0c;数据是宇宙的通用语言。在.NET这一广袤的星系中&#xff0c;JSON作为信息交换的媒介&#xff0c;扮演着至关重要的角色。今天&#xff0c;我们要探索的是一颗新星——Swifter.Json&#xff0c;一个功能全面且性能卓越的JSON序列化和反序列…...

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例&#xff1a; 首先&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以使用 pip 进行安装&#xff…...

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示问题修复 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息&#xff0c;k8s: 1.27.x&#xff0c;nacos: 2.0.3。运行环境为 centos 7…...

数据结构—判断题

1.数据的逻辑结构说明数据元素之间的顺序关系&#xff0c;它依赖于计算机的存储结构。 答案&#xff1a;错误 2.(neuDS)在顺序表中逻辑上相邻的元素&#xff0c;其对应的物理位置也是相邻的。 答案&#xff1a;正确 3.若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不…...

树莓派挂载的移动硬盘badblocks坏道屏蔽,以这个为准

!!!use 这里要设置块大小和磁盘相同 badblocks -b 4096 -s -c 512 -v -o /a/2/bads4.txt /dev/sda5 检测完重新检测跳过之前的记录 badblocks -i /a/2/bads4.txt -b 4096 -s -c 512 -v -o /a/2/bads5.txt /dev/sda5 可以查看磁盘具体block总数和大小 sudo dumpe2fs /dev/sda5 …...

Unity开箱即用的UGUI面板的拖拽移动功能

文章目录 &#x1f449;一、背景&#x1f449;二、效果图&#x1f449;三、原理&#x1f449;四、核心代码&#x1f449;五&#xff0c;总结 &#x1f449;一、背景 之前做PC项目时常常有面板拖拽移动的需求&#xff0c;今天总结封装一下&#xff0c;做成一个随时随地可复用的…...

春秋云境:CVE-2022-25411[漏洞复现]

根据题目提示和CNNVD优先寻找后台管理地址 靶机启动后&#xff0c;使用AWVS进行扫描查看网站结构 在这里可以看到后台管理的登录地址&#xff1a;/admin/&#xff0c;根据题目提示可知是弱口令 尝试admin、123456、admin666、admin123、admin888...等等常见弱口令 正确的账户…...

java基础知识点全集

JAVA的所有知识点 一、基础的数组、数据类型、输入输出二、类与对象1. 三大特征&#xff08;1&#xff09; 封装&#xff08;2&#xff09;继承&#xff08;3&#xff09;多态 2. 类的实例化&#xff08;1&#xff09; 类通过NEW来创建&#xff08;2&#xff09; 类的继承&…...

如何完成域名解析验证

一&#xff1a;什么是DNS解析&#xff1a; DNS解析是互联网上将人类可读的域名&#xff08;如www.example.com&#xff09;转换为计算机可识别的IP地址&#xff08;如192.0.2.1&#xff09;的过程&#xff0c;大致遵循以下步骤&#xff1a; 查询本地缓存&#xff1a;当用户尝…...

2024年6月个人工作生活总结

title: 2024年6月个人工作生活总结 urlname: code-for-2024-06 tags: 代码积累知识总结 categories:我的程序代码 date: 2024-06-30 00:00:00 photos:gallery/tech/c2.jpg 本文为 2024年6月工作生活总结。 研发编码 编码和注释 因某些需要&#xff0c;重拾了2019年的工程代码…...

Json与Java类

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON数据由键值对构成&#xff0c;并以易于阅读的文本形式展现&#xff0c;支持数组、对象、字符串、数字、布尔值…...

动手学深度学习(Pytorch版)代码实践 -计算机视觉-39实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

39实战Kaggle比赛&#xff1a;狗的品种识别&#xff08;ImageNet Dogs&#xff09; 比赛链接&#xff1a;Dog Breed Identification | Kaggle 1.导入包 import torch from torch import nn import collections import math import os import shutil import torchvision from…...

在Linux系统中挂载硬盘

目录 1. 查看硬盘信息 2. 分区硬盘&#xff08;如果硬盘没有分区&#xff09; 3. 格式化分区 4. 创建挂载点 5. 挂载分区 6. 验证挂载 7.设置开机自动挂载&#xff08;可选&#xff09; 1. 查看硬盘信息 lsblk 这个命令会列出所有的块设备&#xff0c;包括硬盘 2.…...

安卓短视频去水印v1.7 简洁好用

各大平台视频无水印提取&#xff0c;登录即永久会员&#xff01; 无水印提取&#xff0c;图片无水印提取 视频旋转&#xff0c;倒放&#xff0c;转gif等功能。 链接&#xff1a;https://pan.baidu.com/s/1UgO4V16ZM34tG5uDog74Pg?pwdcn0u 提取码&#xff1a;cn0u...

【征服数据结构】:期末通关秘籍

【征服数据结构】&#xff1a;期末通关秘籍 &#x1f498; 数据结构的基本概念&#x1f608; 数据结构的基本概念&#x1f608; 逻辑结构和存储结构的区别和联系&#x1f608; 算法及其特性&#x1f608; 简答题 &#x1f498; 线性表&#xff08;链表、单链表&#xff09;&…...

GIT 基于master分支创建hotfix分支的操作

基于master分支创建hotfix分支的操作通常遵循以下步骤&#xff1a; 切换到master分支&#xff1a; 首先&#xff0c;确保你的工作区是最新的&#xff0c;并且你在master分支上。如果不在master分支&#xff0c;你需要先切换过去。 Bash git checkout master 拉取最新的master…...

Vue-CLI脚手架与node.js安装

前言&#xff1a; Vue-CLI 是一个基于 Vue.js 快速开发单页应用的官方脚手架工具&#xff0c;能够帮助开发者快速搭建前端项目的基础结构。在开始使用 Vue-CLI 前&#xff0c;首先需要安装 Node.js&#xff0c;因为 Vue-CLI 是基于 Node.js 构建的。 Node.js 是一个基于 Chrom…...

自适应站长跑路单页网站源码

跑路单页HTML源码自行修改文字就行了,上传到服务器里面运行即可&#xff0c;本地运行的话音乐会加载不出来&#xff0c;涉及到跨域问题 自适应站长跑路单页网站源码...

Java基础(判断和循环)

一、流程控制语句-顺序结构 顺序结构语句是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 二、流程控制语句-分支结构&#xff08;分支结构包括if、switch) if语句&#xff1a;在程序中用来进行判断 1、If语句的第一种格式&#xf…...

51单片机第12步_使用stdio.h库函数仿真串口通讯

本章介绍如何使用stdio.h库函数仿真串口通讯&#xff0c;学会使用view下面的“serial window #1”,实现模拟串口通讯。 Keil C51中有一些关键字&#xff0c;需要牢记&#xff1a; interrupt0:指定当前函数为外部中断0&#xff1b; interrupt1:指定当前函数为定时器0中断&…...

在C++中,工厂模式的思考(《C++20设计模式》及常规设计模式对比)

文章目录 一、前言二、讲解1、构造函数的弊端2、工厂方法&#xff08;解决上述弊端&#xff09;3、简单工厂3.1 **UML类图**3.2 **实现** 4、工厂模式4.1 **UML类图**4.2 **实现** 5、抽象工厂5.1 **UML类图**5.2 **实现** 三、总结 一、前言 在看《C20设计模式》一书中产生了…...

解决 macOS 中“无法验证开发者”的问题

解决 macOS 中“无法验证开发者”的问题 在使用 macOS 系统时&#xff0c;你可能会遇到一个常见的问题&#xff1a;当你尝试安装或打开某些应用程序时&#xff0c;系统会弹出一个警告&#xff0c;提示“无法验证开发者”。这通常发生在从非官方 App Store 下载的应用程序上。本…...

【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】

专栏&#xff1a;机器学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 1. 引言 线性回归&#xff08;Linear Regression&#xff09;是一种常见的统计方法和机器学习算法&a…...

留校最后一天

明天开始回家啦&#xff0c;继续好好学习技术&#xff0c;早日成为开发高手...

爬虫-网页基础

HTML 基本语法 HTML&#xff1a;Hyper Text Markup Language, 超文本标记语言&#xff0c;是计算机语言的一种&#xff0c;由元素构成。 p元素 <p>Web 真好玩&#xff01;</p> 由三大部分组成 开始标签&#xff1a;一对尖括号中间包裹这元素名称元素内容&#x…...

手机数据恢复篇:如何在恢复出厂设置后的 iPhone 恢复短信

您可能会认为&#xff0c;在恢复出厂设置iPhone后恢复短信时&#xff0c;一切都会丢失&#xff0c;但是仍然有一些方法可以检索您的重要对话。截至 2024 年&#xff0c;数据恢复技术的进步使得从备份甚至直接从设备内存中抢救消息变得更加容易。无论是通过 iCloud、iTunes 还是…...

问界新M7Ultra上市,配置大升级,理想L7有压力吗?

2024年5月31日夜晚,问界新M7 Max焕新版正式上市,新车主要针对外观、配置作出调整,新车型命名问界新M7 Ultra,官方分别推出了2款配置车型,这两款配置又分别推出五座版和六座版,官方指导价在28.98-32.98万元。根据外观可以看到,问界新M7 Ultra的前脸设计更加简约,车辆换装…...

【CSharp】判断目录以及文件是否存在

【CSharp】判断目录以及文件是否存在 1.背景2.判断目录3.判断文件1.背景 我们在进行磁盘IO的时候进行需要判断目录、文件是否存在,根据判断结果再做进一步的操作。 其中判断目录是否存在,涉及Directory.Exists(String) 方法; 命名空间:System.IO 方法功能:确定给定路径是…...

前端RN是什么:深入解析React Native的前端革命

前端RN是什么&#xff1a;深入解析React Native的前端革命 在前端技术的飞速发展中&#xff0c;一个新的名词逐渐崭露头角——前端RN。对于许多初学者和开发者来说&#xff0c;这个术语可能充满了神秘与困惑。那么&#xff0c;前端RN究竟是什么呢&#xff1f;本文将从四个方面…...

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程 RLHF训练的三个步骤步骤1&#xff1a;收集数据与有监督训练策略步骤2&#xff1a;收集数据训练奖励模型步骤3&#xff1a;结合奖励模型利用强化学习算法如PPO算法来优化策略 参考内容 RLHF训练的三个…...

nginx设置一个TCP代理(用于RDP连接)

在 Nginx 中&#xff0c;stream 上下文必须在 http 上下文之外&#xff0c;并且只能位于顶级配置文件中或包含在主配置文件中的单独文件中。 Nginx 的配置文件通常包含一个 http 块&#xff0c;用于处理 HTTP 和 HTTPS 请求&#xff0c;但是 stream 块是独立的&#xff0c;并且…...

重生之我要精通JAVA--第六周笔记

File 路径 相对路径 路径1&#xff1a;“a.txt” 路径2&#xff1a;“abc\\a.txt” 绝对路径 路径1&#xff1a;“c:\\a.txt” 路径2&#xff1a;“c:\\abc\\a.txt” File对象就表示一个路径&#xff0c;可以是文件的路径、也可以是文件夹的路径这个路径可以是存在的&…...