代码实现比较简单
import tensorflow as tf
#通过Numpy工具包模拟数据集
from numpy.random import RandomState
batch_size=8#训练数据batch的大小
#定义神经网络的参数
# 输入层2个节点,第一个隐层3个节点,第二个隐层2个节点,输出一个节点
w1=tf.Variable(tf.random_normal([2,6],stddev=1,seed=1)) # 输入层到第一个隐层,权重矩阵是个2x6的矩阵
w2=tf.Variable(tf.random_normal([6,5],stddev=1,seed=1)) # 第一个隐层到第二个隐层,权重矩阵是个6x5的矩阵
w3=tf.Variable(tf.random_normal([5,1],stddev=1,seed=1)) # 第二个隐层到输出层,权重矩阵是个5x1的矩阵
#
x=tf.placeholder(tf.float32,shape=(None,2),name="x_input")
y_=tf.placeholder(tf.float32,shape=(None,1),name="y_input")
#定义神经网络前向传播的过程
z1=tf.matmul(x,w1)
a1=tf.tanh(z1)
z2=tf.matmul(a1,w2)
a2=tf.tanh(z2)
z3=tf.matmul(a2,w3)
y=tf.sigmoid(z3)
#定义损失熵和反向传播算法
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0))+(1-y)*tf.log(tf.clip_by_value(1-y,1e-10,1.0)))
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
### 训练集
# 通过随机数生成一个模拟数据集
# 生成以原点为中心,边长为4的正方形的点集
rdm=RandomState(1)
dataset_size = 128
X_train = rdm.uniform(-2,2,(dataset_size,2))
### 测试集
test = RandomState(2)
size = 1024
X_test = test.uniform(-10,10,(size,2))
# 给数据集定标签,两个坐标绝对值在1以内的,即在以原点为中心,边长为2的正方形内的点
# 都是1,外边的都是2
Y_train = [[int(abs(x1)<1 and abs(x2)<1)] for (x1,x2) in X_train]
Y_test = [[int(abs(x1)<1 and abs(x2)<1)] for (x1,x2) in X_test]
with tf.Session() as sess:
#初始化参数
init_op=tf.global_variables_initializer()
sess.run(init_op)
# print(sess.run(w1))
# print(sess.run(w2))
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_train[start:end],y_:Y_train[start:end]})
if (i+1) % 1000==0:
#每隔一段时间计算在所有数据集上的交叉熵并输出
total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X_train,y_:Y_train})
print("After %d training step(s), cross entropy on all data is %g"%(i+1,total_cross_entropy))
print(sess.run(w1))
print(sess.run(w2))
print(sess.run(w3))
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print("Train Accuracy:", accuracy.eval({x: X_train, y_: Y_train}))
print("Test Accuracy:", accuracy.eval({x: X_test, y_: Y_test}))