首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在Python中用一个长短期记忆网络来演示记忆

在Python中用一个长短期记忆网络来演示记忆

作者头像
用户1210890
发布于 2018-02-11 09:06:16
发布于 2018-02-11 09:06:16
2.5K0
举报

长期短期记忆(LSTM)网络是一种能够在长序列上学习的递归神经网络。

这不同于没有记忆的常规多层神经网络,它只能学习输入和输出模式之间的映射。

理解复杂的神经网络如LSTMs对人为的小问题的解决能力是非常重要的,因为这种理解将帮助你把网络扩展到大的甚至是非常大的问题。

在本教程中,您将发现LSTM的记忆和回忆的能力。

完成本教程后,您将知道:

  • 如何定义一个小的序列预测问题,只有像LSTM这样的RNN可以使用记忆来解决。
  • 如何转化问题表示,使之适合LSTM学习。
  • 如何设计一个LSTM来正确解决问题。

让我们开始吧。

演示在一个长期的短期记忆网络中的记忆 图片由crazlei提供。

环境

本教程假定您有一个可运行的Python 2或3环境,其中包含SciPy,具有TensorFlow或Theano后端的Keras 2.0(或更高版本)。

有关设置您的Python环境的帮助,请参阅以下文章:

序列问题描述

问题是一次预测一个序列的值。

给定序列中的一个值,模型必须预测序列中的下一个值。例如,给定值“0”作为输入,模型必须预测值“1”。

有两个不同的序列,模型必须学习并正确预测。

一个皱起(wrinkle)是两个序列之间存在冲突的信息,并且模型必须知道每一步预测的上下文(例如,它当前预测的序列)以正确预测每个完整序列。

这种皱起(wrinkle)对于防止模型记忆每个序列中的每个单步输入-输出值对是很重要的,序列未知模型可能倾向于这样做。

要学习的两个序列如下:

  • 3, 0, 1, 2, 3
  • 4, 0, 1, 2, 4

我们可以看到序列的第一个值与最后一个值是重复的。这是为模型提供上下文的指示器,让模型知道它正在处理哪个序列。

冲突是从每个序列中的倒数第二项到最后一项的过渡。在序列1中,给出“2”作为输入,并且必须预测“3”,而在序列2中给出“2”作为输入并且必须预测“4”。

这是一个多层感知器和其他非递归神经网络无法学习的问题。

这是“ 实验2 ” 的简化版本,用于演示Hochreiter和Schmidhuber在1997年发表的长期短期记忆  (PDF)中的LSTM长期记忆能力。

问题表示

本部分分为三部分; 他们是:

  1. 一位有效编码
  2. 输入-输出对
  3. 重塑数据

一个有效编码

我们将使用一个有效编码来表示LSTM的学习问题。

也就是说,每个输入和输出值将被表示为具有5个元素的二进制向量,因为问题的字母表是5个唯一值。

例如,[0,1,2,3,4]的5个值被表示为以下5个二进制向量:

代码语言:js
AI代码解释
复制
0: [1, 0, 0, 0, 0]
1: [0, 1, 0, 0, 0]
2: [0, 0, 1, 0, 0]
3: [0, 0, 0, 1, 0]
4: [0, 0, 0, 0, 1]

我们可以用一个简单的函数来完成这个任务,这个函数将会获取一个序列并返回序列中每个值的二元向量列表。下面的encode()函数实现了这个行为。

代码语言:js
AI代码解释
复制
# 对输入进行二元编码,返回二元向量序列
def encode(pattern, n_unique):
encoded = list()
for value in pattern:
row = [0.0 for x in range(n_unique)]
row[value] = 1.0
encoded.append(row)
return encoded

我们可以在第一个序列上测试它,并打印出二进制向量列表。完整的例子如下所示。

代码语言:js
AI代码解释
复制
# 对输入进行二元编码,返回二元向量序列
def encode(pattern, n_unique):
encoded = list()
for value in pattern:
row = [0.0 for x in range(n_unique)]
row[value] = 1.0
encoded.append(row)
return encoded
seq1 = [3, 0, 1, 2, 3]
encoded = encode(seq1, 5)
for vector in encoded:
print(vector)

