tensorflow1.9个人学习笔记

85 篇文章 257 订阅
28 篇文章 14 订阅

一、神经网络的一般训练步骤

#一、训练网络的一般步骤
for epoch in range(epochs):
    batch_count=int(num_example/batch_size)
    for i in range(batch_count):
        opti,summary,loss,acc=sess.run([optimizer,merge,cost,accuracy],feed_dict={X:__,Y:__})  #注意前后四个的一一对应关系,顺序不能错,而且不能够同名称,否则会报错
        writer.add_summary(summary,global_step=epoch*batch_count+i)  #仔细体会它的含义,它表示没训练一个batch,都会记录一次summary

test_accuracy=sess.run(accuracy,feed_dict={X:test_X,y:test_Y})  #此为测试集上的准确率

 二、tensorboard日志记录的一般步骤

#二tensorboard的使用(日志记录的一般步骤)

#1、第一步:记录每一个summary
summary_01=tf.summary.scalar(name=a.op.name,tensor=a)  #scaler是指标量的意思,记录某个标量的值的变化,比如损失、准确率等等
summary_02=tf.summary.histogram(name=w.op.name,tensor=w) #histogram是直方图的意思,如参数矩阵、偏置项等
summary_03=tf.summary.image(name=c.op.name,tensor=c)  #image是图像的意思
summary_04=...
summary_05=...        #此外还有文本text等等

#2、第二部:合并所有的summary
merge=tf.summary.merge_all()
merge=tf.summary.merge([summary_01,summary_02,summary_03,....]) #两种方式任选其一

#3、第三步:summary的写入
with tf.Session() as sess:
    # 首先变量初始化
    writer=tf.summary.FileWriter("path",sess.graph)  #需要制定哪一个session,也可以使用tf.get_default_graph()

    #(1)方式一:
    writer.add_summary(sess.run(merge))
    #(2)方式二:
    summary=sess.run(merge)
    writer.add_summary(summary)
    #(3)方式三:
    opti,summary,loss,acc=sess.run([optimizer,merge,cost,accuracy],feed_dict={X:__,Y:__})  #注意前后四个的一一对应关系,顺序不能错,而且不能够同名称,否则会报错
    writer.add_summary(summary,global_step=epoch*batch_count+i)

    '''下面讲两个需要注意的点
    注意点一:无论上面那种方式,都不能够写入空值(未feed的placehold和未初始化的变量),考虑到feed_dict只对当前语句有效,而需要写入的summary又常常就是我们需要的
             loss,accuracy等信息,故而方式三是最好的最值得推荐的,因为它一次性的feed进了需要的数据,不容易出错。
    注意点二:
    writer.add_summary(summary,global_step=epoch*batch_count+i) 方法有一个global_step参数,它表示的是每隔多久记录一次,如果不设置,它只记录最后一次的终值
    故而一般在循环中设置,每一次都记录或者是隔几次记录一次
'''
'''
一般这样做就可以了,如下:
with tf.Session() as sess:
    logdir = './logs'
    writer = tf.summary.FileWriter(logdir, sess.graph) 

    for epoch in range(epochs): #用keras的train_on_batch方法进行训练 
        #这一块儿代码是训练代码 
        
        writer.add_summary(summary,global_step=epoch) #让global_step=epoch,随之递增就行了
'''

tensorboard的八大面板简介:

  • scalers
  • images
  • audio
  • graphs
  • distributions
  • histograms
  • embeddings(在3D或者是2D图中展示高维数据)
  • text

tensorboard的几个注意事项:

(1)horizontal axis:——图像的横坐标

 step:这是默认值,横轴表示训练次数

relative:相对时间,相对于训练开始的时间,也就是训练用的时间,单位是小时

wall:训练的绝对用时

(2)graph面板

graph面板中默认是不记录每一个节点的用时、内存的耗费情况的,如果要显示这些信息,那该怎么办呢?

需要在session会话中添加下面几句话:

run_options=tf.RunOptions(trace_lavel=tf.RunOptions.FULL_TRACE)
run_matadata=tf.RunMetadata()
opti,summary,loss,acc=sess.run([optimizer,merge,cost,accuracy],feed_dict={X:__,Y:__},options=run_options,run_metadata=run_matadata)  #关键是添加这两个参数

writer.add_run_metadata(run_matadata,'step{}'.format(i))   #这句话也是需要添加的
writer.add_summary(summary,i)

 关键是需要添加 options=run_options,run_metadata=run_matadata) 这两个参数;

writer.add_run_metadata(run_matadata,'step{}'.format(i))   #这句话也是需要添加的

(3)什么时候distributions  多分位数折线图的堆叠

横坐标是:训练步数

纵坐标是:权重值

(4)histograms和distributions的区别

histograms和distributions是对同一数据的不同展现维度,故而总是一起出现,

对于histograms而言,横坐标为权重值,纵坐标为训练步数,这和distribution是相反的。颜色越深的地方代表训练越早,颜色越浅代表训练越晚。

 三、tensorflow GPU版本的config配置

tf.Session(...,config=None): 里面有一个config参数,该参数是一个tf.ConfigProto()创建的,下面是常见的一些设置

#(1)创建config对象
config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
#(2)设置config的属性
config.gpu_options.allow_growth=True
config.gpu_options.perprocess_gpu_memory_function=0.4

