搭建神经网络基本构架

输入数据集

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))

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码爱撞墙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值