运行该示例打印每个二进制向量。请注意,我们使用浮点值0.0和1.0,因为它们将用作模型的输入和输出。

代码语言:js
AI代码解释
复制
[0.0, 0.0, 0.0, 1.0, 0.0]
[1.0, 0.0, 0.0, 0.0, 0.0]
[0.0, 1.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 1.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 1.0, 0.0]

输入 - 输出对

下一步是将一系列编码值分成输入-输出对。

这是一个监督学习的问题表示,使机器学习问题可以学习如何将输入模式(X)映射到输出模式(y)。

例如,第一个序列具有以下要学习的输入-输出对:

代码语言:js
AI代码解释
复制
X,	y
3,	0
0,	1
1,	2
2,	3

我们必须从一位有效编码的二进制向量中创建这些映射对,而不是原始数字。

例如,3->0的第一个输入-输出对将是:

代码语言:js
AI代码解释
复制
X,	y
[0, 0, 0, 1, 0]	[1, 0, 0, 0, 0]

下面是一个名为to_xy_pairs()的函数,它会根据编码的二进制向量列表创建XY模式列表。

代码语言:js
AI代码解释
复制
# 创建编码的向量的输入/输出对, 返回X, y
def to_xy_pairs(encoded):
X,y = list(),list()
for i in range(1, len(encoded)):
X.append(encoded[i-1])
y.append(encoded[i])
return X, y

我们可以把它和上面的一位有效编码函数放在一起,并打印第一个序列的编码输入和输出对。

代码语言:js
AI代码解释
复制
# 对输入进行二元编码,返回二元向量序列
def encode(pattern, n_unique):
encoded = list()
for value in pattern:
row = [0.0 for x in range(n_unique)]
row[value] = 1.0
encoded.append(row)
return encoded
# 创建编码的向量的输入/输出对, 返回X, y
def to_xy_pairs(encoded):
X,y = list(),list()
for i in range(1, len(encoded)):
X.append(encoded[i-1])
y.append(encoded[i])
return X, y
seq1 = [3, 0, 1, 2, 3]
encoded = encode(seq1, 5)
X, y = to_xy_pairs(encoded)
for i in range(len(X)):
print(X[i], y[i])

运行该示例将打印序列中每个步骤的输入和输出对。

代码语言:js
AI代码解释
复制
[0.0, 0.0, 0.0, 1.0, 0.0] [1.0, 0.0, 0.0, 0.0, 0.0]
[1.0, 0.0, 0.0, 0.0, 0.0] [0.0, 1.0, 0.0, 0.0, 0.0]
[0.0, 1.0, 0.0, 0.0, 0.0] [0.0, 0.0, 1.0, 0.0, 0.0]
[0.0, 0.0, 1.0, 0.0, 0.0] [0.0, 0.0, 0.0, 1.0, 0.0]

重塑数据

最后一步是重塑数据,使其可以被LSTM网络直接使用。

Keras LSTM预期输入模式(X)为维度[ 采样,时间步长,特征 ] 的三维NumPy阵列。

在一个输入数据序列的情况下,维数将是[4,1,5],因为我们有4行数据,每行1个时间步,每行5列。

我们可以从我们的X模式列表创建一个2D NumPy数组,然后将其重塑为所需的3D格式。例如:

代码语言:js
AI代码解释
复制
df = DataFrame(X)
values = df.values
array = values.reshape(4, 1, 5)

我们还必须将输出模式列表(y)转换为2D NumPy数组。

下面是一个名为to_lstm_dataset()的函数,它将一个序列作为输入和序列字母的大小,并返回一个准备用于LSTM 的XY数据集。它在重新整形数据之前,将序列转换为单热编码和输入 - 输出对。

代码语言:js
AI代码解释
复制
# convert sequence to x/y pairs ready for use with an LSTM
def to_lstm_dataset(sequence, n_unique):
# one hot encode
encoded = encode(sequence, n_unique)
# convert to in/out patterns
X,y = to_xy_pairs(encoded)
# convert to LSTM friendly format
dfX, dfy = DataFrame(X), DataFrame(y)
lstmX = dfX.values
lstmX = lstmX.reshape(lstmX.shape[0], 1, lstmX.shape[1])
lstmY = dfy.values
return lstmX, lstmY

