使用tensorflow框架和python,学习实现简单的CNN网络,并进行调参,代码如下:
#! /usr/bin/python
# -*- coding:utf-8 -*-
import tensorflow as tf
from tinyenv.flags import flags
from tensorflow.examples.tutorials.mnist import input_data
FLAGS = None
def train():
#读取数据
mnist = input_data.read_data_sets(FLAGS.data_dir,
one_hot = True,
fake_data = FLAGS.fake_data)
sess = tf.InteractiveSession()#可在运行图时插入计算图
with tf.name_scope('input'):#命名空间函数,输入
x = tf.placeholder(tf.float32,[None,784],name = 'x-input')
y_ = tf.placeholder(tf.float32,[None,10],name = 'y-input')
with tf.name_scope('input_reshape'):#reshape
image_shaped_input = tf.reshape(x,[-1,28,28,1])
tf.summary.image('input',image_shaped_input,10)#记录 可视化
def weight_variable(shape):
#权重变量,并初始化
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
#偏置变量,并初始化
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
def variable_summaries(var):#可视化记录
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean)#scalar显示标量信息
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
tf.summary.scalar('stddev', stddev)
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.scalar('min', tf.reduce_min(var))
tf.summary.histogram('histogram', var) #显示训练过程中变量的分布情况
def nn_layer(input_tensor,input_dim,output_dim,layer_name,act = tf.nn.relu):
#layer_name设置
with tf.name_scope(layer_name):#权重变量,并记录
with tf.name_scope('weight'):
weights = weight_variable([input_dim,output_dim])
variable_summaries(weights)
with tf.name_scope('biases'):#偏置
biases = weight_variable([output_dim])
variable_summaries(biases)
with tf.name_scope('wx+b'):#xw+b
preactivate = tf.matmul(input_tensor,weights) + biases
tf.summary.histogram('pre_activations', preactivate)
activations = act(preactivate, name='activation')#relu激活
tf.summary.histogram('activations', activations)
return activations
hidden1 = nn_layer(x,784,500,'layer1')#隐层
with tf.name_scope('dropout'):#定义dropout
keep_prob = tf.placeholder(tf.float32)
droped = tf.nn.dropout(hidden1,keep_prob)
y = nn_layer(droped,500,10,'layer2',act = tf.identity)#输出层
with tf.name_scope('cross_entropy'):#交叉熵
diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
with tf.name_scope('total'):
cross_entropy = tf.reduce_mean(diff)
tf.summary.scalar('cross_entropy', cross_entropy)
with tf.name_scope('train'):#train
train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(
cross_entropy)
with tf.name_scope('accuracy'):#正确率
with tf.name_scope('correct_prediction'):
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
with tf.name_scope('accuracy'):
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/test')
tf.global_variables_initializer().run()
def feed_dict(train):#feed_dict
if train or FLAGS.fake_data:
xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
k = FLAGS.dropout
else:
xs, ys = mnist.test.images, mnist.test.labels
k = 1.0
return {x: xs, y_: ys, keep_prob: k}
for i in range(FLAGS.iterations):
if i % 10 == 0: # Record summaries and test-set accuracy
summary, acc = sess.run(
[merged, accuracy], feed_dict=feed_dict(False))
test_writer.add_summary(summary, i)
print('Accuracy at step %s: %s' % (i, acc))
else:
if i % 100 == 99:
run_options = tf.RunOptions(
trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
summary, _ = sess.run([merged, train_step],
feed_dict=feed_dict(True),
options=run_options,
run_metadata=run_metadata)
train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
train_writer.add_summary(summary, i)
else:
summary, _ = sess.run(
[merged, train_step], feed_dict=feed_dict(True))
train_writer.add_summary(summary, i)
train_writer.close()
test_writer.close()
def main(_):
if tf.gfile.Exists(FLAGS.log_dir):
tf.gfile.DeleteRecursively(FLAGS.log_dir)
tf.gfile.MakeDirs(FLAGS.log_dir)
train()
if __name__ == '__main__':
FLAGS = flags()
tf.app.run(main=main, argv=[sys.argv[0]])