张量(tensor)
张量
是图中计算节点的运算结果的引用,由name,shape,type三个属性构成。
张量的命名
可以以“name:src_output”的形式给出,node为计算节点名称,src_output表示当前张量来自节点的第几个输出
张良的优点
1. 提高代码可读性
2. 方便获取中间结果
3. 用来获得计算结果(通过tf.Session.run(某张量))
会话(session)
通过python上下文管理器来管理会话
with tf.Session() as sess: pass sess.run(...)
将所有计算放在“with”中,可以避免由于忘记或异常导致无法调用“某会话.close()”,从而造成的资源泄露。
指定某会话为默认会话
sess = tf.Session() with sess.as_default(): pass print(result.eval())
上面代码的作用类似于:
sess = tf.Session() pass print(sess.run(某张量))
或者
sess = tf.Session() pass print(某张量.eval(session=sess))
但省略了每一次计算都要显式地说明会话的繁琐。
在交互式环境下,指定默认会话
例如在jupyter中,可以这样指定默认对话
sess = tf.InteractiveSession() pass print(某张量.eval()) sess.close()
变量
TensorFlow用变量来存储神经网络中的参数。通过w=tf.Variable()来声明,声明时,要指明初始化该变量的方法,如w=tf.Variable(random_normal([2,3],stdev=2))。
定义好变量后,在会话中,不要忘了初始化该变量,如sess.run(w.initializer)。常量不需要初始化,但是变量不能少了初始化的过程。
批量初始化变量
为了避免一次初始化一个变量,可以在会话中通过tf.initialize_all_variables函数来达到一次性初始化左右变量的作用。
init_op = tf.initialze_all_variables() sess.run(init_op)
tf.nn.softmax_cross_entropy_with_logits(y, y_)
tensorflow将交叉熵和softmax回归进行了统一封装。y为原始神经网络的输出结果,y_为标准答案,通过这个函数得到使用了softmax回归后的交叉熵
tf.clip_by_value(张量,元素下限a,元素上限b)
将张量元素中低于a的变为a,高于b的变为b。可以用来避免log0的情况
tf.nn.softmax_cross_entropy_with_logits(y,y_)
求y与softmax(y_)的交叉熵,这里的with_logits指的是y_为神经网络的输出。
在只有一个正确答案的的分类问题中,用tf.nn.sparse_softmax_cross_entropy_with_logits(y,y_)能计算快一些
tf.contrib.learn.preprocessing.VocabularyProcessor(max_sequence_length, min_frequency)
定义一个VocabularyProcessor。其作用看代码就知道了。
from tensorflow.contrib import learn import numpy as np max_document_length = 4 x_text =[ 'i love you', 'me too if you do' ] vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length) vocab_processor.fit(x_text) print(x) print(next(vocab_processor.transform(['i me too do'])).tolist()) x = np.array(list(vocab_processor.fit_transform(x_text)))
结果:
[[1 2 3 0]
[4 5 6 3]]
[1, 4, 5, 6]
可以发现:超出最大序列长度的部分被截断,没到最大长度的用0填补。
正则化(regularization)
用来避免过拟合现象,在代价方程中往往加入正则项R(w)。正则项中不包含偏置项。正则项有两种,一种是权值的平方和(L2正则化项),一种是权值的绝对值之和(L1正则项)。L1正则项会让参数变得更稀疏,所以可以用起到特征选取的功能。tensorflow中提供了tf.contrib.layers.l2_regularizer()函数,他可以返回一个函数,这个函数可以计算一个给定参数的L2正则项的值。类似的可以用tf.contrib.layers.l1_regularizer()来求L1正则项的值