输入数据集
X、Y
X和Y在会话为x,y喂入数据
占位符:
x = tf.placeholder(tf.float32, [None, 2], name='x_input') #[None, 2]None指的batch size的大小,所以可以是任何数,2表示列为2
y = tf.placeholder(tf.float32, [None, 1], name='y_input') #[None, 1]表示列为1,行不定
构建前向传播:
W1 = tf.Variable(tf.random_normal([2, 4])) # 这里定义了一个1*10的变量,未被赋值,只有调用
b1 = tf.Variable(tf.random_normal([4], stddev=1, seed=1))
Wx_plus_b1 = tf.matmul(xs, W1) + b1
output1 = tf.nn.sigmoid(Wx_plus_b1) # 激活函数 sigmoid 用来对计算结果进行数值处理
W2 = tf.Variable(tf.random_normal([4, 2]))
b2 = tf.Variable(tf.random_normal([2], stddev=1, seed=1))
Wx_plus_b2 = tf.matmul(output1, W2) + b2
output2 = tf.nn.sigmoid(Wx_plus_b2)
# 输出层
W3 = tf.Variable(tf.random_normal([2, 1]))
b3 = tf.Variable(tf.random_normal([1], stddev=1, seed=1))
Wx_plus_b3 = tf.matmul(output2, W3) + b3
y = tf.nn.sigmoid(Wx_plus_b3) # 输出数据
非线性激励函数:
tf.nn.relu
tf.nn.sigmoid
tf.nn.tanh
损失函数和优化器:
均方误差损失函数:
loss = tf.reduce.mean(tf.square(y - y_))
train_step = tf.train.AdamOptimizer(0.001).minimize(loss) # 梯度下降法更新参数 0.1为学习率
初始化所有节点:
init = tf.global_variables_initializer() #还需要在会话中运行才有效
会话:
with tf.Session() as sess:
sess.run()
代码示例:
import matplotlib.pyplot as plt # 可视化库
import os
import numpy as np # 数据生成
import tensorflow as tf
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" # 防止出现错误代码134
# 通过随机数生成一个模型数据集
from numpy.random import RandomState
# 数据集参数
rdm = RandomState(1) # 使用随机种子1进行数据生成,也可设置为其他值
dataset_size = 512 # 数据个数
# 定义规则来给出样本的标签。在这里所有 x1*x1 + x2*x2 <1 的样例都被认为是正样本(比如零件合格),
# 而其他为负样本(比如零件不合格)。和 TensorFlow 游乐场中的表示法不大一样的地方是,
# 这里使用 0 来表示负样本,1 来表示正样本。大部分解决分类问题的神经网络都会采用0和1的表示方法。
X = rdm.randn(dataset_size, 2) # X 的 shape 是 dataset_size*2
Y = np.array([[int(x1 * x1 + x2 * x2 < 1)] for (x1, x2) in X]) # Y 会生成取值为 0 或 1 的序列
print("X.shape=", X.shape)
print("Y.shape=", Y.shape)
# 数据可视化
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
for i in range(dataset_size):
if Y[i] == 1:
plt.scatter(X[i, 0], X[i, 1], color='#2B91D5') # 标签为 1 的数据涂成蓝色
else:
plt.scatter(X[i, 0], X[i, 1], color='#F79709') # 标签为 0 的数据涂成橙色
# 设置绘图区域
ax.set_xlim(-3.5, 3.5)
ax.set_ylim(-3.5, 3.5)
# 绘制图像
plt.show()
# 神经网络结构定义
# 输入层
xs = tf.placeholder(tf.float32, [None, 2], name='x_input') # xs起名x_input,会在图形上显示
ys = tf.placeholder(tf.float32, [None, 1], name='y_input') # ys起名y_input,会在图形上显示
# 隐藏层
# 四节点
W1 = tf.Variable(tf.random_normal([2, 4])) # 这里定义了一个1*10的变量,未被赋值,只有调用tf.global_variables_initializer()初始化后才被赋值
b1 = tf.Variable(tf.random_normal([4], stddev=1, seed=1))
Wx_plus_b1 = tf.matmul(xs, W1) + b1
output1 = tf.nn.sigmoid(Wx_plus_b1) # 激活函数 sigmoid 用来对计算结果进行数值处理
W2 = tf.Variable(tf.random_normal([4, 2]))
b2 = tf.Variable(tf.random_normal([2], stddev=1, seed=1))
Wx_plus_b2 = tf.matmul(output1, W2) + b2
output2 = tf.nn.sigmoid(Wx_plus_b2)
# 输出层
W3 = tf.Variable(tf.random_normal([2, 1]))
b3 = tf.Variable(tf.random_normal([1], stddev=1, seed=1))
Wx_plus_b3 = tf.matmul(output2, W3) + b3
y = tf.nn.sigmoid(Wx_plus_b3) # 输出数据
# 损失函数
loss = -tf.reduce_mean(
ys * tf.log(tf.clip_by_value(y, 1e-10, 1.0)) +
(1 - ys) * tf.log(tf.clip_by_value(1 - y, 1e-10, 1.0))) # 交叉熵损失函数
train_step = tf.train.AdamOptimizer(0.001).minimize(loss) # 梯度下降法更新参数 0.1为学习率
# 初始化
init = tf.global_variables_initializer()
step = 10001
with tf.Session() as sess:
sess.run(init)
# 训练
for i in range(step):
sess.run(train_step, feed_dict={xs: X, ys: Y})
if i % 1000 == 0:
# 计算所有数据的损失
total_loss = sess.run(loss, feed_dict={xs: X, ys: Y})
# 输出损失函数
print("在{:>5}次迭代后,损失函数计算值为{:.4}".format(i, total_loss))