python中tensorflow实现二分类_TensorFlow 入门(2):使用DNN分类器对数据进行分类...

本文介绍了如何使用TensorFlow的高级API DNNClassifier对鸢尾花数据进行二分类,并通过实际例子展示了如何加载CSV数据,创建和训练DNN模型,以及评估和应用模型。同时,文章探讨了将此方法应用于新的问题,例如根据坐标确定象限的分类任务。
摘要由CSDN通过智能技术生成

背景

上一篇 《TensorFlow 入门:求 N 元一次方程》根据官网的入门教程,使用基础的 API 稍作修改解决了 N 个数据的权重问题,再继续看官网后面的教程,有一篇 高级 API 入门教程教我们如何使用 DNN(深度神经网络)分类器实现对鸢尾花的分类。刚看到这篇文章的时候,中间出现了几种鸢尾花的图案,我还以为输入是图片,API 会进行图片识别,后来发现输入的训练集只是一组组特征数据(包含花萼的长度宽度和花瓣的长度宽度)对应分类,可以看做能够解决这样的一个问题:给定一组特征数据,求这组数据的分类。 和之前一样,先分析一下原文中的示例,很多文章对原文中的示例进行翻译,但是并没有举一反三,这样其实学习效果并不好,本文会在学习后使用原文的方法,解决一个新的问题。 由于作者能力有限,目前仅停留在使用阶段,先培养机器学习思维方式,对于原理部分,可以参考其他的资料。能保证的是,阅读本文不会让你过于枯燥,也不会很难,我的宗旨是用简单的语言将复杂的问题说清楚。

原文示例

原文链接在这里,我们先逐行分析一下,首先进行必要的包含工作,我对 python 不是特别熟悉,前面这 3 行我还专门去查了一下是什么含义,具体可以参考 这篇文章:

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

import os

import urllib

import tensorflow as tf

import numpy as np

然后定义训练集和测试集的路径,这次的数据是以 csv 的格式加载进来:

IRIS_TRAINING = "iris_training.csv"

IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"

IRIS_TEST = "iris_test.csv"

IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"

然后进入到主函数,主函数首先是将训练集和测试集的 csv 文件下载下来:

# If the training and test sets aren't stored locally, download them.

if not os.path.exists(IRIS_TRAINING):

raw = urllib.urlopen(IRIS_TRAINING_URL).read()

with open(IRIS_TRAINING, "w") as f:

f.write(raw)

if not os.path.exists(IRIS_TEST):

raw = urllib.urlopen(IRIS_TEST_URL).read()

with open(IRIS_TEST, "w") as f:

f.write(raw)

下载下来的文件可以打开看看,我们打开训练集:

120,4,setosa,versicolor,virginica

6.4,2.8,5.6,2.2,2

5,2.3,3.3,1,1

4.9,2.5,4.5,1.7,2

4.9,3.1,1.5,0.1,0

5.7,3.8,1.7,0.3,0

4.4,3.2,1.3,0.2,0

5.4,3.4,1.5,0.4,0

6.9,3.1,5.1,2.3,2

...

可以发现首行的格式看起来并不是一个表头,这个格式是有规范的,但是原文没有讲,我们继续往后看它是怎么读取的:

# Load datasets.

training_set = tf.contrib.learn.datasets.base.load_csv_with_header(

filename=IRIS_TRAINING,

target_dtype=np.int,

features_dtype=np.float32)

test_set = tf.contrib.learn.datasets.base.load_csv_with_header(

filename=IRIS_TEST,

target_dtype=np.int,

features_dtype=np.float32)

TensorFlow 使用 tf.contrib.learn.datasets.base.load_csv_with_header 对 CSV 文件进行读取,它有 3 个参数:

filename:CSV 文件名

target_dtype:目标数据的类型,本例中为分类 ID,使用整形表示

features_dtype:特征值的类型,本例中是花萼花瓣的长宽度,使用浮点数表示

def load_csv_with_header(filename,

target_dtype,

features_dtype,

target_column=-1):

"""Load dataset from CSV file with a header row."""

with gfile.Open(filename) as csv_file:

data_file = csv.reader(csv_file)

header = next(data_file)

n_samples = int(header[0])

n_features = int(header[1])

data = np.zeros((n_samples, n_features), dtype=features_dtype)

target = np.zeros((n_samples,), dtype=target_dtype)

for i, row in enumerate(data_file):

target[i] = np.asarray(row.pop(target_column), dtype=target_dtype)

data[i] = np.asarray(row, dtype=features_dtype)

return Dataset(data=data, target=target)

这样就很清楚了,使用 load_csv_with_header 函数读取的 CSV 文件首行前两列分别表示数据组的个数和每个数据组的特征数,训练集中一共有 120 组数据,每组数据包含 4 个特征。首行的另外 3 个数据,实际上并不会读取到。具体的特征数据从第二行开始,最后一列为目标值(即训练完毕后期望的输出值),前面的 4 列为特征数据(即训练完毕后的输入值),这个 4 必须和第一行第二列相等,否则就会读取失败了。 数据读取完毕后,可以把结果打印出来看看:

print(training_set)

Dataset(data=array([

[ 6.4000001 , 2.79999995, 5.5999999 , 2.20000005],

[ 5. , 2.29999995, 3.29999995, 1. ],

[ 4.9000001 , 2.5 , 4.5 , 1.70000005],

...

[ 4.80000019, 3. , 1.39999998, 0.1 ],

[ 5.5 , 2.4000001 , 3.70000005, 1. ]], dtype=float32),

target=array([2, 1, 2,..., 0, 1]))

因为篇幅问题,上面省略了很多数据,可以看到和 load_csv_with_header 代码中一致,结果为一个 Dataset 结构,其中 data 为 120 组数据,每组数据包含 4 个特征值&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值