基于tensorflow实现的简单卷积网络(CNN)

本文介绍了一种基于TensorFlow的卷积神经网络(CNN)模型,用于MNIST手写数字识别任务。该模型包括两个卷积层、一个全连接层、一个Dropout层和一个SoftMax输出层。通过训练,模型在测试集上达到了99.34%的准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该网络有两个卷积层(将池化层包含在卷积层中),一个全连接层,一个dropout层和一个输出层(SoftMax层)。测试集上面运行结果是99.34%。

实现卷积神经网络的步骤:

第一:定义算法公式,也就是神经网络的前向计算

第二:定义loss,选定优化器,并指定优化loss

第三;迭代地对数据进行训练

第四:在测试集或验证集上对评价指标进行评测

代码:

# -*- coding: utf-8 -*-

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 下载数据,若有就不用下载
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess=tf.InteractiveSession()

# 由于卷积神经网络会有很多的权重和偏置需要创建,为实现代码复用就创建了初始化函数
def weight_variable(shape):
    initial=tf.truncated_normal(shape=shape,stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial=tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

# 卷积层和池化层都要重复使用,因而我们也定义函数来实现创建
def conv2d(x,W):
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')

def max_pool(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

#定义输入的placeholder,需要提取空间结构,因而需要将1D的输入向量转为2D的图片结构
x=tf.placeholder(tf.float32,shape=[None,784])
y_=tf.placeholder(tf.float32,shape=[None,10])
x_image=tf.reshape(x,shape=[-1,28,28,1])

#定义第一个卷积层(将池化层也包含在卷积层内的)
w_conv1=weight_variable([5,5,1,32])
b_conv1=bias_variable([32])
h_conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
h_pool1=max_pool(h_conv1)

# 定义第二个卷积层
w_conv2=weight_variable([5,5,32,64])
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)
h_pool2=max_pool(h_conv2)

# 定义全连接层(全连接执行前将卷积层输出的2Dfeature map 转为1D向量,然后再全连接,隐含节点为1024)
w_fc1=weight_variable([7*7*64,1024])
b_fc1=bias_variable([1024])
h_pool2_reshape=tf.reshape(h_pool2,[-1,7*7*64])
h_fc1=tf.nn.relu(tf.matmul(h_pool2_reshape,w_fc1)+b_fc1)

# 为缓解过拟合,添加了一个dropout层
keep_prob=tf.placeholder(tf.float32)
h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob=keep_prob)

# 将dropout层的输出结果连接softmax实现分类
w_fc2=weight_variable([1024,10])
b_fc2=bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2)

# 定义损失函数并选择优化器
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv),reduction_indices=[1]))
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

# 定义评估指标
correct_prediction=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

# 开始训练过程
tf.global_variables_initializer().run()
for i in range(30000):
    batch=mnist.train.next_batch(50)
    if i%100==0:
        train_accuracy=sess.run(accuracy,feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
        print "step %d,training accuracy %g"%(i,train_accuracy)
    sess.run(train_step,feed_dict={x:batch[0],y:batch[1],keep_prob:0.5})

# 打印输出测试结果
print "test accuracy %g"%sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值