文档章节

TensorFlow学习笔记 --识别圆圈内的点

StanleySun
 StanleySun
发布于 2017/07/16 09:55
字数 850
阅读 88
收藏 1

    在下面这个图上,找出哪些点在圆内,哪些在圆外,对我们来说非常简单。因为我们有眼睛,能看;有大脑,能想。 但是,如果让电脑来做这件事情,就没那么简单了。我们看一下TensorFlow是如何使用深度神经网络做到的。

介绍

在平面上画一个圆,表达式为x^2+y^2 = 100。 即以原点为中心,半径为100点圆。

在平面上随机生成一批点, 要求 -200<= x <=200, -200<= y <=200。如果点落在圆内(含边界上),则该点的label为0,即图中的实心圆点; 若落在圆外面,则该点label为1,即空心圆点.

要求:通过对数据的分析,生成模型,并对新数据的label进行预测。

步骤

  • 生成数据
  • 用TensorFlow训练模型
  • 预测新数据

1. 生成数据

我用的php代码,大家可以用任何自己喜欢但语言。 文件“generate.php”可以生成2个文件,训练数据training_data.csv和测试数据test_data.csv,代码如下:

<?php

$TRAINING_NUM = 200;//生成训练集坐标点的数量
$TEST_NUM = 100;//生成测试集坐标点的数量
$TRAINING_FILE = "training_data.csv";
$TEST_FILE = "test_data.csv";

generate_data($TRAINING_FILE,$TRAINING_NUM);
generate_data($TEST_FILE,$TEST_NUM);

function generate_data ($file, $num){
    unlink($file);
    file_put_contents($file,$num.',2,in,out'."\r\n",FILE_APPEND);
    $R = 100;
    $MIN_X = -200;
    $MAX_X = 200;
    $MIN_Y = -200;
    $MAX_Y = 200;
    for ($i=0; $i < $num; $i++) { 
        $x = rand($MIN_X,$MAX_X);
        $y = rand($MIN_Y,$MAX_Y);
        $label = 1;
        if (($x*$x + $y*$y) <= $R*$R){
            $label =0;
        }
        $line =  $x.','.$y.','.$label."\r\n";
        file_put_contents($file,$line,FILE_APPEND);
    }
}

运行

php generate.php

生成2个文件training_data.csv 和test_date.csv

内容类似下面这样:

200,2,in,out
-70,-81,0
-50,-198,0
169,-93,0
51,-78,1
...

第一行是header。第一行的第一个数字表示文件的总行数(不含header),第二个数字是特征数,本例中有2个特征: x坐标和y坐标。后面2个是label(可忽略)。从第二行开始,每行的三个数字分别是x,y和label。

2. 用TensorFlow训练模型 & 预测新样本

代码circle_dnn_classifier.py 如下:

#coding:utf-8

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
import numpy as np

# 数据集
TRAINING_FILE = "training_data.csv";
TEST_FILE = "test_data.csv";

# 加载数据
training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=TRAINING_FILE,
    target_dtype=np.int,
    features_dtype=np.int)
test_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=TEST_FILE,
    target_dtype=np.int,
    features_dtype=np.int)

# 确定所有的特征类型为real-value,特征数量为2
feature_columns = [tf.contrib.layers.real_valued_column("", dimension=2)]

# 创建一个3层的深度神经网络, 分别有 10, 20, 10 个神经元.
classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                            hidden_units=[10, 20, 10],
                                            n_classes=3,
                                            model_dir="model")

# 适配模型,训练2000步
classifier.fit(x=training_set.data,y=training_set.target,steps=2000)

# 评估结果
evaluate = classifier.evaluate(x=test_set.data,y=test_set.target)
print(evaluate)

# 对新样本进行预测
new_samples = np.array([[50, 12], [121, 20]], dtype=int)
y = list(classifier.predict(new_samples, as_iterable=True))

print('Predictions: {}'.format(str(y)))

运行代码:

python circle_dnn_classifier.py

结果

...
{'loss': 0.20674889, 'global_step': 2000, 'accuracy': 0.89999978} //测试数据监测准确率89.99%
...
Predictions: [0, 1]   //对新数据预测

可以看到,模型运行正常,准确率是89.99%。

两个新样本在图中的位置,label分别是0和1,TensorFlow识别正确。

 

可以通过一些简单的办法提高精度:

1.增加训练数据,比如将训练数据增加到5000条(相应地将测试集增加到1000)

2.增加训练次数,比如将step设置为8000

经测试,通过这样的优化,测试结果准确率提高到了99.4%!

大家有兴趣,可以用椭圆或者更加复杂的规则试试,看看TensorFlow训练的效果如何。

© 著作权归作者所有

共有 人打赏支持
StanleySun
粉丝 21
博文 45
码字总数 43107
作品 0
技术主管
私信 提问
机器学习Tensorflow笔记1:Hello World到MNIST实验

最近重新梳理了我职业生涯规划,其中人工智能是我最重要的一个职业方向,所以就开始了人工智能的学习,其中Tensorflow是机器学习中一个很热门的框架,是由Google开源的,是一个不错的方向。由...

ImWiki
2018/05/12
0
0
有道云笔记是如何使用TensorFlow Lite的?

文 / 有道技术团队 近年来,有道技术团队在移动端实时 AI 能力的研究上,做了很多探索及应用的工作。2017 年 11 月 Google 发布 TensorFlow Lite (TFLlite) 后,有道技术团队第一时间跟进 TF...

谷歌开发者
2018/04/21
0
0
机器学习实战篇——用卷积神经网络算法在Kaggle上跑个分

之前的文章简单介绍了Kaggle平台以及如何用支撑向量(SVM)的机器学习算法识别手写数字图片。可见即使不用神经网络,传统的机器学习算法在图像识别的领域也能取得不错的成绩(我跑出来了97....

Hongtao洪滔
2018/06/18
0
0
机器学习Tensorflow笔记3:Python训练MNIST模型,在Android上实现评估

通常而言我们会通过Python编写代码训练Tensorflow,但是我们训练的数据需要实际应用起来,本文会介绍如何通过Python训练Tensorflow,训练的结果在Android上应用,当前也可以通过传输数据给服...

ImWiki
2018/05/16
0
0
深度学习入门笔记系列 ( 八 ) ——基于 tensorflow 的手写数字的识别(进阶)

基于 tensorflow 的手写数字的识别(进阶) 本系列将分为 8 篇 。本次为第 8 篇 ,基于 tensorflow ,利用卷积神经网络 CNN 进行手写数字识别 。 1.引言 关于 mnist 数据集的介绍和卷积神经网...

技术小能手
2018/09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
1
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
1
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
1
0
MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

在项目开启阶段,其中一个很重要的环节就是选架构。 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题! 下面我就在这里梳理一下目前常见的一些架构模式。 先...

Java干货分享
昨天
8
0
简单模仿配置文件的反射机制

//Student类 public class Student { public void love() { System.out.println("python"); } } //Tesy类 public class Tesy { public static void main(String[] args) throws Exceptio......

南桥北木
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部