和上一篇文章所说的常量(tf.constant)的使用场景不同,在很多的时候,我们最开始是无法给出一个初始值的,这个值必须后面(定义完模型后)动态赋上,这就要使用类似变量的功能--占位符。事实上,很多高级语言都会有变量,如变量x,我们会让变量有不同的类型,比如整形,字符串等等。但是很不幸,tensorflow不能直接使用这些变量,原因其实很简单,在tensorflow里头,实际是一个预定义模型,然后再进行大量计算的。所以,这也就是一系列的模型占位符,而这些占位符和传统的变量有一个很大的功能区别,就是这些占位符,不仅仅是后续代表一个具体的值,更重要的是,要用这个占位符去创建一个模型。
placeholer就是可以起到类似的作用,当然他和后面所说的真正的变量还是有区别的,这个一会说道变量的时候再说。
x = tf.placeholder(tf.string) y = tf.placeholder(tf.int32) z = tf.placeholder(tf.float32)with tf.Session() as sess: output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67})
看,这既是占位符的定义方式,他是可以在后面session中在用字典方式给其赋值的。
和占位符类似,另外一个就是真正的变量了,和占位符不同,他的含义是,其值在训练过程中是不断变化的。
x = tf.Variable(5)
刚刚也说道,占位符很大一个作用是建立模型的,那么模型是什么呢,怎么建立?
说白了,模型就是一系列的数学式子,想必大家也俩想到了,这些式子是为了建立模型的,而不是在建立模型的那一句上直接运行的。所以,模型和占位符一样,模型中使用的所有数学运算都不能用高级语言直接的运算符号,因为那样就真的直接运算了,而不是建立模型,我们看看简单的:
x = tf.subtract(10, 4) # 6 y = tf.multiply(2, 5) # 10
这就是简单的加法和乘法,注意乘法是点积,不是矩阵乘法。
好变量有了,那对变量还有一类重要的操作,就是初始化,对于机器学习,尤其是对weight的初始化是尤其重要的,这个之前的文章详细描述过,不熟悉的同学,出门左转,记得看看。
init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init)
上面tf.global_variables_initializer()是可以对全局的所有变量进行初始化的。
n_features = 120 n_labels = 5 weights = tf.Variable(tf.truncated_normal((n_features, n_labels)))
而这句话是可对变量进行“正规化”。
n_labels = 5 bias = tf.Variable(tf.zeros(n_labels))
这句话,可以赋予0这个初值。
我们来实际看个例子,训练线性预测的式子:Y=WX+B
这个例子是简化版的数字识别,值识别0到3的数据,使用的数据集还是著名的:MNIST数据集。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from quiz import get_weights, get_biases, linear
def mnist_features_labels(n_labels):
mnist_features = []
mnist_labels = []
mnist = input_data.read_data_sets('/datasets/ud730/mnist', one_hot=True)
for mnist_feature, mnist_label in zip(*mnist.train.next_batch(10000)):
if mnist_label[:n_labels].any():
mnist_features.append(mnist_feature)
mnist_labels.append(mnist_label[:n_labels])
return mnist_features, mnist_labels
# 输入的特征 (28*28 的图片特征输入就有784个features)
n_features = 784
# 结果的特征词数量
n_labels = 3
# 定义输入输出
features = tf.placeholder(tf.float32)
labels = tf.placeholder(tf.float32)
# 定义要学习的Weights and Biases
w = get_weights(n_features, n_labels)
b = get_biases(n_labels)
# 线性方程 xW + b,这个就是模型啦
logits = linear(features, w, b)
# 获取训练数据
train_features, train_labels = mnist_features_labels(n_labels)
with tf.Session() as session:
session.run(tf.global_variables_initializer())
# Softmax,作为输出结果的activation function
prediction = tf.nn.softmax(logits)
# 计算交叉熵作为lost function
cross_entropy = -tf.reduce_sum(labels * tf.log(prediction), reduction_indices=1)
# 计算loss
loss = tf.reduce_mean(cross_entropy)
# 梯度下降的比率
learning_rate = 0.08
# 进行梯度下降计算
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# 开始真正计算
_, l = session.run(
[optimizer, loss],
feed_dict={features: train_features, labels: train_labels})
# 打印出损失值
print('Loss: {}'.format(l))
这还不算是真正的训练实操,只是逐步说明了tensorflow的基本操作原理。
后面会慢慢的给上实际的操作,当然一直到CNN为止。
机器学习实操和理论都是同等重要的,所以,如果入门的同学,还是希望能关注头条号,从一开始的第一篇开始,基本的原理基础还是非常重要的。