双层简单神经网络demo

#Mnist数据集 属性已经写好 可以直接调用
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
 
#one_hot=True 表示对label进行one-hot编码,比如标签4可表示为[0,0,0,0,1,0,0,0,0,0,0]
mnist = input_data.read_data_sets('data/',one_hot=True)
numClass = 10
inputSize = 784
numHiddenUnits = 50  			#隐藏层50个单元
trainingIterations = 10000
batchSize = 100			#每次训练在训练集中取batchsize个样本训练
			
#加了一个隐层
numHiddenUnitsLayer2 = 100
trainingIterations = 10000

X = tf.placeholder(tf.float32,shape = [None,inputSize])
y = tf.placeholder(tf.float32,shape = [None,numClass])

#参数初始化
W1 = tf.Variable(tf.truncated_normal([inputSize,numHiddenUnits],stddev=0.1))
B1 = tf.Variable(tf.constant(0.1),[numHiddenUnits])
W2 = tf.Variable(tf.truncated_normal([numHiddenUnits,numHiddenUnitsLayer2],stddev=0.1))
B2 = tf.Variable(tf.constant(0.1),[numHiddenUnitsLayer2])
W3 = tf.Variable(tf.truncated_normal([numHiddenUnitsLayer2,numClass],stddev=0.1))
B3 = tf.Variable(tf.constant(0.1),[numHiddenUnits])

#网络结构
hiddenLayerOutput = tf.matmul(X,W1) + B1			#隐藏层
hiddenLayerOutput = tf.nn.relu(hiddenLayerOutput)	#添加**函数relu
hiddenLayer2Output = tf.matmul(hiddenLayerOutput,W2) + B2
hiddenLayer2Output = tf.nn.relu(hiddenLayer2Output)
finalOutput = tf.matmul(hiddenLayer2Output,W3) + B3	#中间层
finalOutput = tf.nn.relu(finalOutput)				#添加**函数relu

#网络迭代 不变
#损失值。指定tf.nn.softmax_cross_entropy_with_logits模块下交叉熵损失函数,labels为数据中的真实值,logits为预测值
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels = y,logits = finalOutput))
#指定优化器,最小化损失函数
opt = tf.train.GradientDescentOptimizer(learning_rate = .1).minimize(loss)
#通过当前结果计算精度
correct_prediction = tf.equal(tf.argmax(finalOutput,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float32"))

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

for i in range(trainingIterations):
	batch = mnist.train.next_batch(batchSize)
	batchInput = batch[0]
	batchLabels = batch[1]
	_,trainLoss = sess.run([opt,loss],feed_dict={X:batchInput,y:batchLabels})
	if i%1000 == 0:
		trainAccuracy = accuracy.eval(session=sess,feed_dict={X:batchInput,y:batchLabels})
		print("step %d , training accuracy %g"%(i,trainAccuracy))		

 效果

双层简单神经网络demo

可以看出双层神经网络比单层神经网络的效果好。