tensorflow 知识过程
# Tensorflow note
基本用法
- 起始节点
c = tf.Constant(tf.int32, shape=[None, 1], name="Constant")
v = tf.Variable(...)# 运行中被更新
p = tf.placeholder(...)
- shape
[None, 784]# None代表第一纬度不确定,视输入而定, 用于不定batch输入
tf.reshape(x, [-1, 28, 28, 1])# 第一个纬度根据计算得到。
- operation
tf.matmul() #矩阵乘法
tf.square()
tf.log()
tf.reduce_sum()
tf.arg_max()
tf.equal()
tf.assign()
- 初始化
1、 简单初始化
# tf.initialize_all_variables() 已经被废弃
init = tf.global_variables_initializer()# 在session中,可以直接init.run()
sess.run(init)
2、 复杂初始化
# 截断正态分布
tf.Variable(tf.truncated_normal(shape, stddev=0.1))
tf.randint(-1, 1)
tf.uniform_random()
- 损失
# 交叉损失熵
# softmax is used to normalize all dimesion.
y = tf.nn.softmax(tf.matmul(x, W) + b)
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))# y_hat(label) multiply log(y)
- 优化
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
_, loss = sess.run([train, loss], feed_dict={x: xx})
print(loss)# 运行中查看损失
- 评估模型
tf.argmax(y, 1) # 在第二维度找最大值变为1, 如softmax后,每个纬度都有取值,找到最大值变为1, 第一维度用于batch# 训练结果与标签值每个判断是否相等,得到的correct的形式类似于
# [True, True, False, True]
correct = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 转换为准确率
# cast用于把True变为1, False变为0
# reduce_mean取平均值
accuracy = tf.reduce_mean(tf.cast(correct, "float"))
# 运行accuracy 的Graph
a = sess.run(accuracy, feed_dict={test_dict})
- Session 和 Graph
sess = tf.InteractiveSession()
直接成为默认的Session, 可以直接用op.run() 或 tensor.eval()
结束时必须使用 sess.close()
1、 正常情况下
with tf.Session() as sess:
sess.run(...)
2、 默认session
sess = tf.Session()
with sess.as_default():
c.eval()
# 尽管调用完毕,但sess仍是默认Session(),必须显示调用sess.close()
保存和加载变量
saver = tf.train.Saver()
saver.save(self.sess, "./model.ckpt", global_step=1)# 目录./是很必要的,或者用os.path.join(...)# 加载
self.saver.restore(self.sess, "./model.ckpt-1")# -1 是保存中指定的global_step
- 注:变量的name不能改变,在保存和加载的过程中。
- CNN
# conv2d代表二维卷积网络(如图片),需要输入四个纬度的元素, 第一纬度为batch_size(无意义), 第二、三分别维宽和高,第四个纬度为每个元素的通道数,如黑白为1, 彩色为3.
# stride为步长, 重点关注第二第三纬度。
# padding为SAME: 输出与输入的形状(shape)相同
# padding为VALID: 输出与输入通过公式计算: width= (28-5+2*0/1)+1=24,
# 卷积层
tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME")# ksize代表卷积核的大小,本例为2*2,步长分别为2, 2
# 输出的大小为width/=2, height/=2
# 池化层
tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool(h_conv1)W_conv2 = ...
tensorboard
# 设置图标中记录的名称和变量值。
tf.summary.scalar('loss', cross_entropy)
# merge所有的操作符
merged_summary_op = tf.summary.merge_all()
# 定义写入目录。
summary_writer = tf.summary.FileWriter("/tmp/mnist_logs", sess.graph)
# 运行merge操作符并写入。
summary_str = sess.run(merged_summary_op, feed_dict={x: batch_xs, y_: batch_ys})
summary_writer.add_summary(summary_str, i)
【tensorflow 知识过程】启动
tensorboard --logdir /tmp/mnist_logs
scope(variable/name)
- variable_scope
It is used to share variable byget_variable
.
with tf.variable_scope('v_scope') as scope1:
Weights1 = tf.get_variable('Weights', shape=[2,3])# 下面来共享上面已经定义好的变量
with tf.variable_scope('v_scope', reuse=True) as scope2:
Weights2 = tf.get_variable('Weights')
- name_scope
It is mainly used to create diffent variable with same name.It will create a new name_scope, if the name has been existed.
e.g.conv1_1
.
Usually every layer is a name_scope.
with tf.name_scope('conv1') as scope:
weights1 = tf.Variable([1.0, 2.0], name='weights')
bias1 = tf.Variable([0.3], name='bias')with tf.name_scope('conv2') as scope:
weights2 = tf.Variable([4.0, 2.0], name='weights')
bias2 = tf.Variable([0.33], name='bias')
推荐阅读
- 知识
- 小学英语必考的10个知识点归纳,复习必备!
- 全过程工程咨询——时间管理(12)
- 生发知识,带你深入了解
- 知识付费的怪力乱象
- 知识与爱情读后感
- 普通人进阶的三个过程-很多人都知道,但却本末倒置
- Android系统启动之init.rc文件解析过程
- 雅姿雅态知识2【怎么坐?才能坐如芍药|雅姿雅态知识2【怎么坐?才能坐如芍药,尽显女人优雅】
- 碎片化阅读,四步教你建立自己的知识体系