#!/usr/bin/env python
import tensorflow as tf
#numpy 是一个科学计算工具包,这里通过numpy工具包生成模拟数据集
from numpy.random import RandomState
#定义数据batch的大小
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))
#在shape的一个维度上使用NOne可以方便使用不大的batch大小,在训练是需要把数据分成小的batch。
# 但是在测试的时候,可以一次性使用全部的数据。当数据集比较小时比较放便测试,但是数据集比较时
#将大量数据放入一个batch可能导致内存溢出
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)
#定义损失函数和反向传播算法
cross_entropy=-tf.reduce_mean(
y_*tf.log(tf.clip_by_value(y,1e-10,1.0))
)
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#通过随机数生成模拟数据,种子是1
rdm=RandomState(1)
dataset_size = 128
#生成128行2列的矩阵
X=rdm.rand(dataset_size,2)
#print(X)
#定义规则来给出样本的标签,在这里所有x1+x2<1 的样例都被认为是正样本(比如零件的合格),而其他为负样本(比如零件不合格)
#和tensorflow游乐场中表示法不一样的地方是,在这里使用0表示负样本,1表示正样本,大部分解决分类问题的神经网络都会采用0和1
#的表示方法
Y=[[int(x1+x2<1)] for (x1,x2) in X]
#创建一个回话来运行tensorflow,利用python with 防止资源泄露和浪费
with tf.Session() as sess:
init_op=tf.initialize_all_variables()
sess.run(init_op)
print('训练前 W1:\n',sess.run(w1))
print('训练前 W2:\n',sess.run(w2))
'''
在训练之前神经网络参数的值:
[[-0.81131822 1.48459876 0.06532937]
[-2.4427042 0.0992484 0.59122431]]
[[-0.81131822]
[ 1.48459876]
[ 0.06532937]]
'''
STEPS=5000
for i in range(STEPS):
#每次选取batch个样例进行训练
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]}
)
if i % 1000 ==0:
#每隔一段时间计算所有数据上的交叉商并输出
total_cross_entroy=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_entroy))
'''
输出结果:
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
通过结果发现随着训练进行,交叉商在逐渐变小,
说明预测的结果和真实结果的差距越小
'''
print('训练后 W1:\n',sess.run(w1))
print('训练后 W2:\n',sess.run(w2))
tensorflow 学习 demo(-)
最新推荐文章于 2022-09-16 13:51:41 发布