模拟某网站的神经网络

之前学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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值