在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。
之前写过一些关于深度学习的简单概念,最近这段时间会看一些代码相关的东西。
本文参考:
TensorFlow官方样例
一、前言
tensorflow相关的内容可以看之前实验室同学写的介绍
https://blog.youkuaiyun.com/wangyanbeilin/article/details/81108278
这两天实现的东西乱七八糟的,一点点整理出来。
下面是MNIST数据集在tensorflow上的实现,主要写的内容都在代码注释里了。用tensorflow实现还是很简单的。
三、代码实现
#导入3.x新功能,让python 2.x的代码,也需要在print后面加(),这里用于统一代码规范
from __future__ import print_function
#下载导入MNIST数据集,MNIST数据集被包括在tensorflow之中
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
import tensorflow as tf
#设置超参数(hyperparameters)
learning_rate = 0.001
training_epochs = 15
#一般使用256,128,64,32等存储大小,这里因为MNIST数据集一共55000个数据,用100可以整除,省去了mini_batch的余数部分batch的处理,用来简化操作
batch_size = 100
display_step = 1
#设定参数
n_h1 = 256
n_h2 = 256
#MNIST数据大小为28 * 28 = 784
n_x = 784 #输入层为784个神经元结点
n_y = 10
#创建占位符(placeholder)
X = tf.placeholder("float", [None, n_x])
Y = tf.placeholder("float", [None, n_y])
#初始化参数(权重)
parameters = {
"W1": tf.Variable(tf.random_normal([n_x, n_h1])),
"W2": tf.Variable(tf.random_normal([n_h1, n_h2])),
"W3": tf.Variable(tf.random_normal([n_h2, n_y]))
}
#初始化参数(偏置)
biases = {
"b1": tf.Variable(tf.random_normal([n_h1])),
"b2": tf.Variable(tf.random_normal([n_h2])),
"b3": tf.Variable(tf.random_normal([n_y]))
}
#Acc : 0.8901
#cost: 21.8285
"""""
这里也可以用个零向量来初始化偏置,代价函数初始值比随意量初始化的初值要低。可能因为其他的超参数也需要调优的原因,单独调整偏置之后的正确率反而下降了
biases = {
"b1": tf.Variable(tf.zeros([n_h1])),
"b2": tf.Variable(tf.zeros([n_h2])),
"b3": tf.Variable(tf.zeros([n_y]))
}
Acc : 0.878
cost: 22.4767
"""""
#建立MLP model
def multilayer_perceptron(x):
layer_1 = tf.add(tf.matmul(x, parameters['W1']), biases['b1'])
layer_2 = tf.add(tf.matmul(layer_1, parameters['W2']), biases['b2'])
out_layer = tf.add(tf.matmul(layer_2, parameters['W3']), biases['b3'])
return out_layer
#logits即为y-hat预测值
logits = multilayer_perceptron(X)
#计算损失
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels= Y))
"""
创建优化器,这里使用的是Adam优化器,常用的还有
tf.train.GradientDescentOptimizer(learning_rate) 梯度下降优化方法
tf.train.RMSPropOptimizer(learning_rate) RMSProp优化方法
"""
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
#优化模型,最小化损失
train_op = optimizer.minimize(loss_op)
#初始化变量
init = tf.global_variables_initializer()
#开始会话,tensorflow
with tf.Session() as sess:
sess.run(init)
for epoch in range(training_epochs):
avg_cost = 0.
#这里如果是64为一batch的话,还需要单独处理余数部分的数据
total_batch = int(mnist.train.num_examples / batch_size)
for i in range(total_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size)
_, c = sess.run([train_op, loss_op], feed_dict={X: batch_x, Y:batch_y})
avg_cost += c / total_batch
#因为迭代次数仅为15次,所以每次都输出损失,大规模训练可以隔几次输出
if epoch % display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "cost={:.9f}".format(avg_cost))
print('Optimization Finished')
#测试模型,用测试数据集来看模型的能力
pred = tf.nn.softmax(logits)
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print("Accuracy:", accuracy.eval({X: mnist.test.images, Y: mnist.test.labels}))