递归神经网络Recurrent Neural Networks
循环神经网络Recurrent Neural Networks
- 介绍
- 时序预测问题
- 前馈网络与递归网络对比
- 递归网络特点
- 递归网络数据的输入输出
- 递归网络问题
- LSTM/GRU
- RNN问题
- Long Short Term Memory (LSTM)
- 门(gate)的理解
- 理解LSTM的数学公式:
- 信息流
- 普通RNN与LSTM的比较
- Gated RNNs的变种
- 实现LSTM
- 处理训练数据
- 权重初始化方法
- 定义LSTM类
- 构建网络
- 训练网络
- 预测效果
- 总结
- 双向LSTM&GRU
介绍
时序预测问题
用前馈神经网络来做时序信号预测有什么问题?前馈网络是利用窗处理将不同时刻的向量并接成一个更大的向量,以此利用前后发生的事情预测当前所发生的情况。这样的方式受限于将多少个向量(window size)并接在一起。所能考虑的依赖始终是固定长度的。
前馈网络与递归网络对比
在前馈网络预测时序信号时,如下图左侧是时间维度展开前,右侧是展开后(单位时刻实际工作的只有灰色部分。)。前馈网络的特点使不同时刻的预测完全是独立的。我们只能通过窗处理的方式让其照顾到前后相关性。
其数学公式:
concat表示将向量并接成一个更大维度的向量,需要从大量的数据中学习Wxh和b,要学习各个时刻(3个)下所有维度m的关系(m*3个),就需要很多数据。
对于递归网络,不再有window size的概念,而是time step。左侧是时间维度展开前,回路方式的表达方式,其中黑方框表示时间延迟。右侧展开后,可以看到当前时刻的ht并不仅仅取决于当前时刻的输入xt,同时与上一时刻的ht-1也相关。其数学公式:
ht也由xt和Wzh的相乘得到,但也多了一份信息,即Whh*h(t-1),而该信息是从上一时刻的隐藏状态h(t-1)经过一个不同的Whh变换后得出的。Wxh的行:dim_input,Wxh的列:dim_hidden_state,而Whh是一个行列都为dim_hidden_state的方阵。前馈网络需要3个时刻来帮助学习一次Wxh,而递归网络可以用3个时刻来帮助学习3次Wxh和Whh。换句话说:所有时刻的权重矩阵都是共享的。这是递归网络相对于前馈网络而言最为突出的优势。
递归神经网络是在时间结构上存在共享特性的神经网络变体。时间结构共享是递归网络的核心中的核心。
递归网络特点
时序长短可变:只要知道上一时刻的隐藏状态ht-1与当前时刻的输入xt,就可以计算当前时刻的隐藏状态ht。并且由于计算所用到的Wxh与Whh在任意时刻都是共享的。递归网络可以处理任意长度的时间序列。
顾及时间依赖:若当前时刻是第5帧的时序信号,那计算当前的隐藏状态h5就需要当前的输入x5和第4帧的隐藏状态h4,而计算h4又需要h3,这样不断逆推到初始时刻为止。意味着常规递归网络对过去所有状态都存在着依赖关系。(在计算h0的值时,若没有特别指定初始隐藏状态,则会将ht-1全部补零)
未来信息依赖:前馈网络是通过并接未来时刻的向量来引入未来信息对当前内容判断的限制,但常规的递归网络只对所有过去状态存在依赖关系。所以递归网络的一个扩展就是双向(bidirectional)递归网络:两个不同方向的递归层叠加。
关系图:正向(forward)递归层是从最初时刻开始,而反向(backward)递归层是从最末时刻开始。
递归网络数据的输入输出
递归网络由于引入time step的缘故,使得其训练数据与前馈网络有所不同。
前馈网络:
输入矩阵形状:(n_samples, dim_input)
输出矩阵形状:(n_samples, dim_output)
注:真正测试/训练的时候,网络的输入和输出就是向量而已。加入n_samples这个维度是为了可以实现一次训练多个样本,求出平均梯度来更新权重,这个叫做Mini-batch gradient descent。如果n_samples等于1,那么这种更新方式叫做Stochastic Gradient Descent (SGD)。
递归网络:
输入和输出:维度至少是3的张量,如果是图片等信息,则张量维度仍会增加。
输入张量形状:(time_steps, n_samples, dim_input)
输出张量形状:(time_steps, n_samples, dim_output)
注:同样是保留了Mini-batch gradient descent的训练方式,但不同之处在于多了time step这个维度。Recurrent 的任意时刻的输入的本质还是单个向量,只不过是将不同时刻的向量按顺序输入网络。你可能更愿意理解为一串向量 a sequence of vectors,或者是矩阵。
递归网络问题
常规递归网络从理论上应该可以顾及所有过去时刻的依赖,然而实际却无法按人们所想象工作。原因在于梯度消失(vanishinggradient)和梯度爆炸(exploding gradient)问题。Long Short Term Memory(LSTM)和Gated Recurrent Unit(GRU)解决了以上 问题。
LSTM/GRU
RNN问题
最常用的RNN实现方式:Long-Short Term Memory(LSTM),为什么会有LSTM出现呢?
循环神经网络处理数据流程。
由上可以知道循环神经网络用相同的方式处理每个时刻的数据。我们希望循环神经网络可以将过去时刻发生的状态信息传递给当前时刻的计算中,但普通的RNN结构却难以传递相隔较远的信息。另一方面,将蓝色箭头的传递过程简化公式为:ht = Whh*h(t-1),若不考虑非线性的部分,隐藏信息的状态信息h0,向t时刻传递得到ht = (Whh)^t * h0,会发现Whh被乘了多次,这样,不断相乘导致的结果,导致要么整体数值趋于无穷(Whh的数值非常大),要么整体数值趋于0(Whh的数值趋于0),这时想要传递的h0中的信息会被掩盖掉,无法传递到ht。
上面情况类似公式:y= α^t *x,如果α等于0.1,x在被不断乘以0.1一百次后会变成非常小,如果α等于10,x在被不断乘以10一百次后会变得非常大,若想要所包含的信息既不消失,又不爆炸,就需要尽可能的将α的值保持在1。
Long Short Term Memory (LSTM)
上面的现象可能并不意味着无法学习,但是即便可以,也会非常非常的慢。为了有效的利用梯度下降法学习,我们希望使不断相乘的梯度的积(the product of derivatives)保持在接近1的数值。
一种实现方式是建立线性自连接单元(linear self-connections)和在自连接部分数值接近1的权重,叫做leaky units。但Leaky units的线性自连接权重是手动设置或设为参数,而目前最有效的方式gated RNNs是通过gates的调控,允许线性自连接的权重在每一步都可以自我变化调节。LSTM就是gated RNNs中的一个实现。
LSTM(或者其他gated RNNs)是在标准RNN的基础上装备了若干个控制数级(magnitude)的gates。可以理解成神经网络(RNN整体)中加入其他神经网络(gates),而这些gates只是控制数级,控制信息的流动量。
门(gate)的理解
理解门(gate)的定义和作用是理解Gated RNNs的首要步骤,gate本身可看成是十分有物理意义的一个神经网络,gate的输入是控制依据,gate的输出是值域为(0,1)的数值,表示该如何调节其他数据的数级的控制方式。gate所产生的输出会用于控制其他数据的数级,相当于过滤器的作用。
例如:当用gate来控制向量[20 5 7 8]时,若gate的输出为[0.1 0.2 0.9 0.5],原来的向量就会被对应元素相乘(element-wise)后变成:[20 5 7 8]⊙[0.1 0.2 0.9 0.5] = [2 1 6.3 4 ];若gate的输出为[0.5 0.5 0.5 0.5],时,原来的向量就会被对应元素相乘(element-wise)后变成:[20 5 7 8]⊙[0.5 0.5 0.5 0.5] = [10 2.5 3.5 4 ]。
gate的输入,究竟是以什么信息为控制依据呢,例如:g = sigmoid(Wxg · xt + Whg · h(t-1) +b ),这个gate的输入有当前的输入xt和上一时刻的状态h(t-1),表示gate是将这两个信息流作为控制依据而产生输出的。例如:g = sigmoid(Wxg · xt + Whg · h(t-1) + Wcg · c(t-1)+b ),这个gate的输入有当前的输入xt和上一时刻的状态h(t-1),还有上一时刻cell的状态c(t-1),表示gate是将这三个信息流作为控制依据而产生输出的。这种方式的LSTM叫做peephole connections。
理解LSTM的数学公式:
LSTM的数学公式如下:
前半部分的三个式子it、ft、ot,在LSTM中,是网络首先构建了3个gates来控制信息的流通量。虽然gates的式子构成方式一样,但是注意3个gates式子W和b的下角标并不相同。它们有各自的物理意义,在网络学习过程中会产生不同的权重。有了这3个gates后,接下来要考虑的就是如何用它们装备在普通的RNN上来控制信息流,而根据它们所用于控制信息流通的地点不同,它们又被分为不同的门。
输入门it:控制有多少信息可以流入memory cell(第四个式子ct)。
遗忘门ft:控制有多少上一时刻的memory cell中的信息可以累积到当前时刻的memory cell中。
输出门ot:控制有多少当前时刻的memory cell中的信息可以流入当前隐藏状态中ht。
注:gates并不提供额外信息,gates只是起到限制信息的量的作用。因为gates起到的是过滤器作用,所以所用的激活函数是sigmoid而不是tanh。
信息流
信息流的来源主要有三处:当前输入xt、上一时刻隐藏状态ht-1、上一时刻cell状态c(t-1)(c(t-1)是额外创造的,可线性自连接的单元leaky units)。
再来看LSTM是如何累积历史信息和计算隐藏状态h的。
ct = ft⊙c(t-1) + it⊙tanh(Wxc·xt +Whc·h(t-1)+bc)
new = tanh(Wxc·xt +Whc·h(t-1) + bc)
得到ct = ft⊙c(t-1) + it ⊙new
所以历史信息的累积是并不是靠隐藏状态h自身,而是依靠memory cell这个自连接来累积。 在累积时,靠遗忘门来限制上一时刻的memory cell的信息,并靠输入门来限制新信息。并且真的达到了leaky units的思想,memory cell的自连接是线性的累积。
计算隐藏状态:
ht = ot ⊙tanh(ct),当前隐藏状态ht是从ct计算得来的,因为ct是以线性的方式自我更新的,所以先将其加入带有非线性功能的tanh(ct)。 随后再靠输出门ot的过滤来得到当前隐藏状态ht。
普通RNN与LSTM的比较
LSTM最大的区别是比RNN多了三个神经网络(gates)来控制数据的流通。普通RNN:ht = tanh(Wxh · xt + Whh·h(t-1)+b),如下:
LSTM:ht = ot⊙tanh( ft⊙c(t-1) + it⊙tanh(Wxc·xt +Whc·h(t-1)+bc)),如下(加号圆圈表示线性相加,乘号圆圈表示用gate来过滤信息):
对比可得:二者的信息来源都是来源于tanh(Wxh · xt + Whh·h(t-1)+b),不同的是LSTM靠3个gates将信息的积累建立在线性自连接的memory cell之上,并靠其作为中间物来计算当前ht。
Gated RNNs的变种
标准的RNN的信息流有两处:input输入和hidden state隐藏状态。但往往信息流并非只有两处,即便是有两处,也可以拆分成多处,并通过明确多处信息流之间的结构关系来加入先验知识,减少训练所需数据量,从而提高网络效果。例如:Tree-LSTM在具有此种结构的自然语言处理任务中的应用。
gates的控制方式:与LSTM一样有名的是Gated Recurrent Unit (GRU),而GRU使用gate的方式就与LSTM的不同,GRU只用了两个gates,将LSTM中的输入门和遗忘门合并成了更新门。并且并不把线性自更新建立在额外的memory cell上,而是直接线性累积建立在隐藏状态上,并靠gates来调控。
实现LSTM
这一节就演示如何利用Tensorflow来搭建LSTM网络。为了更深刻的理解LSTM的结构,这次所用的并非是tensorflow自带的rnn_cell类,而是从新编写,并且用scan来实现graph里的loop (动态RNN)。
本次任务:用声音来预测口腔移动,同时拿前馈神经网络与循环神经网络进行比较。
处理训练数据
目的:减掉每句数据的平均值,除以每句数据的标准差,降低模型拟合难度。
代码:
# 所需库包
import tensorflow as tf
import numpy as np
import time
import matplotlib.pyplot as plt
%matplotlib inline
# 直接使用在代码演示LV3中定义的function
def Standardize(seq): #subtract mean centerized=seq-np.mean(seq, axis = 0) #divide standard deviation normalized=centerized/np.std(centerized, axis = 0) return normalized
# 读取输入和输出数据
mfc=np.load('X.npy')
art=np.load('Y.npy')
totalsamples=len(mfc)
# 20%的数据作为validation set
vali_size=0.2
# 将每个样本的输入和输出数据合成list,再将所有的样本合成list
# 其中输入数据的形状是[n_samples, n_steps, D_input]
# 其中输出数据的形状是[n_samples, D_output]
def data_prer(X, Y): D_input=X[0].shape[1] data=[] for x,y in zip(X,Y): data.append([Standardize(x).reshape((1,-1,D_input)).astype("float32"), Standardize(y).astype("float32")]) return data
# 处理数据
data=data_prer(mfc, art)
# 分训练集与验证集
train=data[int(totalsamples*vali_size):]
test=data[:int(totalsamples*vali_size)]
1,2,3,4,5表示list中的每个元素,而每个元素又是一个长度为2的list。
解释:比如全部数据有100个序列,如果设定每个input的形状就是[1, n_steps, D_input],那么处理后的list的长度就是100,这样的数据使用的是SGD的更新方式。而如果想要使用mini-batch GD,将batch size(也就是n_samples)的个数为2,那么处理后的list的长度就会是50,每次网络训练时就会同时计算2个样本的梯度并用均值来更新权重。 因为每句语音数据的时间长短都不相同,如果使用3维tensor,需要大量的zero padding,所以将n_samples设成1。但是这样处理的缺点是:只能使用SGD,无法使用mini-batch GD。如果想使用mini-batch GD,需要几个n_steps长度相同的样本并在一起形成3维tensor(不等长时需要zero padding,如下图)。v表示一个维度为39的向量,序列1的n_steps的长度为3,序列2的为7,如果想把这三个序列并成3维tensor,就需要选择最大的长度作为n_steps的长度,将不足该长度的序列补零(都是0的39维的向量)。最后会形成shape为[3,7,39]的一个3维tensor。
权重初始化方法
目的:合理的初始化权重,可以降低网络在学习时卡在鞍点或极小值的损害,增加学习速度和效果
代码:
def weight_init(shape): initial = tf.random_uniform(shape,minval=-np.sqrt(5)*np.sqrt(1.0/shape[0]), maxval=np.sqrt(5)*np.sqrt(1.0/shape[0])) return tf.Variable(initial,trainable=True)
# 全部初始化成0
def zero_init(shape): initial = tf.Variable(tf.zeros(shape)) return tf.Variable(initial,trainable=True)
# 正交矩阵初始化
def orthogonal_initializer(shape,scale = 1.0): #https://github.com/Lasagne/Lasagne/blob/master/lasagne/init.pyscale = 1.0 flat_shape = (shape[0], np.prod(shape[1:])) a = np.random.normal(0.0, 1.0, flat_shape) u, _, v = np.linalg.svd(a, full_matrices=False) q = u if u.shape == flat_shape else v q = q.reshape(shape)#this needs to be corrected to float32 return tf.Variable(scale * q[:shape[0], :shape[1]],trainable=True, dtype=tf.float32)
def bias_init(shape): initial = tf.constant(0.01, shape=shape) return tf.Variable(initial)
# 洗牌
def shufflelists(data): ri=np.random.permutation(len(data)) data=[data[i] for i in ri] return data
解释:其中shufflelists是用于洗牌重新排序list的。正交矩阵初始化是有利于gated_rnn的学习的方法。
定义LSTM类
属性:使用class类来定义是因为LSTM中有大量的参数,定义成属性方便管理。
代码:在init中就将所有需要学习的权重全部定义成属性
class LSTMcell(object): def __init__(self, incoming, D_input, D_cell, initializer, f_bias=1.0): # var # incoming是用来接收输入数据的,其形状为[n_samples, n_steps, D_input] self.incoming = incoming # 输入的维度 self.D_input = D_input # LSTM的hidden state的维度,同时也是memory cell的维度 self.D_cell = D_cell # parameters # 输入门的 三个参数 # igate = W_xi.* x + W_hi.* h + b_i self.W_xi = initializer([self.D_input, self.D_cell]) self.W_hi = initializer([self.D_cell, self.D_cell]) self.b_i = tf.Variable(tf.zeros([self.D_cell])) # 遗忘门的 三个参数 # fgate = W_xf.* x + W_hf.* h + b_f self.W_xf = initializer([self.D_input, self.D_cell]) self.W_hf = initializer([self.D_cell, self.D_cell]) self.b_f = tf.Variable(tf.constant(f_bias, shape=[self.D_cell])) # 输出门的 三个参数 # ogate = W_xo.* x + W_ho.* h + b_o self.W_xo = initializer([self.D_input, self.D_cell]) self.W_ho = initializer([self.D_cell, self.D_cell]) self.b_o = tf.Variable(tf.zeros([self.D_cell])) # 计算新信息的三个参数 # cell = W_xc.* x + W_hc.* h + b_c self.W_xc = initializer([self.D_input, self.D_cell]) self.W_hc = initializer([self.D_cell, self.D_cell]) self.b_c = tf.Variable(tf.zeros([self.D_cell])) # 最初时的hidden state和memory cell的值,二者的形状都是[n_samples, D_cell] # 如果没有特殊指定,这里直接设成全部为0 init_for_both = tf.matmul(self.incoming[:,0,:], tf.zeros([self.D_input, self.D_cell])) self.hid_init = init_for_both self.cell_init = init_for_both # 所以要将hidden state和memory并在一起。 self.previous_h_c_tuple = tf.stack([self.hid_init, self.cell_init]) # 需要将数据由[n_samples, n_steps, D_cell]的形状变成[n_steps, n_samples, D_cell]的形状 self.incoming = tf.transpose(self.incoming, perm=[1,0,2])
解释:将hidden state和memory并在一起,以及将输入的形状变成[n_steps, n_samples, D_cell]是为了满足tensorflow中的scan的特点,后面会提到。每步计算方法:定义一个function,用于制定每一个step的计算。代码:
def one_step(self, previous_h_c_tuple, current_x): # 再将hidden state和memory cell拆分开 prev_h, prev_c = tf.unstack(previous_h_c_tuple) # 这时,current_x是当前的输入, # prev_h是上一个时刻的hidden state # prev_c是上一个时刻的memory cell # 计算输入门 i = tf.sigmoid( tf.matmul(current_x, self.W_xi) + tf.matmul(prev_h, self.W_hi) + self.b_i) # 计算遗忘门 f = tf.sigmoid(tf.matmul(current_x, self.W_xf) + tf.matmul(prev_h, self.W_hf) + self.b_f) # 计算输出门 o = tf.sigmoid(tf.matmul(current_x, self.W_xo) + tf.matmul(prev_h, self.W_ho) + self.b_o) # 计算新的数据来源 c = tf.tanh(tf.matmul(current_x, self.W_xc) +tf.matmul(prev_h, self.W_hc) + self.b_c) # 计算当前时刻的memory cell current_c = f*prev_c + i*c # 计算当前时刻的hidden state current_h = o*tf.tanh(current_c) # 再次将当前的hidden state和memory cell并在一起返回 return tf.stack([current_h, current_c])
解释:将上一时刻的hidden state和memory拆开,用于计算后,所出现的新的当前时刻的hidden state和memory会再次并在一起作为该function的返回值,同样是为了满足scan的特点。定义该function后,LSTM就已经完成了。one_step方法会使用LSTM类中所定义的parameters与当前时刻的输入和上一时刻的hidden state与memory cell计算当前时刻的hidden state和memory cell。scan:使用scan逐次迭代计算所有timesteps,最后得出所有的hidden states进行后续的处理。
代码:
def all_steps(self): # 输出形状 : [n_steps, n_sample, D_cell] hstates = tf.scan(fn = self.one_step, elems = self.incoming, #形状为[n_steps, n_sample, D_input] initializer = self.previous_h_c_tuple, name = 'hstates')[:,0,:,:] return hstates
解释:scan接受的fn, elems, initializer有以下要求:
fn:第一个输入是上一时刻的输出(需要与fn的返回值保持一致),第二个输入是当前时刻的输入。
elems:scan方法每一步都会沿着所要处理的tensor的第一个维进行一次一次取值,所以要将数据由[n_samples, n_steps, D_cell]的形状变成[n_steps, n_samples, D_cell]的形状。
initializer:初始值,需要与fn的第一个输入和返回值保持一致。
scan的返回值在上例中是[n_steps, 2, n_samples, D_cell],其中第二个维度的2是由hidden state和memory cell组成的。
构建网络
D_input = 39D_label = 24
learning_rate = 7e-5
num_units=1024
# 样本的输入和标签
inputs = tf.placeholder(tf.float32, [None, None, D_input],
name="inputs")
labels = tf.placeholder(tf.float32, [None, D_label],
name="labels")
# 实例LSTM类
rnn_cell = LSTMcell(inputs, D_input, num_units, orthogonal_initializer)
# 调用scan计算所有hidden states
rnn0 = rnn_cell.all_steps()
# 将3维tensor [n_steps, n_samples, D_cell]转成 矩阵[n_steps*n_samples, D_cell]
# 用于计算outputs
rnn = tf.reshape(rnn0, [-1, num_units])# 输出层的学习参数
W = weight_init([num_units, D_label])
b = bias_init([D_label])
output = tf.matmul(rnn, W) + b
# 损失
loss=tf.reduce_mean((output-labels)**2)
# 训练所需
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
解释:以hard coding的方式直接构建一个网络,输入是39维,第一个隐藏层也就是RNN-LSTM,1024维,而输出层又将1024维的LSTM的输出变换到24维与label对应。
注: 这个网络并不仅仅取序列的最后一个值,而是要用所有timestep的值与实际轨迹进行比较计算loss
训练网络
# 建立session并实际初始化所有参数
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
# 训练并记录
def train_epoch(EPOCH): for k in range(EPOCH): train0=shufflelists(train) for i in range(len(train)): sess.run(train_step,feed_dict={inputs:train0[i][0],labels:train0[i][1]}) tl=0 dl=0 for i in range(len(test)): dl+=sess.run(loss,feed_dict={inputs:test[i][0],labels:test[i][1]}) for i in range(len(train)): tl+=sess.run(loss,feed_dict={inputs:train[i][0],labels:train[i][1]}) print(k,'train:',round(tl/83,3),'test:',round(dl/20,3))t0 = time.time()
train_epoch(10)
t1 = time.time()
print(" %f seconds" % round((t1 - t0),2))
# 训练10次后的输出和时间
(0, 'train:', 0.662, 'test:', 0.691)
(1, 'train:', 0.558, 'test:', 0.614)
(2, 'train:', 0.473, 'test:', 0.557)
(3, 'train:', 0.417, 'test:', 0.53)
(4, 'train:', 0.361, 'test:', 0.504)
(5, 'train:', 0.327, 'test:', 0.494)
(6, 'train:', 0.294, 'test:', 0.476)
(7, 'train:', 0.269, 'test:', 0.468)
(8, 'train:', 0.244, 'test:', 0.452)
(9, 'train:', 0.226, 'test:', 0.453)
563.110000 seconds
解释:由于上文的LSTM是非常直接的编写方式,并不高效,在实际使用中会花费较长时间。
预测效果
代码
(0, 'train:', 0.662, 'test:', 0.691)
pY=sess.run(output,feed_dict={inputs:test[10][0]})
plt.plot(pY[:,8])
plt.plot(test[10][1][:,8])
plt.title('test')
plt.legend(['predicted','real'])
解释:plot出一个样本中的维度的预测效果与真是轨迹进行对比
总结
该文是尽可能只展示LSTM最核心的部分(只训练了10次,有兴趣的朋友可以自己多训练几次),帮助理解其工作方式而已。
双向LSTM&GRU
以下主要是关于双向LSTM和GRU用scan的方式实现,与上面实现的LSTM的不同在于:·
- 简单梳理调整了代码结构,方便使用
- 将所有gate的计算并在一个大矩阵乘法下完成提高GPU的利用率
- 除了LSTM(Long-Short Term Memory)以外的cell,提供了GRU(gate recurrent unit)
cell模块 - 双向RNN(可选择任意cell组合)
- 该代码可被用于练习结构改造或实际建模任务
定义LSTMcell类
目的:
LSTMcell包含所有学习所需要的parameters以及每一时刻所要运行的step方法代码:
定义GRUcell类
定义RNN函数
目的:
用于接受cell的实例,并用scan计算所有time steps的hidden states代码:
训练
未完。。。
参考:https://www.zhihu.com/people/YJango/posts?page=3
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Vue组件通信
Vue组件通信八种方式props和$emit 父组件向子组件传递数据是通过prop传递的,子组件传递数据给父组件是通过$emit触发事件来做到的。$attrs和$listeners 第一种方式处理父子组件之间的数据传输有一个问题:如果父组件A下面有子组件B,组件B下面有组件C,这时如果组件A想传递数据…...
2024/4/6 3:48:11 - BGP
...
2024/4/17 8:22:10 - 条件变量之虚假唤醒
https://blog.csdn.net/shizheng163/article/details/83661861...
2024/4/6 3:48:09 - 3.aiohttp中websocket的使用
1.什么是websocket对于传统的web开发而言,是前台发送请求,后端接口返回对应的数据。但是在爬虫网页项目中当用户在页面上发送爬取请求之后,这个时候如果是传统的ajax请求,则前台就会阻塞,并且我们需要后台实时的通知用户现在爬虫的爬取进度。为了完成这一系列的交互功能,…...
2024/4/6 3:48:08 - 深入理解Java虚拟机 第2版 周志明著(二)
第2章 Java内存区域与内存溢出异常 2.1 运行时数据区:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为以下几个运行时数据区域。程序计数器:一块较小的内存空间,可以看成是当前程序所执行的字节码的行号指示器(线程执行的是java方法,记录的就是正在执行的虚拟机…...
2024/4/6 3:44:26 - pyqt5 运行程序缺少 VCRUNTIME140_1.dll MSVCP140_1.dll
pyqt5 运行程序缺少 VCRUNTIME140_1.dll MSVCP140_1.dll 解决: 下载集成了Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 和 2019的软件,就可解决。 下载地址: https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-down…...
2024/4/15 22:01:06 - C语言三个数从大到小排序代码
//尽管使用,此代码不会是万能的,但你可以作为模板使用#include<stdio.h>int main() {int a,b,c; //定义三个形参用于接收数据scanf("%d%d%d",&a,&b,&c); //输入你要排序的三个数if(a>b) //假设第一个…...
2024/4/22 20:11:50 - web前端笔记day4
background的一些用法 background-repeat:no-repeat;/*这个表示背景图片不重复出现*/background-position:50% -10%;/*这表示背景图片的位置,用百分号来设置图片的位置*/弹性布局 display:flex;/*表示弹性布局*/弹性布局常见的代码: justify-content:space-between;/*表示弹性…...
2024/4/23 12:28:21 - Redis迁移及数据同步(Redis-Shake)
redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。它支持解析、恢复、备份、同步四个功能。恢复restore:将RDB文件恢复到目的redis数据库。备份dump:将源redis的全量数据通过RDB文件备份起来。解析decode:对RDB文件进行读取,并以json格式解析存储。…...
2024/4/21 4:35:25 - 在ABAQUS中如何使用修正DPC帽盖模型
在ABAQUS中如何使用修正DPC帽盖模型 引言 修正Drucker-Prager盖帽模型(简称修正DPC模型)和修正剑桥(简称MCC模型)在岩土领域广泛使用,而修正DPC模型应用更加广,应用于描述存在大体积应变的材料力学行为。它在线性Drucker-Prager模型上增加了一个帽盖状的屈服面,从而引入…...
2024/4/25 5:36:06 - Head of a Gang【浙江大学复试上机题】【并查集】
题目描述One way that the police finds the head of a gang is to check peoples phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls made …...
2024/4/12 6:17:41 - 初次写vue项目并一键生成.vue模版
1.安装vscode 官网地址:https://code.visualstudio.com/2.安装一个插件,识别vue文件 插件库中搜索Vetur,下图中的第一个,点击安装,安装完成之后点击重新加载3.新建代码片段 文件-->首选项-->用户代码片段-->点击新建代码片段--取名vue.json 确定4.删除不要的代码…...
2024/4/23 23:26:27 - 软件测试面试题02
瀑布模型需求分析(特别到位) 设计 编码 实现 软件测试 完成 维护优点:开发阶段中,每个阶段比较清晰,强调早期计划及需求调查,适合稳定需求的产品开发 改良:每个阶段都可以融入小的迭代工作 快速原型模型 实现一个基本原型优点:克服瀑布模型的缺点,更好的满足用户的需求…...
2024/4/14 20:06:00 - 快速幂 - 序列的第k个数 - AcWing 1289
快速幂 - 序列的第k个数 - AcWing 1289 BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。 现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 k 项的值吗。 如果第 k 项的值太大,对其取模 200907。 输入格式…...
2024/4/6 3:48:02 - JAVA基础 ==」」创建一个有20个100以内的随机整数组成的数组,并且保存所有奇数的子数组
创建一个有20个100以内的随机整数组成的数组,并且保存所有奇数的子数组1 ,创建一个有20个100以内随机整数组成的子数组**2 , 取元素为奇数 的子数组分析 :!!!力在共同交流学习!!! 1 ,创建一个有20个100以内随机整数组成的子数组** public static void main(String[]…...
2024/4/16 23:39:52 - day14_数据库
一、复习 启动 ssh: /etc/init.d/ssh start 启动 nginx: sudo systemctl start nginx.service 启动服务 sudo systemctl start nginx查看是否安装成功: ps -aux|grep nginx centos 8: 查看sshd服务的状态; systemctl status sshd 开启sshd服务: systemctl start ss…...
2024/4/24 4:18:26 - ES6新增API
数字API is() 字符串API includes...
2024/4/23 11:10:57 - LeetCode Q1 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 =…...
2024/4/16 15:28:43 - python unittest --- 单元测试框架
unittest 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。为了实现这些,unittest 通过面向对象的方式支持了一些重要的概念。测试脚手架…...
2024/4/16 23:39:48 - 一个流传很广的错误说法:高风险才有高收益
1. 有一个流传很广的错误说法:高风险才有高收益。从风险是损失的可能性来讲,低风险才能获得高收益,因为损失的可能性越小,盈利的可能性越大。2. 风险的正确定义应该是损失的可能性,而不是学术上定义的波动性。投资最大的秘诀就是活下来,不是胜者为王,而是剩者为王。巴菲…...
2024/4/6 3:47:56
最新文章
- CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐
渐变色彩可以增加视觉层次感和动态效果,使网页界面更加生动有趣,吸引用户注意力。另外,相较于静态背景图片,CSS渐变无需额外的HTTP请求,减轻服务器负载,加快页面加载速度;同时CSS渐变能够根据容…...
2024/4/25 7:50:08 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 磁盘管理与文件管理
文章目录 一、磁盘结构二、MBR与磁盘分区分区的优势与缺点分区的方式文件系统分区工具挂载与解挂载 一、磁盘结构 1.硬盘结构 硬盘分类: 1.机械硬盘:靠磁头转动找数据 慢 便宜 2.固态硬盘:靠芯片去找数据 快 贵 硬盘的数据结构:…...
2024/4/23 6:16:19 - AI小程序的创业方向:深度思考与逻辑引领
随着人工智能技术的快速发展,AI小程序逐渐成为创业的新热点。在这个充满机遇与挑战的时代,我们有必要深入探讨AI小程序的创业方向,以把握未来的发展趋势。 一、目标市场定位 首先,我们要明确目标市场。针对不同的用户需求&#x…...
2024/4/21 1:22:38 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/25 1:03:45 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/24 1:17:44 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/24 11:04:21 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/24 9:59:40 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/24 11:04:20 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/24 11:04:20 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/24 9:58:43 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/24 11:04:19 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/24 11:04:19 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/24 11:04:18 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/24 11:04:18 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/24 11:04:17 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/25 3:28:56 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/25 3:39:58 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/24 11:04:13 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/24 11:04:13 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/24 11:04:13 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/24 9:54:49 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/24 10:43:15 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/25 1:03:22 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57