[TOC]
tf基本概念
在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是tensorflow::Tensor 实例.
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op.
创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算.
计算图中, 操作间传递的数据都是 tensor.
##tf 变量
tf.split
# Split 'value' into 3 tensors with sizes [4, 15, 11] along dimension 1
split0, split1, split2 ``=` `tf.split(value, [``4``, ``15``, ``11``], ``1``)
tf.shape(split0) ``# [5, 4]
tf.shape(split1) ``# [5, 15]
tf.shape(split2) ``# [5, 11]
# Split 'value' into 3 tensors along dimension 1
split0, split1, split2 ``=` `tf.split(value, num_or_size_splits``=``3``, axis``=``1``)
tf.shape(split0) ``# [5, 10]
tf.string_split
tf.string_split(
source,
sep=None,
skip_empty=True,
delimiter=None,
result_type='SparseTensor',
name=None
)
tf.FixedLenFeature
FixedLenFeature在处理特征时,会根据输入的shape来得到相应的输出tensor的shape。 当输入shape = []时,输出tensor的shape=(batch_size,), 当输入shape=[k]时,输出tensor的shape= (batch_size,k)
###print 权重值
- self.sess.run(self.w) # 返回值 ‘result’ 是一个 numpy
ndarray对象.
tf 常量
# 构造器的返回值代表该常量 op 的返回值. 产生一个 1x2 矩阵
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
###权重初始化
w = tf.Variable(tf.random_normal([self.n_input_size, self.n_hidden_size_1]))
tf optimizer
自动调整Learning rate的值
learning_rate = tf.placeholder(tf.float32, shape=[])
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(mse)
sess.run(train_step, feed_dict={learning_rate: 0.1})
##tf summary相关
常见summary用法
-
tf.summary.scalar
-
用来显示标量信息
-
tf.summary.scalar(name, tensor, collections=None)
-
tf.scalar_summary('learning_rate', lr)
-
-
tf.summary.merge_all
- merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。
###summary 汇总writer的一般代码
# summary 汇总代码
summary_op = tf.summary.merge_all()
summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph)
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)
# 最后释放write
summary_writer.close()
###summary自动化函数
def variable_summaries(var):
"""Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean)
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
tf.summary.scalar('stddev', stddev)
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.scalar('min', tf.reduce_min(var))
tf.summary.histogram('histogram', var)
##tensorboard
- 启动
- tensorboard –logdir=logs –port=6099
tf矩阵操作
tf.multiply tf.matmul 区别
1.tf.multiply()实现的是元素级别的相乘,也就是两个相乘的数元素各自相乘,而不是矩阵乘法. 返回Tensor
2.tf.matmul()将矩阵a乘以矩阵b,生成a * b 返回Tensor
np.dot 与 np.matmul 区别
1.二者都是矩阵乘法。 2.np.matmul中禁止矩阵与标量的乘法。 3.在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。
##tf 输入输出
decode_csv
tf.decode_csv(records, record_defaults, field_delim=None, name=None)
- 首先records为reader读到的内容,这里为CSV (TXT)的一行。一般一行里面的值会用逗号或者空格隔开,
- 这里第三个输入参数就是指定用什么来进行分割,默认为逗号。
- 第二个输入参数是指定分割后每个属性的类型,比如分割后会有三列,那么第二个参数就应该是[[‘int32’], [], [‘string’]], 可见不指定类型(设为空[])也可以。
- 如果分割后的属性比较多,比如有100个,可以用[ [] *100 ]来表示, 返回的col是长度为100的list。
- col= tf.decode_csv(records, record_defaults=[ [ ] * 100 ], field_delim=‘ ’, name=None)
###循环读取
match_data_path = tf.train.match_filenames_once(data_path + "/*.json" )
filename_queue = tf.train.string_input_producer(match_data_path, num_epochs=1)
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
try:
while True:
name, line = sess.run([key, value])
sample = self._process_line(line, train)
if sample is not None:
data_set.append(sample)
except tf.errors.OutOfRangeError:
self.logger.info('finish reading data path[{}]'.format(data_path))
coord.request_stop()
coord.join(threads)
##tf 常见问题
tf tensor shape里面的问号
It means that first dimension is not fixed in the graph and it can vary between run calls
###ValueError: setting an array element with a sequence.
- 原因: 因为feed_dict里面的key是placeholder, 而value需要是list. 因此如果feed_dict的value是numpy的array, 需要首先转为list(narray)
Tensorboard could not bind to unsupported address family ::
tensorboard --logdir=/tmp/mnist/log/ --port 51691 --post 本机ip
AttributeError: seq_length
word2vec basic 使用
明文embedding转换成distance程序使用的bin格式
import numpy as np
import struct
import sys
if len(sys.argv) < 3:
print "Usage: python ./convert_txt_to_bin.py infile outfile sep"
sys.exit(-1)
infile = sys.argv[1]
outfile = sys.argv[2]
sep = ","
if len(sys.argv) > 3:
sep = sys.argv[3]
index = 0
token2id = {}
id2token = {}
embeddings = {}
with open(infile, "r") as f1:
for line in f1:
sp = line.rstrip('\n').split(sep)
word = sp[0]
embed = sp[1].split(',')
token2id[word] = index
id2token[index] = word
embeddings[index] = []
for i,v in enumerate(embed):
if len(v) < 1:
break
embeddings[index].append(float(v))
index += 1
with open(outfile, "wb") as f:
n_input = len(embeddings[0])
f.write(str(len(embeddings))+" "+str(n_input))
for i in range(len(embeddings)):
f.write(id2token[i]+" ")
vec = embeddings[i]
s = struct.pack('f'*len(vec), *vec)
f.write(s)
