之前学cnn的时候是看这个网站理解的,但是当时就觉得这个不太准,所以根据他的信息模拟下他然后试试
模拟:http://scs.ryerson.ca/~aharley/vis/conv/flat.html网站的神经网络模型看看怎么样
训练1000次数据
step 0, training accuracy 0.04
step 100, training accuracy 0.64
step 200, training accuracy 0.84
step 300, training accuracy 0.68
step 400, training accuracy 0.84
step 500, training accuracy 0.8
step 600, training accuracy 0.94
step 700, training accuracy 0.84
step 800, training accuracy 0.78
step 900, training accuracy 0.92
step 1000, training accuracy 0.88
save to path: my_net/save_net.ckpt
Test accuracy: 0.9003
对比我写的更复杂的神经网络训练1000次
step 0, training accuracy 0.06
step 100, training accuracy 0.84
step 200, training accuracy 0.94
step 300, training accuracy 0.84
step 400, training accuracy 1
step 500, training accuracy 0.92
step 600, training accuracy 1
step 700, training accuracy 0.96
step 800, training accuracy 0.86
step 900, training accuracy 0.98
step 1000, training accuracy 0.98
save to path: my_net/save_net.ckpt
Test accuracy: 0.9649
这个更快更好哦
附上模拟代码:
# -*- coding:gbk -*-
import input_data
import tensorflow as tf
import numpy
mnist=input_data.read_data_sets("MNIST_data/", one_hot=True)
#添加x作为占位符
x=tf.placeholder("float", [None, 784])#28*28
#正确结果占位符
y_=tf.placeholder("float", [None,10])
#生成权重函数
def weight_variable(shape):
#tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正态分布,均值和标准差自己设定
#权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度
initial=tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial,dtype=tf.float32)
#生成偏置函数
#由于我们使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题(dead neurons)
def bias_variable(shape):
initial=tf.constant(0.1, shape=shape)
return tf.Variable(initial,dtype=tf.float32)
#卷积函数
#卷积使用1步长,0边距的模板,池化用2x2的模板
def conv2d(x, W):
#x:待卷积的矩阵具有[batch, in_height, in_width, in_channels]这样的shape
#w:卷积核具有[filter_height, filter_width, in_channels, out_channels]这样的shape
#strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
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')
#卷积在每个5x5的patch中算出32个特征。
#卷积的权重张量形状是[5, 5, 1, 32],前两个维度是patch的大小,
#接着是输出几个单位,和输出的几个维度
W_conv1=weight_variable([5, 5, 1, 6])
b_conv1=bias_variable([6])
#shape:[batch, in_height, in_width, in_channels]
x_image=tf.reshape(x, [-1,28,28,1])
#卷积+偏置,然后给relu激活函数,最后激活函数返回值池化
h_conv1=tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1=max_pool_2x2(h_conv1)
#第二层卷积,池化
W_conv2=weight_variable([5, 5, 6, 16])
b_conv2=bias_variable([16])
h_conv2=tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2=max_pool_2x2(h_conv2)
#全连接层1
W_fc1=weight_variable([7*7*16,120])
b_fc1=bias_variable([120])
h_pool2_flat=tf.reshape(h_pool2, [-1,7*7*16])
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1) + b_fc1)
#全连接层2
W_fc2=weight_variable([120, 100])
b_fc2=bias_variable([100])
h_fc2=tf.nn.relu(tf.matmul(h_fc1, W_fc2) + b_fc2)
#dropout方法减轻过拟合问题
keep_prob=tf.placeholder("float")
h_fc2_drop=tf.nn.dropout(h_fc2, keep_prob)
#全连接层3
W_fc3=weight_variable([100, 10])
b_fc3=bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc2_drop, W_fc3) + b_fc3)
#训练 评估 保存模型
cross_entropy=-tf.reduce_sum(y_*tf.log(y_conv))
tf.summary.scalar('cross_entropy',cross_entropy)
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, "float"))
tf.summary.scalar('accuracy',accuracy)
sess = tf.InteractiveSession()
saver=tf.train.Saver()
merged=tf.summary.merge_all()
writer=tf.summary.FileWriter("D://logs",sess.graph)
sess.run(tf.global_variables_initializer())
for i in range(1001):
batch = mnist.train.next_batch(50)
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g"%(i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
summary_str = sess.run(merged,feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
writer.add_summary(summary_str,i)
save_path=saver.save(sess,'my_net/save_net.ckpt')
print("save to path:",save_path)
accuracyResult = list(range(10))
for i in range(10):
batch = mnist.test.next_batch(1000)
accuracyResult[i] = accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
print("Test accuracy:", numpy.mean(accuracyResult))