python机器学习算法系列之初识神经网络分类

          说明:其中代码主要来源莫烦Python,大家可以去看看,但是因为版本问题(我是python3.6)现在有些函数的调用方法有细微改变,所以我下面的代码做了一些修改,目前其可以在win10上面运行。

    建议在读本文之前请阅读前一篇文章python机器学习算法系列之初识神经网络回归

下面的例子是区分数字如下图:

在程序中通过下面语句就可以自动下载数据集

mnist=input_data.read_data_sets('MNIST_data',one_hot=True) 

但是有时候会出错,那就需要大家手动下载,它包括四个压缩文件,下载统一后放在python工作目录(注意不需要手动解压,直接放就可以),然后将上面的语句改为

mnist=input_data.read_data_sets('.',one_hot=True)

其中的"."代表当前文件夹,它会自己寻找到文件并解压。关于这四个文件资源和该数据集内部构成,这里有一篇文章

 

MNIST 数据下载写得非常清楚,大家自行观看。

下面的程序每一步都有非常清晰的注释,这里不做进一步解释,希望大家对比前一篇python机器学习算法系列之初识神经网络回归 一起看,即看看回归和分类问题在代码上面具体有哪些不同,进而有心里一个框架或者

程序如下:

#tensorflow分类
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#产生数据
mnist=input_data.read_data_sets('.',one_hot=True)     #加载数据

#定义神经层
def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
    layer_name='layer%s'%n_layer
    with tf.name_scope('ayer_name'):                                                       #可视化
        with tf.name_scope('weignts'):
            Weignts=tf.Variable(tf.random_normal([in_size,out_size]),name='W')             #权重
            tf.summary.histogram(layer_name+'/weights',Weignts)                            #为了通过浏览器观察每一神经层的权重
        with tf.name_scope('weignts'):                                                     #可视化
            biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b')                        #偏移量
            tf.summary.histogram(layer_name+'/biases',biases)
        with tf.name_scope('Input_mut_W_Plus_bia'):                                        #可视化
            Input_mut_W_Plus_bia=tf.matmul(inputs,Weignts)+biases           
            tf.summary.histogram(layer_name+'/Input_mut_W_Plus_bias',Input_mut_W_Plus_bia) #为了通过浏览器观察每一神经层的权重
        if activation_function is None:                            
            outputs=Input_mut_W_Plus_bia                           
        else:                                                    
            outputs=activation_function(Input_mut_W_Plus_bia)                              #激励函数
            tf.summary.histogram(layer_name+'/outputs',outputs)                            #为了通过浏览器观察每一神经层的输出值
        return outputs

#定义准确率:tensorflow定义完了都是要有sess.run来运行的
def compute_accuracy(v_xs,v_ys):
    global prediction                                     #prediction全局化
    y_pre=sess.run(prediction,feed_dict={xs:v_xs})         #预测值
    correct_prediction=tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))
    accuracy=tf.reduce_mean(tf.cast( correct_prediction,tf.float32))
    result=sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})          #运行上面定义的accuracy
    return result 
    
#定义给输入定义placeholder
#None就是代表不管多少例子都可以,784可以理解为样本中只有一个特征
with tf.name_scope('inputs'):                                   #可视化
    xs=tf.placeholder(tf.float32,[None,784],name='x_input')    #28*28 
    ys=tf.placeholder(tf.float32,[None,10],name='y_input')

#添加神经层tf.nn.softmax一般用来分类
prediction=add_layer(xs,784,10,1,activation_function=tf.nn.softmax)

with tf.name_scope('cross_entropy'):                                                                          #可视化
    cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))              #代价函数,分类用softma和coss_entropy配
    tf.summary.scalar('cross_entropy',cross_entropy)                                                      #为了通过浏览器观察每一神经层的误差(代价函数)
with tf.name_scope('train_ste'):
    train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)                                 #优化函数

init=tf.global_variables_initializer()                                                               #初始化所有变量
sess=tf.Session()
merged=tf.summary.merge_all()                                                                        #将所有需要在浏览器中展现的参数合并在一起                                                                    
writer=tf.summary.FileWriter("logs/",sess.graph)                                                     #将需要可视化的东西写到logs文件下
sess.run(init)


#训练多次
for i in range(1000):
    batch_xs,batch_ys=mnist.train.next_batch(100)
    sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys})
    if i%50==0:
        result=sess.run(merged,feed_dict={xs:batch_xs,ys:batch_ys})
        #将需要统计的结果加到writer
        writer.add_summary(result,i)
        print(compute_accuracy(mnist.test.images,mnist.test.labels))  #打印准确度
        

运行结果:

可以看到学习过程中准确率逐渐上升。从最初的0.107上升到0.8764

下面都是通过在浏览器里面看到的,具体怎么操作请看python机器学习算法系列之初识神经网络回归

神经网络图:从中可以看到数据流向

误差函数:

神经层内部参数变化:

 

更多算法可以参看博主其他文章,或者github:https://github.com/Mryangkaitong/python-Machine-learning

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值