一、X[:,0]是numpy中数组的一种写法。表示对一个二维数组,取该二维数组第一维中的所有数据,第二维中取第零个数据,X[:,0]就是取所有行的第零个数据。
import numpy as np
X = np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]])
print (X[:,0])
输出结果为
[ 0 2 4 6 8 10 12 14 16 18]
X[:,1]就是取所有行的第1个数据
import numpy as np
X = np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]])
print (X[:,1])
输出结果为
[ 1 3 5 7 9 11 13 15 17 19]
X{n,:]是取第一维中下标为n的元素的所有值
import numpy as np
X = np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[16,17],[18,19]])
print (X[2,:])
输出结果为
[4 5]
X[:,m:n]表示取所有数据的第m到n-1列数据,含左不含右,例如,X[:,1:3]表示输出X中所有行第一到第二列数据
X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14],[15,16,17],[18,19,20]])
print (X[:,1:3])
结果为
[[ 1 2]
[ 4 5]
[ 7 8]
[10 11]
[13 14]
[16 17]
[19 20]]
self.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True))
二、config用来对session进行参数配置,log_device_placement=true:是否打印设备分配日志,allow_soft_placement=true:如果你指定的设备不存在,允许tf自动分配设备。
三、tf.placeholder(dtype,shape=none,name=none),
参数:
dtype:数据类型,常用的是tf.float32,tf.float64等数值类型
shape:数据形状,默认是None,就是一维值,也可以是多维(比如[2,3],[None,3]表示列是3,行不定)
name:名称
四、Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。
五、shape函数:对于二维张量,shape[0]表示行数,shape[1]表示列数,同理,三维张量还有shape[2],一般来说,-1代表最后一个,所以shape[-1]表示列数,注意,即使是一维行向量,shape[-1]表示行向量的元素总数,换言之也是列数。
六、For I in range(1,len(layers)-1):初始化一个神经网络的权重,layers是一个列表,表示神经网络的层数,表示从1开始遍历网络到倒数第二层,
七、tf.zeros(shape,dtype=tf.float32,name=None),shape表示形状。也就是一维的还是n维的数组,下面看图说话,一维数组放一个值
import tensorflow as tf
res = tf.random_uniform((4, 4), -1, 1)
res2 = tf.zeros([1])
with tf.Session() as sess:
print(sess.run(res2))
输出结果为
[0.]
一维数组放两个值
import tensorflow as tf
res = tf.random_uniform((4, 4), -1, 1)
res2 = tf.zeros([2])
with tf.Session() as sess:
print(sess.run(res2))
输出结果为
[0. 0.]
二维数组
import tensorflow as tf
res = tf.random_uniform((4, 4), -1, 1)
res2 = tf.zeros([2, 4])
with tf.Session() as sess:
print(sess.run(res2))
结果为
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]
八、tf.concat用来拼接张量,tf.concat([tensor1,tensor2,......],axis)
import tensorflow as tf
t1 = [[1,2,3],[4,5,6]]
t2 = [[7,8,9],[10,11,12]]
tf.concat([t1,t2],0)
tf.concat([t1,t1],1)
输出结果
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
[[1,2,3,4,5,6],[7,8,9,10,11,12]]
九、np.linalg.norm用于求范数,linalg本意为linear(线性)+algebra(代数),norm则表示范数。
用法:np.linalg.norm(x,ord=None,axis=None,keepdims=False)
x表示矩阵,一维数组也是可以的;ord表示范数类型,当x是矩阵时,ord=1表示求列和的最大值;ord=2,求特征值,然后求最大特征值的算术平方根;ord=无穷,表示求行和的最大值;ord=None表示求整体的矩阵元素平方和再开方;axis:参数等于0时,表示按列向量来进行处理,求多个列向量的范数;参数等于1时,表示按行向量来进行处理,求多个行向量的范数;参数为None时表示整个矩阵的范数;keepdims:表示是否保持矩阵的二维特性,True表示保持,False表示不保持,默认为False
十、torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False, is_grads_batched=False)
outputs:求导的因变量(需要求导的函数)。
inputs:求导的自变量。
grad_outputs:如果outputs为标量,则grad_outputs=None,也就是说,可以不用写; 如果outputs 是向量,则此参数必须写。
retain_graph: True 保留计算图, False释放计算图。
create_graph:若要计算高阶导数,则必须选为True。
allow_unused:允许输入变量不进入计算。
1、output为标量:不需要设置grad_outputs,即grad_outputs=None
2、output为向量:求解梯度时,需要将grad_outputs设置为全一的与output形状相同的张量
grad_outputs=torch.ones_like(y)
3、求二阶导数:需要设置create_graph=True才能计算二阶导数