源:http://www.tensorfly.cn/tfdoc/tutorials/mnist_pros.html
数据集:http://www.tensorfly.cn/tfdoc/tutorials/mnist_download.html
import tensorflow as tf
import input_data
minist = input_data.read_data_sets("MNIST_data/",one_hot=True)
#y = tf.nn.softmax(wx+b)
x=tf.placeholder("float",[None,28*28])
x_=tf.reshape(x,[-1,28,28,1])
def conv(x):
#卷积1
with tf.variable_scope('conv1'):
w=tf.get_variable('weight',[5,5,1,32],initializer = tf.truncated_normal_initializer(stddev=0.1))
b=tf.get_variable('bias',[32],initializer = tf.truncated_normal_initializer(stddev=0.1))
conv1 = tf.nn.conv2d(x,w,strides=[1,1,1,1],padding="SAME")
badd = tf.nn.bias_add(conv1,b)
relu1 = tf.nn.relu(badd)
with tf.name_scope("pool1"):
pool1 = tf.nn.max_pool(relu1,[1,2,2,1],strides=[1,2,2,1],padding="SAME")
#卷积2
with tf.variable_scope('conv2'):
w=tf.get_variable('weight',[5,5,32,64],initializer = tf.truncated_normal_initializer(stddev=0.1)) #名不同
b=tf.get_variable('bias',[64],initializer = tf.truncated_normal_initializer(stddev=0.1))
conv2 = tf.nn.conv2d(pool1,w,strides=[1,1,1,1],padding="SAME")
badd = tf.nn.bias_add(conv2,b)
relu2 = tf.nn.relu(badd)
with tf.name_scope("pool2"):
pool2 = tf.nn.max_pool(relu2,[1,2,2,1],strides=[1,2,2,1],padding="SAME")
#展平
t=tf.reshape(pool2,[-1,7*7*64])
return t
#全连接层1
w=tf.Variable(tf.truncated_normal([7*7*64,1024],stddev=0.1))
b=tf.Variable(tf.truncated_normal(stddev=0.1,shape=[1024]))
x_flat = conv(x_)
relu1 = tf.nn.relu(tf.matmul(x_flat,w)+b)
#drop
keep_prob= tf.placeholder("float")
h_drop = tf.nn.dropout(relu1,keep_prob)
#全连接层2
w2=tf.Variable(tf.truncated_normal([1024,10],stddev = 0.1))
b2=tf.Variable(tf.truncated_normal(stddev=0.1,shape=[10]))
y=tf.nn.softmax(tf.matmul(h_drop,w2)+b2 ) #** w,b
y_=tf.placeholder("float",[None,10])
loss = -tf.reduce_sum(y_*tf.log(y))
train = tf.train.GradientDescentOptimizer(1e-4).minimize(loss) #学习率不同,导致错
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(20000):
batch_xs,batch_ys = minist.train.next_batch(50)
sess.run(train,feed_dict={x:batch_xs,y_:batch_ys,keep_prob: 0.5})
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={ x:batch_xs, y_: batch_ys, keep_prob: 1.0})
print ("step %d, training accuracy %g"%(i, train_accuracy))
correct_predict = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_predict,"float"))
print(sess.run(accuracy,feed_dict={x:minist.test.images,y_:minist.test.labels}))
主要流程如下
图片输入->[卷积,池化]->[卷积,池化】->全连接层1024个隐藏结点->全连接层10个结点->softmax输出
卷积层:提取图片的特征,如下图,随着卷积层的进行,图像的特征,即下图的深度不断的加深
池化层:对卷积后的数据量进行缩小,如下图:池化层后,图像规格减半
drop:正则化,原于处理过拟合