这个函数可以按照以下顺序调用:

代码语言:js
AI代码解释
复制
seq1 = [3, 0, 1, 2, 3]
seq2 = [4, 0, 1, 2, 4]
n_unique = len(set(seq1 + seq2))
seq1X, seq1Y = to_lstm_dataset(seq1, n_unique)
seq2X, seq2Y = to_lstm_dataset(seq2, n_unique)

我们现在已经准备好了LSTM的所有数据。

通过LSTM学习序列

在本节中,我们将定义LSTM来学习输入序列。

本部分分为四个部分:

  1. LSTM配置
  2. LSTM训练
  3. LSTM评估
  4. LSTM完整示例

LSTM配置

我们希望LSTM做出一步式预测,我们已经在数据集的格式和形状中定义了这些预测。我们也希望LSTM在每个时间步后都会更新错误,这意味着我们设置批处理为1。

Keras LSTM在默认情况下在批处理之间是无状态的。我们可以通过将LSTM层上的状态参数设置为True并手动管理训练时期来使状态成为有状态,以确保在每个序列之后重置LSTM的内部状态。

我们必须使用batch_input_shape参数来定义批处理的形状,[批处理大小,时间步长和特征]分别为1,1和5。

网络拓扑结构将配置一个20个单元的隐藏LSTM层,以及输出模式中每5个列产生5个输出的正常密集层。由于二进制输出,输出层将使用S形(逻辑)激活函数,而LSTM层将使用默认的tanh(双曲正切)激活函数。

由于二进制输出,在拟合网络时将优化对数(交叉熵)损失函数,并且所有默认参数都将使用有效的ADAM优化算法。

下面列出了为这个问题定义LSTM网络的Keras代码。

