语音识别学习日志 2018-7-24 [MLP实践(MNIST数据集)]

今天实现了一下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]]

扫描二维码关注公众号,回复: 2755752 查看本文章

求和:

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

猜你喜欢

转载自blog.csdn.net/u013569304/article/details/81189771