DL01-5:感知器实现(Tensorflow版本)

  • 本主题内容:
    1. 使用Tensorflow框架实现一个感知;
    2. 使用感知器训练鸢尾花样本,并使用训练样本作为测试样本;
    3. 使用Tensorboard可视化感知器的图。

一、感知器图描述

1. 感知器超参数设置

 LEARNING_RATE=0.0001        #学习率
 TIMES=10                    #训练轮数
 DATA_SIZE=4                 #特征个数,也就是训练样本的数组长度

2. 描述输入数据

  #1.描述输入数据:训练样本sample,训练样本的期望标签label
  sample=tf.placeholder(dtype=tf.float32,shape=[None,DATA_SIZE])  #第一个是训练样本个数(不确定设置为None),第二个特征个数
  label=tf.placeholder(dtype=tf.float32,shape=[None])                 #训练样本的期望标签是标量,其值为0或者1

3. 描述权重与偏置项变量

  #2.描述权重与偏置值(初始值随机)
  w_init=tf.random_uniform(shape=[DATA_SIZE,1],minval=-0.1,maxval=0.1,dtype=tf.float32)
  weights=tf.Variable(w_init)   #传统方式

  b_init=tf.random_uniform(shape=[],minval=-0.1,maxval=0.1,dtype=tf.float32)
  bias=tf.Variable(b_init)

4. 描述加权求和操作

  #3.描述加权求和操作节点
  amount=tf.matmul(sample,weights)+bias

5. 描述损失误差函数

  #4.描述损失函数操作节点
  loss=tf.reduce_mean(tf.square(amount-label))

6. 描述梯度下降优化器

  #5.描述梯度优化操作节点
  trainer=tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss) #使用学习率,最小化误差损失

二、感知器训练与测试

1.准备数据

  #加载鸢尾花数据
  data,target=datasets.load_iris(return_X_y=True)     #第一个返回值是样本数据,第二个返回值是样本的期望标签
  #取前面100个眼本测试(这100个是线性可分的)
  train_data=data[:100]
  label_data=target[:100]     #第一类是0,第二类是1

2.创建运算会话环境

  #1.构建运行会话
  session=tf.Session()
  #2.初始化环境
  init_op=tf.global_variables_initializer()
  session.run(init_op)

3.训练

  #3.开始训练
  print("开始训练!")
  for n in range(TIMES):
      print("第%4d轮训练"%(n+1))
      for i in range(len(train_data)):
          session.run(trainer,feed_dict={sample:train_data[i:i+1],label:label_data[i:i+1]})
      #session.run(trainer, feed_dict={sample: train_data, label:label_data})
  print("训练完毕!")

其中注释的run函数调用,使用样本集进行训练(返回的效果不是太好)。

4.测试

  #4.测试训练
  correct_counter=0
  #前50个期望标签都是0(近似0.5以下都算正确)
  for item in train_data[:50]:
      result=session.run(amount,feed_dict={sample:[item]})
      print(result)
      if result<0.5:
          correct_counter+=1
  print("===============")
  #后50个期望标签都是1(近似0.5以上都算正确)
  for item in train_data[50:]:
      result = session.run(amount, feed_dict={sample: [item]})
      print(result)
      if result>=0.5:
          correct_counter+=1

  #打印正确率:
  print("正确率:%8.2f"%((correct_counter/100.0)*100))

5.测试效果

下面是测试效果截图:

训练轮数10,学习率0.001下的分类率

其中还计算了训练与测试时间,时间不到1秒。
其中训练轮数到一定次数,前50个样本的输出值接近0,后50个样本的输出值接近1。

【附录】

1. 全部代码
#coding=utf-8
from sklearn import datasets    #获取鸢尾花数据样本
import tensorflow  as tf        #tensoflow模块
import time

start = time.clock()

#########################################
LEARNING_RATE=0.0001        #学习率
TIMES=10                    #训练轮数

DATA_SIZE=4                 #特征个数,也就是训练样本的数组长度

#一、感知器计算图描述
#1.描述输入数据:训练样本sample,训练样本的期望标签label
sample=tf.placeholder(dtype=tf.float32,shape=[None,DATA_SIZE])  #第一个是训练样本个数(不确定设置为None),第二个特征个数
label=tf.placeholder(dtype=tf.float32,shape=[None])                 #训练样本的期望标签是标量,其值为0或者1

#2.描述权重与偏置值(初始值随机)
w_init=tf.random_uniform(shape=[DATA_SIZE,1],minval=-0.1,maxval=0.1,dtype=tf.float32)
weights=tf.Variable(w_init)   #传统方式

b_init=tf.random_uniform(shape=[],minval=-0.1,maxval=0.1,dtype=tf.float32)
bias=tf.Variable(b_init)

#3.描述加权求和操作节点
amount=tf.matmul(sample,weights)+bias

#4.描述损失函数操作节点
loss=tf.reduce_mean(tf.square(amount-label))

#5.描述梯度优化操作节点
trainer=tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss) #使用学习率,最小化误差损失

#二、感知器计算图运行
#加载鸢尾花数据
data,target=datasets.load_iris(return_X_y=True)     #第一个返回值是样本数据,第二个返回值是样本的期望标签
#取前面100个眼本测试(这100个是线性可分的)
train_data=data[:100]
label_data=target[:100]     #第一类是0,第二类是1

#1.构建运行会话
session=tf.Session()
#2.初始化环境
init_op=tf.global_variables_initializer()
session.run(init_op)
#---------------------------
graph_writer=tf.summary.FileWriter("./graph",graph=session.graph)
#---------------------------
#3.开始训练
print("开始训练!")
for n in range(TIMES):
    print("第%4d轮训练"%(n+1))
    for i in range(len(train_data)):
        session.run(trainer,feed_dict={sample:train_data[i:i+1],label:label_data[i:i+1]})
    #session.run(trainer, feed_dict={sample: train_data, label:label_data})
print("训练完毕!")

#4.测试训练
correct_counter=0
#前50个期望标签都是0(近似0.5以下都算正确)
for item in train_data[:50]:
    result=session.run(amount,feed_dict={sample:[item]})
    print(result)
    if result<0.5:
        correct_counter+=1
print("===============")
#后50个期望标签都是1(近似0.5以上都算正确)
for item in train_data[50:]:
    result = session.run(amount, feed_dict={sample: [item]})
    print(result)
    if result>=0.5:
        correct_counter+=1

#打印正确率:
print("正确率:%8.2f"%((correct_counter/100.0)*100))

#########################################
end=time.clock()
print("CPU运行时间:",end-start)

#-----------------------
graph_writer.close()
#-----------------------
2. 可视化效果
感知器图的可视化
3. 代码文件
  • perceptron01_tensorflow.py 【 下载
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 与 TensorFlow 的初次相遇 https://jorditorres.org/wp-content/upl...
    布客飞龙阅读 3,964评论 2 89
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,026评论 3 119
  • 潘主任,晚上好! 在产科二区学习四周以来,按照学习大纲要求,已掌握床边交接班内容,七步洗手法及手卫生的消毒,会阴冲...
    RQ严梦婷阅读 129评论 0 0
  • 工厂模式 构造函数模式 模块模式 单例模式 混合模式 发布订阅模式 它定义了对象间的一种一对多的关系,让多个观察者...
    谢梦扬_阅读 234评论 0 1
  • Flocks of cumulus blocking the sun from view, edges glowi...
    安琪的简书阅读 326评论 0 1