1、因为交叉熵一般会与softmax回归一起使用,所以TensorFlow对这两个功能进行了统一的封装,并提供了tf.nn.softmax_cross_entropy_with_logits函数。比如可以直接通过下面的代码来实现使用了softmax回归之后的交叉熵损失函数:
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y, y_) # 其中y为预测值,y_为真实值
这样通过一个命令就可以得到使用了Softmax回归之后的交叉熵。
在只有一个正确答案的分类问题中,tensorflow提供了tf.nn.sparse_softmax_cross_entropy_with_logits函数来进一步加速计算过程。
2、TensorFlow中训练一个卷积神经网络的流程和训练一个全连接网络没有任何区别,卷积神经网络和全连接网络的唯一区别就是在于神经网络中相邻两层的链接方式。(全连接层相邻两层之间的节点都有边的链接,于是一般会将每一层全连接层中的节点组织成一列,这样方便显示链接结构;而对于卷积神经网络,相邻两层之间只有部分节点相连,为了展示每层神经元的维度,一般会将每层卷积层的节点组织成一个三维矩阵)
3、卷积层结构的前向传播过程就是通过将一个过滤器从神经网络当前层的左上角移动到右下角,并且在移动中计算每一个对应单位矩阵得到的值。
所以当过滤器的大小不为1*1时,卷积层的前向传播得到的矩阵尺寸要小于当前层矩阵的尺寸。
在卷积神经网络中,每一个卷积层中使用的过滤器中的参数都是一样的。这是卷积神经网络一个非常重要的性质。
假设输入层矩阵的维度是32*32*3,假设第一层卷积层使用尺寸为5*5,深度为16的过滤器,那么这个卷积层的参数个数为5*5*3*16+16=1216个,远小于全连接层的参数个数。
而且卷积层的参数个数和图片的大小无关,它只和过滤器的尺寸、深度以及当前层节点矩阵深度有关。这使得卷积神经网络可以很好的扩展到更大的图像数据上。
4、通过tf.get_variable的方式创建过滤器的权重变量和偏置变量:
权重变量:filter_weight = tf.get_variable('weights', [5,5,3,16],initializer=tf.truncated_normal_initializer(stddev=0.1)) #前两个维度代表了过滤器的尺寸,第三个维度表示当前层的深度,第四个维度表示过滤器的深度。
偏置变量:biases = tf.get_variable('biases', [16], initializer=tf.contant_initializer(0.1))
5、tf.nn.conv2d提供了一个非常方便的函数来实现卷积层前向传播的算法。下面就来介绍一下这个函数:
这个函数的第一个输入为当前层 的节点矩阵。注意这个矩阵是一个四维的矩阵,后面三个维度对应一个节点矩阵,第一维对应一个输入batch。比如在输入层,input[0,:,:,:]表示第一张图片……
tf.nn.conv2d第二个参数提供了卷积层的权重,第三个参数为不同维度上的步长。虽然第三个参数提供的是一个长度为4的数组,但是第一维和最后一维的数字要求一定是1.这是因为卷积层的步长只对矩阵的长和宽有效。最后一个参数是填充(padding),TensorFlow中提供SAME或者VALID两种选择,其中SAME表示添加全0填充,VALID表示不添加。 conv = tf.nn.con2d(input, filter_weight, strides=[1,1,1,1], pading='SAME')
6、tf.nn.bias_add提供了一个方便的函数给每一个节点加上偏置项。(当深度为1时,偏置项只有一个数)
bias = tf.nn.bias_add(conv, biases)
# 将计算结果通过ReLU去线性化:actived_conv = tf.nn.relu(bias)