参考:https://www.cnblogs.com/zhouyixuan/p/7460867.html
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
重要的是:
0的含义;用户的shell是什么--内核解释器。
每一行都由 “ :” 分割为七段:
1.用户名:用户名字符可以是大小写字母、数字、减号(不能出现在首位)、点以及下划线,其他字符不合法
2.存放的就是该账号的口令,
3.这个数字代表用户标识号,也叫做uid ,系统识别用户身份就是通过这个数字来的,0就是root.
4.表示组标识号,也叫做gid
5.注释说明,该字段没有实际意义
6.用户的家目录
7.shell,用户登录后要启动一个进程,用来将用户下达的指令传给内核,这就是shell
[root@localhost ~]# cat /etc/shadow
root:$6$0o5J/rTgsl8rm70H$OiVM7tvygO0xooScymICebjjzDaKzYiz1YOWFHLGmzLPHx2osUh33ApqlwFgEI.RWRXicz4KKktBeyw.pElpw.::0:99999:7:::
chrony:!!:17394::::::
重要的是:1和2字段,别的不重要
由“:”分割为九段:
1. 用户名,跟/etc/passwd对应
2. 用户密码,这个才是该账号的真正的密码
3. 上次更改密码的日期,这个数字是这样计算得来的,距离1970年1月1日到上次更改密码的日期,例如上次更改密码的日期为2012年1月1日,则这个值就是 ‘365 x (2012-1970)+(2012-1970)/4 + 1 = 15341’. 因为如果是闰年,则有366天
4. 要过多少天才可以更改密码,默认是0,即不限制
5. 密码多少天后到期
6. 密码到期前的警告期限
7. 账号失效期限
8. 账号的生命周期,是按距离1970年1月1日多少天算的
9. 作为保留用的,没有什么意义
第一字段:组名
第二字段:组密码标志
第三字段:GID
第四字段:组中附加用户
第一字段:组名
第二字段:组密码
第三字段:组管理员用户名
第四字段:组中附加用户
1.tf.multiply()两个矩阵中对应元素各自相乘
格式: tf.multiply(x, y, name=None)
2.tf.matmul()将矩阵a乘以矩阵b,生成a * b。
格式: tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
参考:https://www.jianshu.com/p/d1900ec997d8
官网:https://www.tensorflow.org/guide/using_gpu
跑Keras 或者 Tensorflow时默认占满所有GPU内存,这时如果想再开一个进程,或者别人想开一个进程都挤不上来,所以必须限制GPU内存
查看GPU使用情况
watch -n 1 nvidia-smi每秒刷新
nvidia-smi
visible_device_list指定使用哪块显卡
per_process_gpu_memory_fraction分配到的内存占总内存量的比例
allow_growth根据运行时的需要来分配GPU内存,刚开始分配很少内存,随着Session开始运行并需要更多GPU内存时会自动扩展,但后续不会释放内存
per_process_gpu_memory_fraction与allow_growth两种方法二选一即可。一般用allow_growth即可,如果你能准确预估你的程序需要多大显存,推荐per_process_gpu_memory_fraction
设置sess:
# 将下面代码放在.py文件开头
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.visible_device_list = '0'
# config.gpu_options.per_process_gpu_memory_fraction = 0.2
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
# from keras import backend as K
# K.set_session(sess)
指定显卡的另外两种方法
配进环境变量
export CUDA_VISIBLE_DEVICES=0
使用os
import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0'
参考:https://www.jianshu.com/p/5609d67d8ab2
官网:https://docs.python.org/3.5/library/tarfile.html
参考:https://blog.csdn.net/pursuit_zhangyu/article/details/80556275
描述:urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
函数说明:
将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则对象将不会被复制,除非提供文件名。返回一个元组()(filename,header),其中filename是可以找到对象的本地文件名,header是urlopen()返回的对象的info()方法(用于远程对象)。
第二个参数(如果存在)指定要复制到的文件位置(如果没有,该位置将是一个生成名称的tempfile)。
第三个参数,如果存在,则是一个回调函数,它将在建立网络连接时调用一次,并且在此后每个块读取后调用一次。这个回调函数将传递三个参数;到目前为止传输的块计数,以字节为单位的块大小,以及文件的总大小。第三个参数可能是-1,在旧的FTP服务器上,它不返回文件大小以响应检索请求。
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。
例子:
import os
from six.moves import urllib
import sys
DATA_URL = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
filename = DATA_URL.split('/')[-1]
def _progress(block_num, block_size, total_size):
'''回调函数
@block_num: 已经下载的数据块
@block_size: 数据块的大小
@total_size: 远程文件的大小
'''
sys.stdout.write('\r>> Downloading %s %.1f%%' % (filename,
float(block_num * block_size) / float(total_size) * 100.0))
sys.stdout.flush()
filepath, _ = urllib.request.urlretrieve(DATA_URL, filename, _progress)
print()
输出:
Downloading Python-2.7.5.tar.bz2 100.0%
例子中的sys.stdout.write和print差不多是输出的意思,sys.stdout.flush()函数的作用是刷新输出
参考:https://blog.csdn.net/MrR1ght/article/details/80803816
1.sys.stdout的形式就是print的一种默认输出格式,等于print “%VALUE%”
print函数是对sys.stdout的高级封装,看下print函数的解释
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
print是默认调用了sys.stdout.write()方法将输出打印到控制台
print 也可通过file参数将输出打印到其他文件中
f = open('test.txt','a')
print('this is a test',file=f)
2.sys.stdout.write()输出不会自动换行,没有end,可用转义字符自行控制
/n 换行
/r 回车到本行首,可刷新输出
如用sys.stdout.write() 和\r实现自定义进度条
from tqdm import tqdm
import time
import sys
for i in tqdm(range(100)):
time.sleep(.1)
for i in range(100):
a = (i+1)/5
b = 20-a
#sys.stdout.write('\r>>convert image %d/%d'%(i,b))
sys.stdout.write('\r|%s%s|%d%%'%(a*'▇',b*' ',i+1))
sys.stdout.flush()
time.sleep(.1)
sys.stdout.flush()强制刷新缓冲区:
缓冲区的刷新方式:
1.flush()刷新缓存区
2.缓冲区满时,自动刷新
3.文件关闭或者是程序结束自动刷新。
写出漂亮的进度条模块tqdm:
from tqdm import tqdm
import time
for i in tqdm(range(10000)):
time.sleep(0.01)
参考:https://www.jianshu.com/p/21cf48be6bf6
https://blog.csdn.net/langb2014/article/details/54798823?locationnum=8&fps=1
cifar10是一个好例子,演示了如何使用多个 GPU 进行训练:https://www.tensorflow.org/tutorials/images/deep_cnn