Contents
常用函数和类型
张量(Tensor)
可以用多维数组来理解,它有维度(shape)和类型(dtype)两个属性。类型的常用取值有 tf.float32、tf.int32 等。
-
常量
123# 常量初始化以后就不能更改了,下面是一个一维的常量(有三个元素),其中1.表示1.0t1 = tf.constant([1., 2., 3.], dtype=tf.float32) -
变量
123456789# 变量用来表示模型的参数,会随着训练不断变化t2 = tf.Variable([.1], dtype=tf.float32)"""注意区分tf.Variable([10,10])和tf.zeros([10,10]):前者表示2个整数10和10(形状为2),后者表示10×10的二维张量(形状为10×10,值全部为0)"""w = tf.Variable(tf.zeros([10,10])) # w一般用来表示权重b = tf.Variable(tf.zeros([10])) # b一般用来表示-阈值 -
占位符(placeholder)
123456# 占位符用来接收数据集的输入,就像空的托盘一样,每次把一个batch的训练数据放在上面# 我们一般用x变量来表示接收样本的输入,None表示该维度不是固定的,因为一个batch可以接受不固定数量的训练样本x = tf.placeholder(tf.float32,[None, 500])# 这里用y_变量来表示正确的标签,而用y变量表示网络计算得到的估计值,y和y_之间的差距就称之为lossy_ = tf.placeholder(tf.float32,[None, 10]) -
张量的输出
12345# 使用print来输出张量的shape和dtype信息print(t2)# 使用sess.run(需要先初始化session)来运行并输出张量的数据,feed_dict用来给占位符填充数据,keep_prob表示每个连接有多大概率被去除,一般训练时取0.5-0.75(用来防止过拟合),测试时取1sess.run([optimizer, loss], feed_dict={x: batch_x, y_: batch_y, keep_prob: 0.75})
常用张量运算
-
tf.reshape()
123# 保持原来的数据不变,改变张量的shape,调用该函数必须保证调整后的每个维度都是整数x_image = tf.reshape(x, [-1, 4, 10]) # -1表示该维度会自动调整,如原来是80维的向量就会变成2*4*10 -
tf.cast()
123# 用来做类型转换,保持数据不变,改变张量的dtypetf.cast(correct_pred, tf.float32) -
tf.argmax()
123# 返回最大数值的下标,第二个参数表示在第几个维度中找,一般用来找到概率中最大的一个max_idx_l = tf.argmax(tf.reshape(y_, [-1, 4, CHAR_SET_LEN]), 2) # 在CHAR_SET_LEN中找数值最大的返回其下标 -
tf.equal()
123# 对比两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的tf.equal(A, B) -
tf.reduce_mean()
1234# 在某个维度上求平均值,如果不设置维度,则求所有数据的平均值tf.reduce_mean(x) # 求x所有数据的平均值(只返回一个结果)tf.reduce_mean(x, 0) # 求x在0维上的平均值 -
tf.reduce_sum()
1234# 在某个维度上求和,如果不设置维度,则求所有数据的和tf.reduce_mean(x) # 求x所有数据的和(只返回一个结果)tf.reduce_mean(x, 0) # 求x在0维上的和
随机数
-
tf.random_normal()
123# 生成一些随机数,这些随机数会服从均值(mean)为0,标准差(stddev)为1的正态分布。当然你也可以自己指定均值和标准差。t = tf.random_normal([5, 3],mean=0.5) 生成5*3个随机数
激活函数
-
tf.nn.relu()
1234# 计算线性整流函数值# x<0 时,y=0, x>=0 时,y=xy = tf.nn.relu(x) -
tf.sigmod()
12345# 计算sigmod函数值# y = 1 / (1 + exp(-x))# tf.sigmod(0.) 值为0.5y = tf.sigmod(x) -
tf.nn.softmax()
1234# 将概率使用softmax函数归一化,# softmax[i, j] = exp(logits[i, j]) / sum(exp(logits[i]))y = tf.nn.softmax(x)
loss函数
-
softmax_cross_entropy_with_logits()
123# softmax交叉熵损失loss = tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_) -
sigmoid_cross_entropy_with_logits()
123# sigmod交叉熵损失loss = tf.nn.tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_)
优化器
-
GradientDescentOptimizer()
123# 梯度下降优化器optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss) -
AdamOptimizer()
123# 自适应矩估计优化器optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
硬件设置
-
动态分配GPU显存
1234config = tf.ConfigProto(allow_soft_placement=True)config.gpu_options.allow_growth=Truesess = tf.Session(config=config)
一个demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# MNIST数据集训练 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) in_units = 784 # 输入层神经元数目 h_units = 300 # 隐藏层神经元数目 out_units = 10 # 输出层神经元数目 # 图片输入 x = tf.placeholder(tf.float32, [None, in_units]) w_1 = tf.Variable(tf.truncated_normal([in_units, h_units], stddev=0.1)) # 权重1 b_1 = tf.Variable(tf.zeros([h_units])) # 偏移1 keep_prob = tf.placeholder(tf.float32) # drop_out h = tf.nn.relu(tf.matmul(x, w_1) + b_1) # 隐藏层输出 h_dropout = tf.nn.dropout(h, keep_prob) # 隐藏层drop_out后输出 w_2 = tf.Variable(tf.zeros([h_units, out_units])) # 权重2 b_2 = tf.Variable(tf.zeros(out_units)) # 偏移2 logits = tf.matmul(h_dropout, w_2) + b_2 # 输出层输出 y = tf.nn.softmax(logits) # softmax函数处理(转换成概率) y_ = tf.placeholder(tf.float32, [None, out_units]) # label的输入 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=logits)) # 交叉熵损失,相当于 tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) optimizer = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy) # Adagrad优化器,学习率为0.3 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 初始化全局变量 correct = tf.equal(tf.arg_max(y, 1), tf.arg_max(y_, 1)) # 正确的矩阵(正确为1 错误为0) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) # 正确率 for i in range(3001): xs, ys = mnist.train.next_batch(100) # 每个batch有100张图片数据 _, loss = sess.run([optimizer, cross_entropy], feed_dict={x: xs, y_: ys, keep_prob: 0.75}) # 训练 print(i, loss) acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}) # 训练完3000个iterators后,计算测试集的准确率 print('final:%f' % acc) |
模型的保存和载入
模型的保存
1 2 3 4 |
tf.add_to_collection('network-output', y) # 如果不加这句话 测试的时候需要y的定义,也就是整个模型的源码 saver = tf.train.Saver() saver.save(session, 'checkpoint/test') |
模型的加载
1 2 3 4 5 6 7 8 |
saver = tf.train.Saver() # 有模型的源码 saver.restore(sess, tf.train.latest_checkpoint('checkpoint')) # 没有模型源码,从meta文件加载 saver = tf.train.import_meta_graph('checkpoint/test.meta') saver.restore(session, 'checkpoint/test') # .data文件 y = tf.get_collection('network-output')[0] |
相关链接
一个很好的介绍 https://blog.csdn.net/geyunfei_/article/details/78782804
一个博客 http://blog.topspeedsnail.com/archives/10858
莫烦TensorFlow https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/
中文api文档 http://www.tensorfly.cn/tfdoc/api_docs/python/nn.html
官方英文api文档 https://www.tensorflow.org/api_docs/python/tf/constant
中文文档 https://www.w3cschool.cn/tensorflow_python/tensorflow_python-efts28tw.html