代码语言:js
AI代码解释
复制
model = Sequential()
model.add(LSTM(20, batch_input_shape=(1, 1, 5), stateful=True))
model.add(Dense(5, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')

LSTM培训

我们必须在每个时期手动适应模型。

在一个时期内,我们可以在每个序列上拟合模型,确保在每个序列之后重置状态。

考虑到问题的简单性,模型不需要长时间的训练; 在这种情况下只需要250个时期。

下面是一个例子,说明这个模型如何适用于所有时期的每个序列。

代码语言:js
AI代码解释
复制
# train LSTM
for i in range(250):
model.fit(seq1X, seq1Y, epochs=1, batch_size=1, verbose=1, shuffle=False)
model.reset_states()
model.fit(seq2X, seq2Y, epochs=1, batch_size=1, verbose=0, shuffle=False)
model.reset_states()

在拟合网络时,我希望看到有关丢失函数的一些反馈,所以从某个序列开始开启详细的输出。

LSTM评估

接下来,我们可以通过预测学习序列的每一步来评估拟合模型。

我们可以通过预测每个序列的输出来做到这一点。

predict_classes()函数可在LSTM模式上使用,它将直接预测类。它通过对输出二进制向量执行一个argmax(),并返回具有最大输出的预测列的索引。输出索引完美映射到序列中使用的整数(通过上面的精心设计)。下面列出了一个预测的例子:

代码语言:js
AI代码解释
复制
result = model.predict_classes(seq1X, batch_size=1, verbose=0)

我们可以进行预测,然后在输入模式和序列的每个步骤的预期输出模式的上下文中打印结果。

LSTM完整示例

现在我们可以把整个教程结合在一起。

下面提供了完整的代码清单。

首先,准备数据,然后模型拟合,并打印两个序列的预测。

代码语言:js
AI代码解释
复制
from pandas import DataFrame
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# binary encode an input pattern, return a list of binary vectors
def encode(pattern, n_unique):
encoded = list()
for value in pattern:
row = [0.0 for x in range(n_unique)]
row[value] = 1.0
encoded.append(row)
return encoded
# create input/output pairs of encoded vectors, returns X, y
def to_xy_pairs(encoded):
X,y = list(),list()
for i in range(1, len(encoded)):
X.append(encoded[i-1])
y.append(encoded[i])
return X, y
# convert sequence to x/y pairs ready for use with an LSTM
def to_lstm_dataset(sequence, n_unique):
# one hot encode
encoded = encode(sequence, n_unique)
# convert to in/out patterns
X,y = to_xy_pairs(encoded)
# convert to LSTM friendly format
dfX, dfy = DataFrame(X), DataFrame(y)
lstmX = dfX.values
lstmX = lstmX.reshape(lstmX.shape[0], 1, lstmX.shape[1])
lstmY = dfy.values
return lstmX, lstmY
# define sequences
seq1 = [3, 0, 1, 2, 3]
seq2 = [4, 0, 1, 2, 4]
# convert sequences into required data format
n_unique = len(set(seq1 + seq2))
seq1X, seq1Y = to_lstm_dataset(seq1, n_unique)
seq2X, seq2Y = to_lstm_dataset(seq2, n_unique)
# define LSTM configuration
n_neurons = 20
n_batch = 1
n_epoch = 250
n_features = n_unique
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, batch_input_shape=(n_batch, 1, n_features), stateful=True))
model.add(Dense(n_unique, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')
# train LSTM
for i in range(n_epoch):
model.fit(seq1X, seq1Y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
model.reset_states()
model.fit(seq2X, seq2Y, epochs=1, batch_size=n_batch, verbose=0, shuffle=False)
model.reset_states()
# test LSTM on sequence 1
print('Sequence 1')
result = model.predict_classes(seq1X, batch_size=n_batch, verbose=0)
model.reset_states()
for i in range(len(result)):
print('X=%.1f y=%.1f, yhat=%.1f' % (seq1[i], seq1[i+1], result[i]))
# test LSTM on sequence 2
print('Sequence 2')
result = model.predict_classes(seq2X, batch_size=n_batch, verbose=0)
model.reset_states()
for i in range(len(result)):
print('X=%.1f y=%.1f, yhat=%.1f' % (seq2[i], seq2[i+1], result[i]))

运行示例提供关于模型在每个时期的第一个序列上的损失的反馈。

在运行结束时,每个序列都在预测的上下文中打印。

代码语言:js
AI代码解释
复制
...
4/4 [==============================] - 0s - loss: 0.0930
Epoch 1/1
4/4 [==============================] - 0s - loss: 0.0927
Epoch 1/1
4/4 [==============================] - 0s - loss: 0.0925
Sequence 1
X=3.0 y=0.0, yhat=0.0
X=0.0 y=1.0, yhat=1.0
X=1.0 y=2.0, yhat=2.0
X=2.0 y=3.0, yhat=3.0
Sequence 2
X=4.0 y=0.0, yhat=0.0
X=0.0 y=1.0, yhat=1.0
X=1.0 y=2.0, yhat=2.0
X=2.0 y=4.0, yhat=4.0

结果显示了两个重要的信息:

  • LSTM一次一个步骤地正确学习了每个时期。
  • LSTM使用每个序列的上下文来正确地解决冲突的输入对。

实质上,LSTM能够在3个时间步前的序列开始时记住输入模式,以正确预测序列中的最后一个值。

这种记忆和LSTM将观测与遥远的时间联系起来的能力是使LSTM如此强大以及为什么如此广泛使用的关键能力。

虽然这个例子是微不足道的,但是LSTM能够在100秒,甚至1000秒的时间步骤中展现出相同的能力。

扩展

本节列出了本教程中示例的扩展的想法。

  • 调优。经过一些试验和错误之后,选择了LSTM(时代,单位等)的配置。在这个问题上,更简单的配置可能会达到相同的结果。一些参数搜索是必需的。
  • 任意字母表。5个整数的字母表是任意选择的。这可以更改为其他符号和更大的字母。
  • 长序列。这个例子中使用的序列非常短。LSTM能够在100秒和1000秒的更长序列上展示相同的能力。
  • 随机序列。本教程中使用的序列线性增加。可以创建新的随机值序列,允许LSTM设计一个通用的解决方案,而不是专门针对本教程中使用的两个序列。
  • 批量学习。在每个时间步骤之后更新LSTM。探索使用批量更新,看看这是否提高了学习。
  • 时期随机化。在训练期间以及在评估期间再次以相同的顺序显示序列。随机化序列的顺序,使序列1和2适合于一个时期,这可能会改善模型泛化到新的看不见的字母相同的序列。

你有没有探索这些扩展? 在下面的评论中分享你的结果。我很想看看你想出了什么。

进一步阅读

我强烈建议阅读Hochreiter和Schmidhuber最初的1997年LSTM论文; 这很棒。

概要

在本教程中,您发现了LSTM能够记住多个时间步骤的关键能力。

具体来说,你了解到:

  • 如何定义一个小的序列预测问题,只有像LSTM这样的RNN可以使用记忆来解决。
  • 如何转化问题表示,使之适合LSTM学习。
  • 如何设计一个LSTM来正确解决问题。
评论
登录后参与评论
暂无评论
推荐阅读
python写的系统常用命令(一)
      python写的系统常用命令,linux和windows通用,用的时候直接from util import *导入即可使用,很方便,本来是一个脚本,但是博文有字数限制,只能分成两部分发了,第二部分连接:http://wangwei007.blog.51cto.com/68019/960000 。
py3study
2020/01/06
3920
python常用模块二
我们的登录密码在数据库中不能存明文,当别人拿到数据库,看到账号密码是很恐怖的事情。所以我们就需要hashilib模块来加密。前几年csdn的数据库外泄,而且存的是明文,就很麻烦,所幸并不没有涉及大量¥。
不断折腾
2019/09/23
4180
Python之几种常用模块
模块 注意事项: 所有的模块导入都应该尽量往上写 内置模块 扩展模块 自定义模块 模块不会重复被导入 : sys.moudles 从哪儿导入模块 : sys.path import import 模块名 模块名.变量名 和本文件中的变量名完全不冲突 import 模块名 as 重命名的模块名 : 提高代码的兼容性 import 模块1,模块2 from import from 模块名 import 变量名 直接使用 变量名 就可以完成操作 如果本文件中有相同
新人小试
2018/04/12
1.4K0
Python之几种常用模块
写简历,从来没有这么简单
今天就是2024年高考了,再过一个月,新一季大学毕业生也要去社会“接受毒打”。现在大环境找工作也面对僧对粥少,在这个严峻的时代,学会这一招可以让你“快”人一步,打造你的个人简历。我来讲一讲怎么用Python工具来快速产生简历。
mariolu
2024/06/06
1450
python 运维常用脚本
path = "D:/UASM64/include/" dirs = os.listdir(path) temp=[];
用户5760343
2019/07/31
3.7K0
IDL常用命令总结
创建索引数组:findgen(num),dindgen(num) 创建一个特定纬度的数组并赋值:replicate(2.0,4,2),创建4列2行值为2.0的数组
Twcat_tree
2022/12/05
5670
mht文件图片解析工具(兼容Chrome/Blink)
之前写过一个mht文件的解析工具,不过当时解析的文件都是ie生成的。没有测试过chrome解析的文件。今天在github上看到一个反馈:https://github.com/obaby/mht-image-extractor/issues/1 qq浏览器保存的文件无法提取,chrome保存的文件会直接崩溃。下载附件的文件解析后发现,这两个文件的文件格式与ie的文件格式并不一致,文件头改成了如下的内容:
obaby
2023/02/23
1.1K0
mht文件图片解析工具(兼容Chrome/Blink)
Linux常用命令(合集)
其中-d表示显示变化的差异内容,-n指观察间隔,后面跟数字,-n1表示1秒观察一次。
Jensen_97
2023/07/20
2610
Python常用模块
json.dump和json.load不常用,主要是针对文件操作进行序列化和反序列化
星陨1357
2023/03/14
6440
Python常用模块
跨平台PHP调试器设计及使用方法——协议解析
        在《跨平台PHP调试器设计及使用方法——探索和设计》一文中,我介绍了将使用pydbgp作为和Xdebug的通信库,并让pydbgp以(孙)子进程的方式存在。《跨平台PHP调试器设计及使用方法——通信》解决了和pydbgp通信的问题,本文将讲解和pydbgp通信协议的问题。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
7770
python 日志记录
#!/bin/env python #--*-- coding=utf8 --*-- # # Author: ablozhou # E-mail: ablozhou@gmail.com # # Copyright 2010 ablozhou # # Distributed under the terms of the GPL (GNU Public License) # # hzdq is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # 2010.3.14 写文件,log级别常数定义 import datetime import sys import traceback import codecs import types #log编码全部按utf8处理 loglevels = {'stdout':['info','debug','warn','error','fatal'], 'file':['info','debug','warn','error','fatal'] } logfile = 'logs.txt' class log4py: def __init__(self,modulename='gloabal', loglevel=loglevels, filename='log4py.txt'): self.filename = filename #self.flag = set(loglevel['stdout']+loglevel['file']) self.loglevel = loglevel self.modulename = modulename self.fcname = None class function(): def __init__(self,fcname,parent): parent.debug('enter ',fcname) self.fcname = fcname self.parent = parent def __del__(self): self.parent.debug('exit ',self.fcname) def dbgfc(self,fcname): '''set debug function name''' f = None if 'debug' in self.flag: f = self.function(fcname,self) return f def _gettime(self): return datetime.datetime.now().isoformat() def outstd(self,*fmt): s = self.fmtstr(*fmt) print s def outfile
py3study
2020/01/03
1.1K0
pythonpcap原生python读取
本文代码都由python编写,无需安装第三方拓展库,代码更新:https://github.com/mengdj/python
py3study
2020/01/03
1.6K0
pythonpcap原生python读取
Python常用模块集锦
Python常用模块集锦 常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes 常见装饰器: 计算执行时间装饰器 缓存装饰器 错误重试装饰器 延迟装饰器 尾递归优化装饰器 ini配置文件读取 代码整合如下: #!/usr/bin/env python # -*- coding: utf-8 -*- """ Created on 9/21/17 1:46 PM
职场亮哥
2020/10/10
4840
scrapy常用命令
scrapy常用的命令分为全局和项目两种命令,全局命令就是不需要依靠scrapy项目,可以在全局环境下运行,而项目命令需要在scrapy项目里才能运行。 一、全局命令 ##使用scrapy -h可以看到常用的全局命令 [root@aliyun ~]# scrapy -hScrapy 1.5.0 - no active project Usage: scrapy <command> [options] [args] Available commands: bench Run qui
IT架构圈
2018/06/01
7350
Python自动化部署
# -*- coding: utf-8 -*- #!/bin/env python ''' #Auth: karl #Function: released version #Date:2017/6/27 #Version:V1.0 ''' import  sys,re,os,time,datetime import  paramiko import logging import socket import ConfigParser import traceback from progressbar impo
py3study
2020/01/07
8260
码农技术炒股之路——数据库管理器、正则表达式管理器
        我选用的数据库是Mysql。选用它是因为其可以满足我的需求,而且资料多。因为作为第三方工具,难免有一些配置问题。所以本文也会讲解一些和Mysql配置及开发相关的问题。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
6980
linux常用命令汇总_unix命令大全
for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done
全栈程序员站长
2022/11/09
6.2K0
linux常用命令汇总_unix命令大全
DDT框架结合单元测试
如果磁盘数据量大,一次性读取到内存,再读取到CPU,这样快点。每次启动磁盘读到内存再到CPU,CPU会等待磁盘读到数据,造成CPU资源的浪费。
清菡
2020/12/02
1.1K0
DDT框架结合单元测试
oracle 常用命令
在运行栏里面敲: sqlplus /nolog 回车 接着在弹出框里面敲:conn sys/password as sysdba回车(连接sys用户,加上 as sysdba,是以系统管理员的身份来登录的,如果是普通用户不需要as sysdba) 提示已连接 接着敲:alter user scott identified by tiger;回车(修改密码) 最后敲:alter user scott account unlock;回车(对SCOTT解锁)
Remember_Ray
2020/08/03
7760
python学习-SVN常用命令
SVN命令参考:http://riaoo.com/subpages/svn_cmd_reference.html
py3study
2020/01/08
1.9K0
相关推荐
python写的系统常用命令(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档