在学习Coursera上MOOC时用到了TensorFlow,之前对这个内容不是很熟悉,这里稍微总结一些基本概念及其使用。

其实之前也看过TensorFlow,但是不是很理解其运作过程,直到MOOC中讲到计算图的时候总算是理解了,先看一个计算图:

我对TensorFlow的理解是TensorFlow先给出计算图的架构(tf.placeholder),将要计算的参数定义为变量(tf.get_variable),然后定义损失函数以及训练方法,注意这些步骤并没有涉及到实际运算,只是把上述计算图及一些相关量搭建好,等这个步骤完成之后,我们再喂入数据进行训练即可,具体流程如下:

来看一个例子,该例子来自于Coursera上Introduction to Deep Learning第二周的内容,这个例子是有关MNIST数据集手写数字识别,这里只给出部分重要的代码。

s = tf.InteractiveSession()
D = 784
### YOUR CODE HERE ### tf.placeholder(...) for flat X with shape[0] = None for any batch size
input_X = tf.placeholder(tf.float32, shape=(None, D))

### YOUR CODE HERE ### tf.placeholder(...) for one-hot encoded true labels
input_y = tf.placeholder(tf.float32, shape=(None, 10))

input_X是输入,input_y是输出,这部分使用的代码是tf.placeholder,shape参数给出了数据的维度,tf.float32给出了数据类型,这段代码相当于画出了计算图的输入和输出节点。

接着看参数部分:

### YOUR CODE HERE ### tf.get_variable(...) with shape[0] = 784
W = tf.get_variable("W", shape=(D, 10), dtype=tf.float32)
### YOUR CODE HERE ### tf.get_variable(...)
b = tf.get_variable("b", shape=(1, 10), dtype=tf.float32)

因为W,b是参数,所以这部分使用的代码是tf.get_variable,”W”,”b”表示参数的名字,shape表示参数的维度,dtype表示数据类型。

接下来看前向传播:

### YOUR CODE HERE ### logits for input_X, resulting shape should be [input_X.shape[0], 10]
logits = input_X @ W + b
### YOUR CODE HERE ### apply tf.nn.softmax to logits
probas = tf.nn.softmax(logits)
### YOUR CODE HERE ### apply tf.argmax to find a class index with highest probability
classes = tf.argmax(probas, axis = 1)

第一个代码是给出了计算式,给出了计算图中输入层和输出层的关系,我们对计算出的结果使用激活函数tf.nn.softmax得到概率,tf.argmax(probas, axis = 1)的意思是找到概率最大的分类。

最后看反向传播:

### YOUR CODE HERE ### cross-entropy loss
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=input_y, logits=logits))

# Use a default tf.train.AdamOptimizer to get an SGD step
### YOUR CODE HERE ### optimizer step that minimizes the loss
step = tf.train.AdamOptimizer().minimize(loss)

这步定义了损失函数loss以及训练步骤step。

上述几步定义了整个计算图,最终训练数据使用的代码如下:

s.run([step, loss], {input_X: data1, input_y: data2})

上述例子是单层的,再来看个多层的例子,如果自己一层一层定义每层,那么容易出错,还好TensorFlow给出了tf.layers.dense函数,来看一下:

input_X = tf.placeholder(tf.float32, shape=(None, D))
input_y = tf.placeholder(tf.float32, shape=(None, 10))

hidden1 = tf.layers.dense(input_X, 256, activation=tf.nn.sigmoid)
hidden2 = tf.layers.dense(hidden1, 256, activation=tf.nn.sigmoid)
logits = tf.layers.dense(hidden2, 10, activation=None)

#结果
probas = tf.nn.softmax(logits)
classes = tf.argmax(probas, axis = 1)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=input_y, logits=logits))
step = tf.train.AdamOptimizer().minimize(loss)

tf.layers.dense(input_X, 256, activation=tf.nn.sigmoid)的第一个参数为为输入层,第二个参数为输出层的节点个数,第三个参数为激活函数,可以看到,用上述方式可以很方便地搭建出计算图进行计算。