今天实现了一下MLP。先说几个函数的用法。
1、在最小化损失的时候,经常使用的一个函数就是tf.nn.softmax_cross_entropy_with_logits(logits=,labels=,name=None).除去name参数用以指定该操作的name,与方法有关的一共两个参数:
第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是
num_classes
第二个参数labels:实际的标签,大小同上。
tf.nn.sigmod_cross_entropy_with_logits(logits, labels, name=None)
tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None)
tf.nn.weighted_cross_entropy_with_logits(logits, labels, name=None)
这些函数的使用方法都类似。
2、tf.reduce_sum(,)
'x' is [[1, 1, 1]
[1, 1, 1]]
求和:
tf.reduce_sum(x) = 6
按列求和:
tf.reduce_sum(x, 0) = [2, 2, 2]
按行求和:
tf.reduce_sum(x, 1) = [3, 3]
按照行的维度求和:
tf.reduce_sum(x, 1, keep_dims=True) = [[3], [3]]
行列求和:
tf.reduce_sum(x, [0, 1]) = 6
3、tf.reduce_mean(,)
计算均值,使用方法和reduce_sum()类似。
4、
tf.train.AdamOptimizer(learning_rate)
tf.train.GradientDescentOptimizer(learning_rate)
tf.train.AdadeltaOptimizer(learning_rate)
tf.train.AdagradOptimizer(learning_rate)
tf.train.MomentumOptimizer(learning_rate)
tf.train.FtrlOptimizer(learning_rate)
tf.train.RMSPropOptimizer(learning_rate)
使用不同的方法优化参数。这些函数的主要参数就是学习率,其他的参数各不相同。
5、tf.equal(shape1,shape2)
比较两个向量或者两个矩阵对应位置的值是否相等,返回一个bool类型的向量或矩阵。
例子:
import tensorflow as tf
import numpy as np
A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
with tf.Session() as sess:
print(sess.run(tf.equal(A, B)))
输出[[True True True False False]]
6、tf.argmax(,)
在tf.argmax( , )中有两个参数,第一个参数是矩阵,第二个参数是0或者1。0表示的是按列比较返回最大值的索引,1表示按行比较返回最大值的索引。(其实第二个参数可以不只是0或者1,维度变高后比较难理解,也不常用,就不说了)
例子:
import tensorflow as tf
Vector = [1,1,2,5,3] #定义一个向量
X = [[1,3,2],[2,5,8],[7,5,9]] #定义一个矩阵
with tf.Session() as sess:
a = tf.argmax(Vector, 0)
b = tf.argmax(X, 0)
c = tf.argmax(X, 1)
print(sess.run(a))
print(sess.run(b))
print(sess.run(c))
输出:
3
[2 1 2]
[1 2 2]
下面是我参考TensorFlow给的官方样例实现的MLP,有一个问题就是计算LOSS值(__loss_cross_entropy )的时候,手动计算和使用tf.nn.softmax_cross_entropy_with_logits(logits=_logits, labels=__Y_true)计算对模型训练的结果影响很大。先上代码。
# coding:utf-8
'''
Multilayer Perceptron 多层感知机。
[MNIST Dataset](http://yann.lecun.com/exdb/mnist/)
参考 "https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/multilayer_perceptron.py"
项目地址:https://github.com/IMLHF/tensorflow_practice
'''
from __future__ import print_function
import tensorflow as tf
import numpy as np
# 加载MNIST数据集
from tensorflow.examples.tutorials.mnist import input_data
__mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# 模型训练相关参数
__learning_rate = 0.001
__training_epochs = 15
__batch_size = 100 # 每批训练数据的大小
__display_step = 1 # 每隔__display_step批次显示一次进度
# 神经网络参数
__n_hidden_1 = 256 # 隐层第一层神经元个数
__n_hidden_2 = 256 # 隐层第二层神经元个数
__n_input = 784 # 输入层维度,与MNIST数据集的输入维度对应(图片大小28*28,展开成784维向量)
__n_output = 10 # 输出层维度,与MNIST数据集的输出维度(分类个数)对应,数字(0-9)
# tensorflow Graph输入口
__X_input = tf.placeholder("float", [None, __n_input])
__Y_true = tf.placeholder("float", [None, __n_output])
# 定义网络中的权重和阈值(偏置)
__weights = {
'w_hidden_layer1': tf.Variable(tf.random_normal([__n_input, __n_hidden_1])),
'w_hidden_layer2': tf.Variable(tf.random_normal([__n_hidden_1, __n_hidden_2])),
'w_out': tf.Variable(tf.random_normal([__n_hidden_2, __n_output])),
}
__biases = {
'b_hidden_layer1': tf.Variable(tf.random_normal([__n_hidden_1])),
'b_hidden_layer2': tf.Variable(tf.random_normal([__n_hidden_2])),
'b_out': tf.Variable(tf.random_normal([__n_output])),
}
# 创建多层感知机模型(双隐层)
def multilayer_perceptron(__x_input_t):
__hidden_layer1 = tf.add(tf.matmul(__x_input_t, __weights['w_hidden_layer1']),
__biases['b_hidden_layer1'])
__hidden_layer2 = tf.add(tf.matmul(__hidden_layer1, __weights['w_hidden_layer2']),
__biases['b_hidden_layer2'])
___out_layer = tf.add(tf.matmul(__hidden_layer2, __weights['w_out']),
__biases['b_out'])
return ___out_layer
# 训练和测试
if __name__ == '__main__':
_logits=multilayer_perceptron(__X_input)
# # 使用softmax建立回归模型
# __out_softmax = tf.nn.softmax(_logits)
# # 使用交叉熵作为损失函数
# __loss_cross_entropy = -tf.reduce_sum(
# __Y_true*tf.log(tf.clip_by_value(__out_softmax,1e-13,1.0)))
__loss_cross_entropy = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(
logits=_logits, labels=__Y_true))
# 使用Adam算法优化模型
__train_op = tf.train.AdamOptimizer(
learning_rate=__learning_rate,).minimize(__loss_cross_entropy)
# 初始化变量
__init = tf.global_variables_initializer()
# 开始训练并测试
with tf.Session() as __session_t:
__session_t.run(__init)
for epoch in range(__training_epochs):
__avg_lost = 0
__total_batch = int(__mnist.train.num_examples/__batch_size)
for i in range(__total_batch):
__x_batch, __y_batch = __mnist.train.next_batch(__batch_size)
__nouse, __loss_t = __session_t.run([__train_op, __loss_cross_entropy],
feed_dict={__X_input: __x_batch,
__Y_true: __y_batch})
__avg_lost += float(__loss_t)/__total_batch
if epoch % __display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "Avg_Loss=", __avg_lost)
print("Optimizer Finished!")
# 测试模型
__predict = tf.nn.softmax(multilayer_perceptron(__X_input))
__correct = tf.equal(tf.argmax(__predict, 1), tf.argmax(__Y_true, 1))
__accuracy_rate = tf.reduce_mean(tf.cast(__correct, tf.float32))
print("Accuracy:", __session_t.run(__accuracy_rate,
feed_dict={__X_input: __mnist.test.images,
__Y_true: __mnist.test.labels}))
下面这幅图是使用
__loss_cross_entropy = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=_logits, labels=__Y_true))
计算Loss的训练结果,正确率在90%左右。
最后这幅图是使用
# 使用softmax建立回归模型
__out_softmax = tf.nn.softmax(_logits)
# 使用交叉熵作为损失函数
__loss_cross_entropy = -tf.reduce_sum(__Y_true*tf.log(tf.clip_by_value(__out_softmax,1e-13,1.0)))
计算Loss的训练结果,正确率很低,而且输出的平均损失Avg_Loss差别很大。
如果哪位大佬知道为什么,或者我哪一步写的不对,希望能指点一下233