使用TensorFlow实现二分类
2017-10-23 22:12
232 查看
使用TensorFlow构建一个神经网络来实现二分类,主要包括输入数据格式、隐藏层数的定义、损失函数的选择、优化函数的选择、输出层。下面通过numpy来随机生成一组数据,通过定义一种正负样本的区别,通过TensorFlow来构造一个神经网络来实现二分类。
一、神经网络结构
输入数据:定义输入一个二维数组(x1,x2),数据通过numpy来随机产生,将输出定义为0或1,如果x1+x2<1,则y为1,否则y为0。
隐藏层:定义两层隐藏层,隐藏层的参数为(2,3),两行三列的矩阵,输入数据通过隐藏层之后,输出的数据为(1,3),t通过矩阵之间的乘法运算可以获得输出数据。
损失函数:使用交叉熵作为神经网络的损失函数,常用的损失函数还有平方差。
优化函数:通过优化函数来使得损失函数最小化,这里采用的是Adadelta算法进行优化,常用的还有梯度下降算法。
输出数据:将隐藏层的输出数据通过(3,1)的参数,输出一个一维向量,值的大小为0或1。
二、TensorFlow代码的实现
import tensorflow as tf
from numpy.random import RandomState
if __name__ == "__main__":
#定义每次训练数据batch的大小为8,防止内存溢出
batch_size = 8
#定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
#定义输入和输出
x = tf.placeholder(tf.float32,shape=(None,2),name="x-input")
y_ = tf.placeholder(tf.float32,shape=(None,1),name="y-input")
#定义神经网络的前向传播过程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#定义损失函数和反向传播算法
#使用交叉熵作为损失函数
#tf.clip_by_value(t, clip_value_min, clip_value_max,name=None)
#基于min和max对张量t进行截断操作,为了应对梯度爆发或者梯度消失的情况
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
# 使用Adadelta算法作为优化函数,来保证预测值与实际值之间交叉熵最小
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#通过随机函数生成一个模拟数据集
rdm = RandomState(1)
# 定义数据集的大小
dataset_size = 128
# 模拟输入是一个二维数组
X = rdm.rand(dataset_size,2)
#定义输出值,将x1+x2 < 1的输入数据定义为正样本
Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
#创建会话运行TensorFlow程序
with tf.Session() as sess:
#初始化变量 tf.initialize_all_variables()
init = tf.initialize_all_variables()
sess.run(init)
#设置神经网络的迭代次数
steps = 5000
for i in range(steps):
#每次选取batch_size个样本进行训练
start = (i * batch_size) % dataset_size
end = min(start + batch_size,dataset_size)
#通过选取样本训练神经网络并更新参数
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
#每迭代1000次输出一次日志信息
if i % 1000 == 0 :
# 计算所有数据的交叉熵
total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
# 输出交叉熵之和
print("After %d training step(s),cross entropy on all data is %g"%(i,total_cross_entropy))
#输出参数w1
print(w1.eval(session=sess))
#输出参数w2
print(w2.eval(session=sess))
'''
After 0 training step(s),cross entropy on all data is 0.0674925
After 1000 training step(s),cross entropy on all data is 0.0163385
After 2000 training step(s),cross entropy on all data is 0.00907547
After 3000 training step(s),cross entropy on all data is 0.00714436
After 4000 training step(s),cross entropy on all data is 0.00578471
[[-1.96182752 2.58235407 1.68203771]
[-3.46817183 1.06982315 2.11788988]]
[[-1.82471502]
[ 2.68546653]
[ 1.41819501]]
'''
一、神经网络结构
输入数据:定义输入一个二维数组(x1,x2),数据通过numpy来随机产生,将输出定义为0或1,如果x1+x2<1,则y为1,否则y为0。
隐藏层:定义两层隐藏层,隐藏层的参数为(2,3),两行三列的矩阵,输入数据通过隐藏层之后,输出的数据为(1,3),t通过矩阵之间的乘法运算可以获得输出数据。
损失函数:使用交叉熵作为神经网络的损失函数,常用的损失函数还有平方差。
优化函数:通过优化函数来使得损失函数最小化,这里采用的是Adadelta算法进行优化,常用的还有梯度下降算法。
输出数据:将隐藏层的输出数据通过(3,1)的参数,输出一个一维向量,值的大小为0或1。
二、TensorFlow代码的实现
import tensorflow as tf
from numpy.random import RandomState
if __name__ == "__main__":
#定义每次训练数据batch的大小为8,防止内存溢出
batch_size = 8
#定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
#定义输入和输出
x = tf.placeholder(tf.float32,shape=(None,2),name="x-input")
y_ = tf.placeholder(tf.float32,shape=(None,1),name="y-input")
#定义神经网络的前向传播过程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#定义损失函数和反向传播算法
#使用交叉熵作为损失函数
#tf.clip_by_value(t, clip_value_min, clip_value_max,name=None)
#基于min和max对张量t进行截断操作,为了应对梯度爆发或者梯度消失的情况
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
# 使用Adadelta算法作为优化函数,来保证预测值与实际值之间交叉熵最小
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#通过随机函数生成一个模拟数据集
rdm = RandomState(1)
# 定义数据集的大小
dataset_size = 128
# 模拟输入是一个二维数组
X = rdm.rand(dataset_size,2)
#定义输出值,将x1+x2 < 1的输入数据定义为正样本
Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
#创建会话运行TensorFlow程序
with tf.Session() as sess:
#初始化变量 tf.initialize_all_variables()
init = tf.initialize_all_variables()
sess.run(init)
#设置神经网络的迭代次数
steps = 5000
for i in range(steps):
#每次选取batch_size个样本进行训练
start = (i * batch_size) % dataset_size
end = min(start + batch_size,dataset_size)
#通过选取样本训练神经网络并更新参数
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
#每迭代1000次输出一次日志信息
if i % 1000 == 0 :
# 计算所有数据的交叉熵
total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
# 输出交叉熵之和
print("After %d training step(s),cross entropy on all data is %g"%(i,total_cross_entropy))
#输出参数w1
print(w1.eval(session=sess))
#输出参数w2
print(w2.eval(session=sess))
'''
After 0 training step(s),cross entropy on all data is 0.0674925
After 1000 training step(s),cross entropy on all data is 0.0163385
After 2000 training step(s),cross entropy on all data is 0.00907547
After 3000 training step(s),cross entropy on all data is 0.00714436
After 4000 training step(s),cross entropy on all data is 0.00578471
[[-1.96182752 2.58235407 1.68203771]
[-3.46817183 1.06982315 2.11788988]]
[[-1.82471502]
[ 2.68546653]
[ 1.41819501]]
'''
相关文章推荐
- TensorFlow练手项目一:使用循环神经网络(RNN)实现影评情感分类
- 使用tensorflow实现的感知机进行文本分类
- Tensorflow使用slim工具(vgg16模型)实现图像分类与分割
- Tensorflow使用slim工具(vgg16模型)实现图像分类与分割
- 使用tensorflow实现简单的多分类问题
- 如何基于TensorFlow使用LSTM和CNN实现时序分类任务
- Tensorflow使用slim工具(vgg16模型)实现图像分类与分割
- 第1章:阿里云机器学习实践之路 / 第5节:深度学习--使用TensorFlow实现图像分类
- tensorflow 学习专栏(六):使用卷积神经网络(CNN)在mnist数据集上实现分类
- 如何使用TensorFlow实现音频分类任务
- 使用HTML5和jQuery插件Quicksand实现一个超酷的星际争霸2兵种分类展示效果
- 使用HTML5和jQuery插件Quicksand实现一个超酷的星际争霸2兵种分类展示效果
- 使用AspNetPager让当前分类下的商品实现高效分页显示
- 使用HTML5和jQuery插件Quicksand实现一个超酷的星际争霸2兵种分类展示效果
- 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示
- 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示
- 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示
- 使用hibernate实现树形结构无限级分类
- 使用hibernate实现树形结构无限级分类
- 使用Grails实现树形结构无限级分类