Tensorflow学习之入门学习总结(持续更新......)

来源:互联网 发布:淘宝双11是什么意思啊 编辑:程序博客网 时间:2024/06/11 21:52

    • 三种利用会话Session的方法
    • 使用withDevice语句明确指定哪个cpu或gpu被调用
    • 变量variables和placeholder怎么区分
    • tensorflow网络运行流程图
    • 数据输入
      • 数据增强的方法
    • 定义网络结构
      • paddingSAME和VALID的区别
      • 定义batch_normalization层
      • 网络结构设计原则
    • 定义损失函数和优化算法
    • 评估模型

三种利用会话Session()的方法:

(1)

sess=tf.Session()result = sess.run(product)print(result)sess.close()

(2)利用with,在with结束时,会话自动关闭,不需要自己close

with tf.Session() as sess:    result = sess.run([product])    print(result)

(3)利用交互式会话,主要注意ops.run()以及tensor.eval()的使用

sess = tf.InteractiveSession()x = tf.Variable([1.0,2.0])a = tf.constant([3.0,3.0])x.initializer.run()sub = tf.sub(x,a)print(sub.eval())sess.close()

使用with…Device语句明确指定哪个cpu或gpu被调用

常常在定义权值和偏置时使用cpu,不然默认gpu

with tf.device("/cpu:0"):

若要使用gpu,可以指定哪一个gpu如下

with tf.device("/gpu:0"):with tf.device("/gpu:1"):

变量variables和placeholder怎么区分

placeholder常常用来临时替换一个操作的输出结果,并且需要feed进数据,利用feed_dict={},常用来定义输入x,预测输出y等如下

x=tf.placeholder(tf.float32)#orx=tf.placeholder(“float”,[None,784])#None代表张量的第一个维度可以是任何长度,也就是训练集train的数量#…#并且Print(sets.run([x],feed_dict={x:[3.]}))

而variables常用作代表一个可修改的张量,将模型参数用其表示

w=tf.Variable(tf.zeros([784,10]))b=tf.Variable(tf.zeros([10]))

tensorflow网络运行流程图

数据输入

数据增强的方法

一般放在图片解码之后如

tf.decode_png(image_contents,channels=3)    ##########################################################    # you can put data augmentation here, I didn't use it    ##########################################################    #        # data argumentation    #        image = tf.random_crop(image, [24, 24, 3])# randomly crop the image size to 24 x 24    #        image = tf.image.random_flip_left_right(image)    #        image = tf.image.random_brightness(image, max_delta=63)    #        image = tf.image.random_contrast(image,lower=0.2,upper=1.8)    #        image = tf.image.per_image_standardization(image)  # substract off the mean and divide by the variance

定义网络结构

padding=’SAME’和’VALID’的区别

SAME和VALID的重要性在于设计网络结构时,你可以自己清楚掌握最后每层输出的维数,结合图片大小,可以适当调整滤波器的大小和步长。
SAME:输出的特征图和输入特征图有相同的维数,其中利用0填充输入图来达到这一需求
VALID:就是没有利用填充
填充一般运用在卷积层和池化层中,如下图池化操作的例子:

  • ‘VALID’ = 没有填充
    这里写图片描述

  • ‘SAME’ = 0填充
    这里写图片描述

在这个例子中:

  • 输入宽度=13
  • 滤波器宽度=6
  • 步长=5
    注意:

  • ‘VALID’ 只丢弃最右边或者最下面的值

  • ‘SAME’ 尝试平均左右的填充,如果列数要被成为偶数,那么会先填充最右边的列,相同的,也是会先填充最下面的行。
    下面给一个Tensorflow中的例子看看:

  • 对于‘SAME’填充,输出的高度和宽度计算如下:
    这里写图片描述

  • 对于‘VALID’填充,输出的高度和宽度计算如下:
    这里写图片描述

定义batch_normalization层

个人在全连接层的第一层和第二层之后添加了bn之后,减轻过拟合的效果很明显,很好用!!

def batch_norm(x):    '''Batch normlization(I didn't include the offset and scale)    '''    epsilon = 1e-3    batch_mean, batch_var = tf.nn.moments(x, [0])    x = tf.nn.batch_normalization(x,                                  mean=batch_mean,                                  variance=batch_var,                                  offset=None,                                  scale=None,                                  variance_epsilon=epsilon)    return x

网络结构设计原则

(1)增加网络的深度(2)增加网络的宽度(3)努力实现简洁化-使用更少类型的层以保持网络尽可能简单(4)结构对称性(5)金字塔形状-在整个架构中应该有一个整体的平滑的下采样,而且该下采样应该与信道数量的增长结合起来(6)用训练数据覆盖问题空间提升泛化能力-如正则化方法的dropout,drop-path(7)过训练-使用噪声数据(8)增量特征构造-skip in resnet(9)规范层输入-使层输入标准化,如batch normalization(10)可用资源决定网络深度-根绝任务需求设计网络深度(11)求和连接-对分支(宽度)进行求和(或平均)操作(12)下采样过渡-当池化或使用步幅超过1的下采样时,组合分支的最好方法是串联输出信道,它可以平滑地实现用下采样方式实现信道的连接和信道数量的增加(13)maxout for competition-当分支由不同大小的核组成时,maxout可用于尺度不变性,这类似最大池化的平移不变性

定义损失函数和优化算法

常用的损失函数为交叉熵损失函数即Hy(y)=iyilog(yi)

cross_entropy = -tf.reduce_mean(y_*tf.log(y))#y_为实际的分布(标签),y为预测的概率分布

常用优化算法

print("Use thr optimizer:{}".format(FLAGS.optimizer))if FLAGS.optimizer == "sgd":    optimizer = tf.train.GradientDescentOptimizer(learning_rate)elif FLAGS.optimizer == "adadelta":    optimizer = tf.train.AdadeltaOptimizer(learning_rate)elif FLAGS.optimizer == "adagrad":    optimizer = tf.train.AdagradOptimizer(learning_rate)elif FLAGS.optimizer == "adam":    optimizer = tf.train.AdamOptimizer(learning_rate)elif FLAGS.optimizer == "ftrl":    optimizer = tf.train.FtrlOptimizer(learning_rate)elif FLAGS.optimizer == "rmsprop":    optimizer = tf.train.RMSPropOptimizer(learning_rate)elif FLAGS.optimizer == "momentum":    optimizer = tf.train.MomentumOptimizer(learning_rate)elif FLAGS.optimizer == "adagraddao":    optimizer = tf.train.AdagradDAOptimizer(learning_rate)elif FLAGS.optimizer == "proadagrad":    optimizer = tf.train.ProximalAdagradOptimizer(learning_rate)elif FLAGS.optimizer == "prosgd":    optimizer = tf.train.ProximalGradientDescentOptimizer(learning_rate)else:    print("Unknown optimizer:{},exit now".format(FLAGS.optimizer))    exit(1)

评估模型

一般评估模型常用tf.argmax()得到预测值correct_prediction,其为bool值,还要转换成float类型才能得到accuracy

correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
原创粉丝点击