python跟深度numpy产生随机数初始化矩阵、ones_like、tf打印变量、session获取变量值

注意:使用tensorflow里的任何函数进行一些测试的时候都需要使用Session()来创建一个会话。

1、使用numpy跟tensorflow的自身函数产生随机值:

numpy的特殊变量初始化的方式,其产生的数据类型是array,如下:

python跟深度numpy产生随机数初始化矩阵、ones_like、tf打印变量、session获取变量值_第1张图片

使用tensorflow自身的函数来产生随机值,其产生的数据类型是tensor,如下:

import tensorflow as tf
with tf.Session() as session:
     randvalue=tf.random_normal((2,2),stddev=.2) #产生正态分布的随机数
     print(randvalue.eval())
     shufflevalue=tf.random_shuffle(randvalue) #进行数据的随机打乱。不过不知道为啥值会改变
     print(shufflevalue.eval())
     a=[[1,2],[3,4],[5,6]]
     #如果使用的是固定值,则其随机打乱是没有改变数值的。其随机打乱从左往右的第一维
     print("赋值固定值:\n",session.run(tf.random_shuffle(a)))
     print("赋值固定值:\n",session.run(tf.random_shuffle(a)))

其输出结果是:

[[-0.13477838  0.27776045]
 [ 0.26758903  0.37061656]]
[[0.30167246 0.00623549]
 [0.15726946 0.43721744]]
赋值固定值:
 [[3 4]
 [1 2]
 [5 6]]
赋值固定值:
 [[3 4]
 [5 6]
 [1 2]]

使用tensorflow进行初始化变量:

参考:TensorFlow基础知识点(六)/矩阵基本操作

import tensorflow as tf
with tf.Session() as session:
    # 初始化为1,其中shape需要使用[]为不是(),dtype可以指定类型
    tfones=tf.ones([2,3],dtype=tf.int16)
    print(tfones.eval())
    tfzeros=tf.zeros([2,3],dtype=tf.int16)#初始化为0
    print(tfzeros.eval())
    #新建一个与给定的tensor类型大小一致的tensor,其所有元素为1。
    #一般在深度网络计算损失的时候用的比较多tf.zeros_like(tensor,dype=None,name=None)
    tfones_like=tf.ones_like(tfzeros,dtype=tf.int16)
   #新建一个与给定的tensor类型大小一致的tensor,其所有元素为0。
    print("ones_like:\n",tfones_like.eval())
    tfzeros_like=tf.zeros_like(tfones_like,dtype=tf.int16)
    print(tfzeros_like.eval())
    #tf.fill(dim,value,name=None)
    #创建一个形状大小为dim的tensor,其初始值为value
    tffill=tf.fill([2,3],3)
    print(tffill.eval())
    #tf.constant(value, dtype=None, shape=None, name='Const')
    # 创建一个常量tensor,先给出value,可以设定其shape
    tfconstant=tf.constant(1,shape=(2,3))
    print("tfconstant:",tfconstant.eval())

其输出结果为:

[[1 1 1]
 [1 1 1]]
[[0 0 0]
 [0 0 0]]
ones_like:
 [[1 1 1]
 [1 1 1]]
[[0 0 0]
 [0 0 0]]
[[3 3 3]
 [3 3 3]]
tfconstant: [[1 1 1]
 [1 1 1]]

调试tensorflow跟打印变量:

a、通过Session.run()获取变量的值(很常见,一般在训练的时候进行验证时会在验证一次graps的时候通过session来获取损失loss)

b、通过TensorBoard查看一些可视化统计,这个挺好的,不过要占用GPU 

c、使用tf.Print()和tf.Assert()打印变量,(比较麻烦,还不如使用print来格式化打印)

d、使用python的debug工具:ipdb、pudb

c、使用官方debug工具:tfdbg

d、使用第三方工具:tdb

 重点结算Session.run()的使用方法:

