三种利用会话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)=−∑iy′ilog(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"))