我们依旧以 MNIST 手写字体数据集, 来看看我们如何使用 tensorflow 来实现 MLP.
数据
数据下载
这里我们通过 tensorflow 的模块, 来下载数据集.
- import tensorflow as tf
- import tensorflow.examples.tutorials.mnist.input_data as input_data
- mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
这样, 我们就下载了数据集, 这里的 one_hot 的意思是 label 为独热编码, 也就是说我们的 label 就不需要预处理了.
数据情况
我们通过下面代码看看数据的情况:
55000 训练集
5000 验证集
10000 测试集
MLP 模型
之前我们使用过 keras 进行训练, 只需要建立一个 model, 然后 add 加入神经网络层. tensorflow 是要复杂很多, 那我们一步步构建我们的模型吧.
首先是输入层, 我们用 placeholder 来输入
隐含层 256 个神经元
输出 10 个神经元
- def layer(output_dim,input_dim,inputs, activation=None):
- W = tf.Variable(tf.random_normal([input_dim, output_dim]))
- b = tf.Variable(tf.random_normal([1, output_dim]))
- XWb = tf.matmul(inputs, W) + b
- if activation is None:
- outputs = XWb
- else:
- outputs = activation(XWb)
- return outputs
- x = tf.placeholder("float", [None, 784])
- h1=layer(output_dim=256,input_dim=784,
- inputs=x ,activation=tf.nn.relu)
- y_predict=layer(output_dim=10,input_dim=256,
- inputs=h1,activation=None)
定义损失函数
这里我们需要自己定义函数, 并进行优化处理.
- y_label = tf.placeholder("float", [None, 10])
- loss_function = tf.reduce_mean(
- tf.nn.softmax_cross_entropy_with_logits
- (logits=y_predict ,
- labels=y_label))
- optimizer = tf.train.AdamOptimizer(learning_rate=0.001) \
- .minimize(loss_function)
准确性评价
- correct_prediction = tf.equal(tf.argmax(y_label , 1),
- tf.argmax(y_predict, 1))
- accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
训练
训练我们定义 15 轮.
- trainEpochs = 15
- batchSize = 100
- totalBatchs = int(mnist.train.num_examples/batchSize)
- epoch_list=[];loss_list=[];accuracy_list=[]
- from time import time
- startTime=time()
- sess = tf.Session()
- sess.run(tf.global_variables_initializer())
- for epoch in range(trainEpochs):
- for i in range(totalBatchs):
- batch_x, batch_y = mnist.train.next_batch(batchSize)
- sess.run(optimizer,feed_dict={x: batch_x,y_label: batch_y})
- loss,acc = sess.run([loss_function,accuracy],
- feed_dict={x: mnist.validation.images,
- y_label: mnist.validation.labels})
- epoch_list.append(epoch);loss_list.append(loss)
- accuracy_list.append(acc)
- print("Train Epoch:", '%02d' % (epoch+1), "Loss=", \
- "{:.9f}".format(loss),"Accuracy=",acc)
- duration =time()-startTime
- print("Train Finished takes:",duration)
测试加预测
来源: http://www.jianshu.com/p/4f3bcba42acf