import tensorflow as tf
import numpy as np
#注意 placeholder 和 feed_dict 是绑定用的。
x=tf.placeholder(tf.float32)
y=tf.placeholder(tf.float32)
#tensorflow的与python的不同。如果定义了变量,则一定需要调用tf.global_variables_initializer()来进行初始化
bias=tf.Variable(1.0)
y_pred=x**2+bias
loss=(y-y_pred)**2
session=tf.Session()
#这句一定要加,否则无法对bias进行初始化,在运行print时会报'Attempting to use uninitialized value Variable'
session.run(tf.global_variables_initializer())
#Error:You must feed a value for placeholder tensor 'Placeholder_1'with dtype float
# print('Loss(x,y)=%.3f'%session.run(loss,feed_dict={x:3.0}))
#OK:print 1.000=(3**2+1-9)**2
print('Loss(x,y)=%.3f'% session.run(loss,feed_dict={x:3.0,y:9.0}))
#ERROR:虽然上面运行过一次loss,并且产生了一次y_pred的赋值,但是当运行完run()即计算完一次图,就会释放资源。
#所以再次运行的时候会出现:You must feed a value for placeholder tensor 'Placeholder' with dtype float的错误
#所以这里如果需要获取y_predde值要在上面run的时候一起把值读出来
# print(session.run(y_pred))
#在正确feed_dict后一起把值读出来
hh1,hh2=session.run([loss,y_pred],feed_dict={x:3.0,y:9.0})
print("Loss(x,y)=%.3f,y_pred(x)=%.3f"%(hh1,hh2))
#ERROR:print的格式化输出使用的时元组,而不是列表,如果使用list会报错
# print("Loss(x,y)=%.3f,y_pred(x)=%.3f"%list(session.run([loss,y_pred],feed_dict={x:3.0,y:9.0})))
#OK:把输出数据转换为元组,如果没有tuple则会报:TypeError: must be real number, not list
print("Loss(x,y)=%.3f,y_pred(x)=%.3f"%tuple(session.run([loss,y_pred],feed_dict={x:3.0,y:9.0})))
print('y_pred(x)=%.3f'%session.run(y_pred,feed_dict={x:3.0}))
#由于这个bias是定义为一个变量。其在任何时候都可以通过bias来进行获得其值,
#深度网络里的W、Bias等也是一个变量,其值是可以随时获取的。
print('bias =%.3f'%session.run(bias))

其输出结果是:

Loss(x,y)=1.000
Loss(x,y)=1.000,y_pred(x)=10.000
Loss(x,y)=1.000,y_pred(x)=10.000
y_pred(x)=10.000
bias =1.000

下面是使用Session.run()来随时获取Variable()类型的值:

在代码前面是这样定义一个D_W1变量的:

D_W1=tf.Variable(xavier_init([X_dim,h_dim]))

然后在训练处进行读取:

python跟深度numpy产生随机数初始化矩阵、ones_like、tf打印变量、session获取变量值_第2张图片

总结:声明为Variable()的变量可以随时通过任何打印工具来获得其值。而一些变量是Graps里的一些过程变量,如果要获得它的值,就需要在run计算图的时候把这些变量放到run([,,,],feed_dict={,,,})里的中括号里,或者使用tensorboard来把这个变量添加到其训练日志,然后图表形式查看。具体获得方法参考上面Session.run()的使用方法。

下面是展示如何添加到训练日志进行记录变量的历史值:

import tensorflow as tf
import numpy as np
#注意 placeholder 和 feed_dict 是绑定用的。
LOGDIR='tensorboard/'
x=tf.placeholder(tf.float32)
y=tf.placeholder(tf.float32)
#tensorflow的与python的不同。如果定义了变量,则一定需要调用tf.global_variables_initializer()来进行初始化
bias=tf.Variable(1.0)
y_pred=x**2+bias
loss=(y-y_pred)**2
session=tf.Session()
#这句一定要加,否则无法对bias进行初始化,在运行print时会报'Attempting to use uninitialized value Variable'
session.run(tf.global_variables_initializer())
#过程变量可以通过添加到tensorboard的可视化图里。这样子可以保存历史值
tf.summary.histogram("y_pred",y_pred)
tf.summary.histogram("loss",loss)
#把所有的summary都集合到一起
summ=tf.summary.merge_all()
writer=tf.summary.FileWriter(LOGDIR)
#Error:You must feed a value for placeholder tensor 'Placeholder_1'with dtype float
# print('Loss(x,y)=%.3f'%session.run(loss,feed_dict={x:3.0}))
#OK:print 1.000=(3**2+1-9)**2
step=0
while True:
    xrandom=np.random.randn(1)
    yrandom=tf.random_normal([1])
    yrandomarray=np.random.rand(1)
    #这里feed_dict不能使用tensor的值赋给变量。需要使用array、list、tuple的变量来赋值
    lossvalue,s=session.run([loss,summ],feed_dict={x:xrandom,y:yrandomarray})
    # print('Loss(x,y)=%.3f'% session.run(loss,feed_dict={x:3.0,y:9.0}))
    print("Losee(x,y)=%.3f"%lossvalue)
    step += 1
    if step%20==0:
        #这里的step相当一图标里的横坐标,指迭代次数,当训练到一定次数是就往日志文件里写数据,方便
        #tensorboard读取并显示出数据
        writer.add_summary(s,step)
    if step>10000:
        break

其使用tensorboard进行查看的结果如下:

python跟深度numpy产生随机数初始化矩阵、ones_like、tf打印变量、session获取变量值_第3张图片

 

 

你可能感兴趣的:(python,深度学习)