TensorFlow学习(四)
TensorFlow学习(四)CNN
TensorFlow学习(四)
CNN
传统的神经网络权值太多,计算量太大,需要大量样本进行训练。 卷积神经网络,通过感受野和权值共享减少了神经网络需要训练的参数个数。 卷积 对于不同的卷积核: 代码使用卷积神经网络进行数字识别:
import tensorflow
as tf
from tensorflow
.examples
.tutorials
.mnist
import input_data
mnist
= input_data
.read_data_sets('MNIST_data',one_hot
=True
)
batch_size
= 100
n_batch
= mnist
.train
.num_examples
#初始化权值
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
conv2d(x
,W):
return tf
.nn
.conv2d(x
,W,strides
=[1,1,1,1],padding
='SAME')
#池化层
def
max_pool_2x2(x
):
return tf
.nn
.max_pool(x
,ksize
=[1,2,2,1],strides
=[1,2,2,1],padding
='SAME')
x
= tf
.placeholder(tf
.float32
,[None
,784])
y
= tf
.placeholder(tf
.float32
,[None
,10])
x_image
= tf
.reshape(x
,[-1,28,28,1])
### 神经网络
W_conv1
= weight_variable([5,5,1,32])#
5*5的采样窗口,
32个卷积核从
1个平面抽取特征
b_conv1
= bias_variable([32])#每一个卷积核一个偏置值
conv2d_1
= conv2d(x_image
,W_conv1
) + b_conv1
h_conv1
= tf
.nn
.relu(conv2d_1
)
h_pool1
= max_pool_2x2(h_conv1
)#进行max
-pooling
W_conv2
= weight_variable([5,5,32,64])#
5*5的采样窗口,
64个卷积核从
32个平面抽取特征
b_conv2
= bias_variable([64])#每一个卷积核一个偏置值
conv2d_2
= conv2d(h_pool1
,W_conv2
) + b_conv2
h_conv2
= tf
.nn
.relu(conv2d_2
)
h_pool2
= max_pool_2x2(h_conv2
)#进行max
-pooling
#
28*28的图片第一次卷积后还是
28*28,第一次池化后变为
14*14
#第二次卷积后为
14*14,第二次池化后变为了
7*7
#进过上面操作后得到
64张
7*7的平面
#全连接层
#参数
W_fc1
= weight_variable([7*7*64,1024])#上一场有
7*7*64个神经元,全连接层有
1024个神经元
b_fc1
= bias_variable([1024])#
1024个节点
#把池化层
2的输出扁平化为
1维
h_pool2_flat
= tf
.reshape(h_pool2
,[-1,7*7*64])
wx_plus_b1
= tf
.matmul(h_pool2_flat
,W_fc1
) + b_fc1
h_fc1
= tf
.nn
.relu(wx_plus_b1
)
keep_prob
= tf
.placeholder(tf
.float32
)
h_fc1_drop
= tf
.nn
.dropout(h_fc1
,keep_prob
)
#第二个全连接层
W_fc2
= weight_variable([1024,10])
b_fc2
= bias_variable([10])
wx_plus_b2
= tf
.matmul(h_fc1_drop
,W_fc2
) + b_fc2
#计算输出
prediction
= tf
.nn
.softmax(wx_plus_b2
)
#交叉熵代价函数,使用AdamOptimizer进行优化
cross_entropy
= tf
.reduce_mean(tf
.nn
.softmax_cross_entropy_with_logits(labels
=y
,logits
=prediction
))
train_step
= tf
.train
.AdamOptimizer(1e-4).minimize(cross_entropy
)
#求准确率
#结果存放在一个布尔列表中
correct_prediction
= tf
.equal(tf
.argmax(prediction
,1),tf
.argmax(y
,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy
= tf
.reduce_mean(tf
.cast(correct_prediction
,tf
.float32
))
with tf
.Session() as sess
:
sess
.run(tf
.global_variables_initializer())
for epoch
in range(10):
for batch
in range(n_batch
):
#训练模型
batch_xs
,batch_ys
= mnist
.train
.next_batch(batch_size
)
sess
.run(train_step
,feed_dict
={x
:batch_xs
,y
:batch_ys
,keep_prob
:0.7})
acc
= sess
.run(accuracy
,feed_dict
={x
:mnist
.test
.images
,y
:mnist
.test
.labels
,keep_prob
:1.0})
print ("Iter " + str(epoch
) + ", Testing Accuracy= " + str(acc
))
结果: