读万卷书,不如行万里路。之前看了不少机器学习方面的书籍,但是实战很少。这次因为项目接触到tensorflow,用一个最简单的深层神经网络实现分类和回归任务。

首先说分类任务,分类任务的两个思路:

如果是多分类,输出层为计算出的预测值Z3(1,classes),可以利用softmax交叉熵损失函数,将Z3中的值转化为概率值,概率值最大的即为预测值。

在tensorflow中,多分类的损失函数为:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=Z3, labels=Y))

为了匹配Z3和Y的尺寸,需要将输入Y进行one-hot编码,
from keras.utils import to_categorical
Y_train = to_categorical(Y_train)
计算准确性:
correct_prediction = tf.equal(tf.argmax(Z3,axis=1), tf.argmax(Y,1) )  # tf.argmax找出每一列最大值的索引
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # tf.cast转化数据类型
print("Train Accuracy:", sess.run(accuracy,feed_dict={X: X_train, Y: Y_train}))
print("Test Accuracy: ",sess.run(accuracy,feed_dict={X:X_test,Y:Y_test}))
完整代码如下:
# -*- coding: utf-8 -*-

import numpy as np
import tensorflow as tf
import math
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
import keras
import scipy
import os
import csv
import pandas as pd
from keras.utils import to_categorical from sklearn.preprocessing import normalize #创建placeholders对象
def create_placeholders(n_x,n_y):
"""
placeholder是TensorFlow的占位符节点,由placeholder方法创建,其也是一种常量,但是由用户在调用run方法是传递的.
也可以将placeholder理解为一种形参。
即其不像constant那样直接可以使用,需要用户传递常数值。
"""
X=tf.placeholder(tf.float32,shape=[None,n_x],name='X')
Y=tf.placeholder(tf.float32,shape=[None,n_y],name='Y') return X,Y #初始化参数
def initialize_parameters(m,n):
#设置种子后,每次生成的参数都是相同的,保证重复实验的结果可以参考
tf.set_random_seed(1)
W1 = tf.get_variable("W1", shape=[n, n], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b1 = tf.get_variable("b1", shape=[1, n], initializer=tf.zeros_initializer())
W2=tf.get_variable("W2",shape=[n,2],initializer=tf.contrib.layers.xavier_initializer(seed=1))
b2=tf.get_variable("b2",shape=[1,2],initializer=tf.zeros_initializer())
parameters={
"W1": W1,
"b1":b1,
"W2":W2,
"b2":b2
}
return parameters #前向传播
def forward_propagation(X,parameters,lambd):
W1=parameters['W1']
b1=parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2'] #使用L1正则化
tf.add_to_collection('losses',tf.contrib.layers.l1_regularizer(lambd)(W1))
tf.add_to_collection('losses', tf.contrib.layers.l1_regularizer(lambd)(W2)) A1=tf.nn.relu(tf.matmul(X,W1)+b1)
Z3=tf.matmul(A1,W2)+b2 return Z3 def compute_cost(Z3, Y):
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=Z3, labels=Y))
tf.add_to_collection('losses',cost)
return tf.add_n(tf.get_collection('losses')) def model(X_train, Y_train,X_test,Y_test, learning_rate=0.01,minibatch_size=10, num_epochs=30000, print_cost=True): tf.set_random_seed(1)
(m, n_x) = X_train.shape
n_y = Y_train.shape[1]
costs = []
# 创建Placeholders,一个张量
X,Y=create_placeholders(n_x,n_y)
print(X.shape, Y.shape)
# 初始化参数
parameters=initialize_parameters(m,n_x)
# 前向传播
Z3=forward_propagation(X,parameters,0.002)
# 计算代价
cost = compute_cost(Z3, Y) # 后向传播: 定义tensorflow optimizer对象,这里使用AdamOptimizer.
optimizer=tf.train.AdadeltaOptimizer(learning_rate=learning_rate).minimize(cost)
# optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
# 初始化所有参数
init=tf.global_variables_initializer() # 启动session来计算tensorflow graph
with tf.Session() as sess:
sess.run(init)
for epoch in range(num_epochs):
epoch_cost=sess.run([optimizer,cost],feed_dict={X:X_train,Y:Y_train})
test_cost=sess.run(cost,feed_dict={X:X_test,Y:Y_test})
epoch_cost=epoch_cost[1] if print_cost==True and epoch%100==0:
print("Cost after epoch %i: %f" %(epoch,epoch_cost))
print("test_cost: ",test_cost) # lets save the parameters in a variable
parameters = sess.run(parameters)
print("Parameters have been trained!")
# 神经网络经过训练后得到的值 correct_prediction = tf.equal(tf.argmax(Z3,axis=1), tf.argmax(Y,1) ) # tf.argmax找出每一列最大值的索引
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # tf.cast转化数据类型
print("Train Accuracy:", sess.run(accuracy,feed_dict={X: X_train, Y: Y_train}))
print("Test Accuracy: ",sess.run(accuracy,feed_dict={X:X_test,Y:Y_test})) return parameters def loaddata(file): fr=open(file,'r', encoding='utf-8-sig')
reader = csv.reader(fr)
data=[]
fltLine=[]
for line in reader:
data.append(line)
data=np.mat(data)
data=data.astype(np.float32)
X=data[1:,0:-1]
Y=data[1:,-1]
X=normalize(X,axis=0,norm='max')
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=42)
return X_train, X_test, Y_train, Y_test if __name__=='__main__': X_train, X_test, Y_train, Y_test= loaddata('./data3.csv')
Y_train=to_categorical(Y_train)
Y_test = to_categorical(Y_test)
parmeters=model(X_train,Y_train,X_test,Y_test)

另一种是单纯的针对二分类,主要有两点不同,一是损失函数的使用:

输出层Z3为(1,1)

cost= tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Z3, labels=Y))
另一个就是计算准确率:
one = tf.ones_like(Z3)
zero = tf.zeros_like(Z3)
label = tf.where(tf.less(Z3, 0.5), x=zero, y=one) correct_prediction = tf.equal(label, Y) # tf.argmax找出每一列最大值的索引
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # tf.cast转化数据类型
print("Train Accuracy:", sess.run(accuracy, feed_dict={X: X_train, Y: Y_train}))
print("Test Accuracy: ", sess.run(accuracy, feed_dict={X: X_test, Y: Y_test}))
完整代码如下:
# -*- coding: utf-8 -*-

import numpy as np
import tensorflow as tf
import math
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
import keras
import scipy
import os
import csv
import pandas as pd
from keras.utils import to_categorical from sklearn.preprocessing import normalize # 创建placeholders对象
def create_placeholders(n_x, n_y):
"""
placeholder是TensorFlow的占位符节点,由placeholder方法创建,其也是一种常量,但是由用户在调用run方法是传递的.
也可以将placeholder理解为一种形参。
即其不像constant那样直接可以使用,需要用户传递常数值。
"""
X = tf.placeholder(tf.float32, shape=[None, n_x], name='X')
Y = tf.placeholder(tf.float32, shape=[None, n_y], name='Y') return X, Y # 初始化参数
def initialize_parameters(m, n):
# 设置种子后,每次生成的参数都是相同的,保证重复实验的结果可以参考
tf.set_random_seed(1)
W1 = tf.get_variable("W1", shape=[n, n], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b1 = tf.get_variable("b1", shape=[1, n], initializer=tf.zeros_initializer())
W2 = tf.get_variable("W2", shape=[n, 1], initializer=tf.contrib.layers.xavier_initializer(seed=1))
b2 = tf.get_variable("b2", shape=[1, 1], initializer=tf.zeros_initializer())
parameters = {
"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2
}
return parameters # 前向传播
def forward_propagation(X, parameters, lambd):
W1 = parameters['W1']
b1 = parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2'] # 使用L1正则化
#tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambd)(W1))
#tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambd)(W2)) #A1 = tf.nn.relu(tf.matmul(X, W1) + b1)
Z3 = tf.matmul(X, W2) + b2
#Z3=tf.sigmoid(Z3) return Z3 def compute_cost(Z3, Y):
# 经过激活函数处理后的交叉熵
#cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=Z3, labels=Y))
cost= tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Z3, labels=Y))
#cost=-tf.reduce_mean(Y*tf.log(tf.clip_by_value(Z3,1e-10,1.0)))
tf.add_to_collection('losses', cost)
return tf.add_n(tf.get_collection('losses')) def model(X_train, Y_train, X_test, Y_test, learning_rate=0.05, minibatch_size=10, num_epochs=50000, print_cost=True):
tf.set_random_seed(1)
(m, n_x) = X_train.shape
n_y = Y_train.shape[1]
costs = []
# 创建Placeholders,一个张量
X, Y = create_placeholders(n_x, n_y)
print(X.shape, Y.shape)
# 初始化参数
parameters = initialize_parameters(m, n_x)
# 前向传播
Z3 = forward_propagation(X, parameters, 0.001)
# 计算代价
cost = compute_cost(Z3, Y) # 后向传播: 定义tensorflow optimizer对象,这里使用AdamOptimizer.
optimizer = tf.train.AdadeltaOptimizer(learning_rate=learning_rate).minimize(cost)
# optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
# 初始化所有参数
init = tf.global_variables_initializer() # 启动session来计算tensorflow graph
with tf.Session() as sess:
sess.run(init)
for epoch in range(num_epochs):
epoch_cost = sess.run([optimizer, cost], feed_dict={X: X_train, Y: Y_train})
test_cost = sess.run(cost, feed_dict={X: X_test, Y: Y_test})
epoch_cost = epoch_cost[1] if print_cost == True and epoch % 100 == 0:
print("Cost after epoch %i: %f" % (epoch, epoch_cost))
print("test_cost: ", test_cost) # lets save the parameters in a variable
parameters = sess.run(parameters)
print("Parameters have been trained!")
# 神经网络经过训练后得到的值
# print(sess.run(Y,feed_dict={Y:Y_train}))
# Y=tf.cast(Y,tf.int64) one = tf.ones_like(Z3)
zero = tf.zeros_like(Z3)
label = tf.where(tf.less(Z3, 0.5), x=zero, y=one) correct_prediction = tf.equal(label, Y) # tf.argmax找出每一列最大值的索引
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # tf.cast转化数据类型
print("Train Accuracy:", sess.run(accuracy, feed_dict={X: X_train, Y: Y_train}))
print("Test Accuracy: ", sess.run(accuracy, feed_dict={X: X_test, Y: Y_test})) return parameters def loaddata(file):
fr = open(file, 'r', encoding='utf-8-sig')
reader = csv.reader(fr)
data = []
fltLine = []
for line in reader:
data.append(line)
data = np.mat(data)
data = data.astype(np.float32)
X = data[1:, 0:-1]
Y = data[1:, -1]
X = normalize(X, axis=0, norm='max')
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=42)
return X_train, X_test, Y_train, Y_test if __name__ == '__main__': X_train, X_test, Y_train, Y_test = loaddata('./data3.csv')
#Y_train = to_categorical(Y_train)
#Y_test = to_categorical(Y_test) parmeters = model(X_train, Y_train, X_test, Y_test)

  

												

tensorflow实现二分类的更多相关文章

  1. Tensorflow mlp二分类

    只是简单demo, 可以看出tensorflow非常简洁,适合快速实验     import tensorflow as tf import numpy as np import melt_datas ...

  2. Tensorflow CIFAR10 (二分类)

    数据的下载: (共有三个版本:python,matlab,binary version 适用于C语言) http://www.cs.toronto.edu/~kriz/cifar-10-python. ...

  3. tensorflow实现svm iris二分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)

    iris二分类 # Linear Support Vector Machine: Soft Margin # ---------------------------------- # # This f ...

  4. SVM原理以及Tensorflow 实现SVM分类(附代码)

    1.1. SVM介绍 1.2. 工作原理 1.2.1. 几何间隔和函数间隔 1.2.2. 最大化间隔 - 1.2.2.0.0.1. \(L( {x}^*)\)对$ {x}^*$求导为0 - 1.2.2 ...

  5. Kaggle实战之二分类问题

    0. 前言 1. MNIST 数据集 2. 二分类器 3. 效果评测 4. 多分类器与误差分析 5. Kaggle 实战 0. 前言 "尽管新技术新算法层出不穷,但是掌握好基础算法就能解决手 ...

  6. 深度学习之 TensorFlow(二):TensorFlow 基础知识

    1.TensorFlow 系统架构: 分为设备层和网络层.数据操作层.图计算层.API 层.应用层.其中设备层和网络层.数据操作层.图计算层是 TensorFlow 的核心层. 2.TensorFlo ...

  7. keras实现简单性别识别(二分类问题)

    keras实现简单性别识别(二分类问题) 第一步:准备好需要的库 tensorflow  1.4.0 h5py 2.7.0 hdf5 1.8.15.1 Keras     2.0.8 opencv-p ...

  8. tensorflow 教程 文本分类 IMDB电影评论

    昨天配置了tensorflow的gpu版本,今天开始简单的使用一下 主要是看了一下tensorflow的tutorial 里面的 IMDB 电影评论二分类这个教程 教程里面主要包括了一下几个内容:下载 ...

  9. 二分类问题 - 【老鱼学tensorflow2】

    什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...

随机推荐

  1. 20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结

    20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目( ...

  2. Java定时器小实例

    有时候,我们需要在Java中定义一个定时器来轮询操作,比如每隔一段时间查询.删除数据库中的某些数据等,下面记录一下一种简单实现方式 1,首先新建一个类,类中编写方法来实现业务操作 public cla ...

  3. hustOJ 添加 golang 支持

    hustOJ 支持Go1.7.1 是否为docker环境不重要,此处所有内容均为docker中执行,普通主机手动安装则更加如此 建议在docker中执行,因为OJ为严控恶意权限,judge_clien ...

  4. JAVA中通过Jaxp操作XML文件基础

    Java中有多种方式操作XML文件,目前讲一讲以SUN公司提供的DocumentBuilderFactory工厂类对象操作XML. 使用XML基本操作就是需要CRUD(增删改查),那么首先通过一个查询 ...

  5. 分享一个Snackbar工具类 SnackbarUtils;

    分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短                 1.1:Snackbar.LEN ...

  6. [Vue warn]: Duplicate keys detected: '1'. This may cause an update error

    今天遇到这个问题,遇到这个问题多数因为:key值的问题 第一种情况(key重复) <div class="name-list" v-for="(item,index ...

  7. Centos7 系统下怎么更改apache默认网站目录

    当我们在Centos7中配置好Apache时,发现apache默认解析目录是在 /var/www/html,也就是说当访问服务器 IP 或者本地 localhost 时,默认定位到这个目录里的 ind ...

  8. yum源配置问题

    目前我所知有三种情况: 1. 完全公网环境 2. linux所处内网,但可以代理至公网 3. 完全内网 这里讨论下第三种情况,如果是处在完全内网情况下,可以使用linux安装时的iso镜像包作为本地y ...

  9. ActiveMQ(4)---ActiveMQ原理分析之消息消费

    消费端消费消息的原理 我们通过上一节课的讲解,知道有两种方法可以接收消息,一种是使用同步阻塞的MessageConsumer#receive方法.另一种是使用消息监听器MessageListener. ...

  10. python各种web框架对比

    0 引言        python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的 ...