log_device_placement参数:即允许查看操作和张量被分配到了哪一个设备上

allow_soft_placement参数:当指定的device名称不存在的时候,设置为true,则tensorflow会自动选择已有的设备,若不设置这个属性,则会报错。 

四、关于测试集的测试(test)

#测试集的测试
with tf.Session() as sess:
    '''
    这是训练部分,这是通过对epochs的循环完成的
    训练完成,下面才是测试test
    '''
    x_value_test=...
    y_value_test=...
    predict_loss=np.mean(sess.run(loss,feed_dict={X:x_value_test,Y:y_value_test}))
    predict_acc=sess.run(accuracy,feed_dict={X:x_value_test,Y:y_value_test})

 注意:对于回归问题一般只用loss,对于分类问题,二者均用,至于accuracy怎么定义的,看下面的内容。

五、accuracy的定义

一般,优化器optimizer、损失函数loss、准确率accuracy 这三者是放在一起定义的,tf中关于全两者都有直接实现,accuracy需要自己定义。

一般而言accuracy在分类问题中才使用,分类问题中最后的类别都是独热编码的,只要独热编码的最大值所对应的位置索引是一样的,我们即可以称之为是一个正确的预测。比如有四个类别:

y1=[0,1,0,0]   

y2=[0.1,0.6,0.1,0.2]

y3=[0.6,0.1,0.2,0.1]

y1是真实样本,y2和y3是预测值,很明显,y2是正确预测,因为他们的最大值索引出现在1,y3是错误预测,那在tensorflow中怎么实现呢?

accuracy的定义主要是通过以下几个函数实现的。

(1)tf.argmax(input,axis=None,name=None,dimension=None,output_type=dtypes.int64)

(2)tf.equal()   它返回的是布尔值,还需要将布尔值转化为数

(3)tf.cast()

一般的实现如下:

correct_predict=tf.equal(tf.argmax(Y,0),tf.argmax(Y_,0))  #Y为模型的预测值,Y_为模型的真实值,它返回的是布尔值
accuracy=tf.reduce_mean(tf.cast(correct_predict,tf.float32)) #将布尔值转化为数字,最终得到譬如0.812的准确率这样的数值

六、tensorflow中交叉熵的计算

1、直接使用tf内置的函数计算

cost=tf.reduce_mean(tf.nn.soft_cross_entropy_with_logits(logits=pre_Y,label=Y))   #Y表示真实样本输出

注意:这里的pre_Y指的是模型的输出,即没有使用tf.nn..softmax()函数的那个输出pre_Y,这个pre_Y称之为logits,因为

tf.nn.soft_cross_entropy_with_logits()这个函数已经内置了softmax()函数了。

2、自己计算交叉熵损失

pre_Y=tf.nn.softmax(Y1*W2+b)

cost=tf.reduce_mean(Y*tf.log(pre_Y))   # 但是这样有一个致命的问题,那就是,当pre_Y中出现0的时候,log0 会得到 -inf ,所以最终 cost 返回的结果是 nan,因为出现了非数值,所以最好还是使用系统给定的交叉熵损失函数。

注意:

上面两种方法里面的pre_Y是不一样的。

方法一中的pre_Y是未经过softmax运算的,称之为logits,即[Z1,Z2,Z3,Z4...Zn] 这种形式,这里的Z1+Z2+Z3....Zn的和不是1哦!

方法二中的pre_Y是经过softmax运算的,即[δz1,δz2,δz3,...δzn] 的形式,此时  δz1+ δz2+ δz3+ δz4... δzn的和为1

 

七、如何实现自适应学习率

lr=tf.placeholder(tf.float32)
optimizer=tf.train.AdamOptimizer(lr).minimize(cost)

with tf.Session() as sess:
    #变量初始化
    writer=tf.summary.FileWriter()

    for epoch in range range1(epochs):
        for i in range(batch_count):
            decay_speed=2000  #衰减速度
            max_rate=0.003    #最大学习率
            min_rate=0.0001   #最小学习率
            learning_rate=min_rate+(min_rate+max_rate)*math.exp(-i/decay_speed)  #lr作为一个placehold先定义,训练的时候在feed这个衰减学习率

            opti,summary=sess.run([optimizer,merge],feed_dict={X:batch_x,Y:batch_y,lr:learning_rate})  #在此处feed进衰减学习率
            writer.add_summary(summary,global_step=....)

八、keras在使用plot_model时pydot和graphviz的安装

首先需要说明的是,这个地方需要安装三个东西,而且安装是有先后顺序的,否则都会报错,安装的的三样东西是:

graphviz的python包

graphviz的windows运行程序

pydot的python包

第一步:先安装graphviz的python包,只需pip install graphviz 即可;

第二步:安装graphviz的windows运行程序,它是一个安装的msi文件,按照指示安装即可,下载官网为:

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

安装完成之后,还需要将安装目录之下的bin文件夹放在path环境变量里面,

第三步:安装pydot的python包,只需pip install pydot  即可

第四步:重启计算机,因为新设置了环境变量的缘故

按照上面的顺序进行安装即可以啦!

 

上面就是自己在学习tensorflow的过程中积累的一些问题,做的一些笔记,后面还会在此基础之上进行更新。 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值