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

三种利用会话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)
#or
x=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"))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值