摘要:本文介绍了使用TensorFlow实现异或(XOR)运算的方法。首先通过真值表分析异或运算特性,并说明其在加密领域的应用价值。核心实现采用两层神经网络,包含输入层(2节点)、隐藏层(2节点)和输出层(1节点),使用Sigmoid激活函数和交叉熵损失函数。代码演示了完整的训练过程,包括前向传播、梯度下降优化等关键步骤,最终模型能准确预测异或运算结果(输入[0,0]→0,[0,1]→1等)。该实现展示了神经网络解决非线性问题的能力,为理解更复杂的深度学习模型奠定基础。
目录
[TensorFlow 实现异或(XOR)运算](#TensorFlow 实现异或(XOR)运算)
TensorFlow 实现异或(XOR)运算
本章我们将学习如何使用 TensorFlow 实现异或(XOR)运算。在开始代码实现前,先来看异或运算的真值表,这能帮助我们理解其背后的逻辑,也为后续相关的加解密应用打下基础。
| A | B | A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
异或加密法是一种常用的数据加密方式,这种加密方式很难通过暴力破解法破解 ------ 暴力破解需要生成大量随机密钥去匹配正确的加密密钥,而异或加密的特性让这一过程的难度大幅提升。
异或加密的核心思路是:先定义一个异或加密密钥,再将需要加密的字符串中每个字符与该密钥执行异或运算,从而完成加密。接下来,我们重点讲解如何使用 TensorFlow 实现异或运算,具体代码与解析如下:
python
运行
python
# 导入所需模块
import tensorflow as tf
import numpy as np
"""
用简单的numpy相关思路实现异或门,帮助理解反向传播算法
"""
# 定义输入x的占位符,形状为[4,2],对应4组输入、每组2个特征
x = tf.placeholder(tf.float64, shape = [4,2], name = "x")
# 定义目标输出y的占位符,形状为[4,1],对应4组输入的目标结果
y = tf.placeholder(tf.float64, shape = [4,1], name = "y")
# 获取训练样本数量
m = np.shape(x)[0]
# 获取特征维度数
n = np.shape(x)[1]
# 定义隐藏层的节点数
hidden_s = 2
# 初始化学习率
l_r = 1
# 定义第一层权重参数theta1,随机初始化并转换为float64类型
theta1 = tf.cast(tf.Variable(tf.random_normal([3,hidden_s]), name = "theta1"), tf.float64)
# 定义第二层权重参数theta2,随机初始化并转换为float64类型
theta2 = tf.cast(tf.Variable(tf.random_normal([hidden_s+1,1]), name = "theta2"), tf.float64)
# 前向传播计算
# 为输入添加偏置列(全1列),拼接后形状为[4,3]
a1 = tf.concat([np.c_[np.ones(x.shape[0])], x], 1)
# 第一层输入与权重矩阵相乘,得到隐藏层未激活值
z1 = tf.matmul(a1, theta1)
# 隐藏层值经Sigmoid激活后,添加偏置列,拼接后形状为[4,3]
a2 = tf.concat([np.c_[np.ones(x.shape[0])], tf.sigmoid(z1)], 1)
# 隐藏层输出与第二层权重矩阵相乘,得到输出层未激活值
z3 = tf.matmul(a2, theta2)
# 输出层值经Sigmoid激活,得到最终预测概率
h3 = tf.sigmoid(z3)
# 定义代价函数(交叉熵损失)
cost_func = -tf.reduce_sum(y*tf.log(h3)+(1-y)*tf.log(1-h3), axis = 1)
# 定义优化器:使用梯度下降优化器,按指定学习率最小化代价函数,求解参数theta
optimiser = tf.train.GradientDescentOptimizer(learning_rate = l_r).minimize(cost_func)
# 设置异或运算的输入X和目标输出Y
X = [[0,0],[0,1],[1,0],[1,1]]
Y = [[0],[1],[1],[0]]
# 初始化所有变量,创建并启动TensorFlow会话
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
# 迭代执行梯度下降,更新参数并按间隔打印预测结果
for i in range(100000):
# 喂入数据,执行优化器进行参数更新
sess.run(optimiser, feed_dict = {x:X, y:Y})
# 每100次迭代打印一次训练轮数和当前预测结果
if i%100 == 0:
print("Epoch:",i)
print("Hyp:",sess.run(h3, feed_dict = {x:X, y:Y}))
上述代码运行后会输出迭代过程中的训练日志,核心输出内容如下(部分格式因原输出排版调整,保留核心数值):
plaintext
python
(tensorflow环境激活日志略)
2018-10-14 2:46:47,201692: 你的CPU支持本TensorFlow二进制包未编译的指令集:AVX2
Epoch: 0
Hyp: [[0.63288386]
[0.5414331 ]
[0.49292491]
[0.414657 ]]
Epoch: 100
Hyp: [[0.29766657]
[0.7xxxxxxx]
[0.7xxxxxxx]
[0.2406423 ]]
Epoch: 200
Hyp: [[0.021275 ]
[0.97513787]
[0.97511471]
[0.03630443]]
Epoch: 300
Hyp: [[0.01123027]
[0.9902101 ]
[0.9902101 ]
[0.017753 ]]
Epoch: 400
Hyp: [[0.00733329]
[0.99221703]
[0.9922128 ]
[0.01161882]]
Epoch: 500
Hyp: [[0.00542715]
[0.99xxxxxx]
[0.99xxxxxx]
[0.0085848 ]]
Epoch: 600
Hyp: [[0.004311 ]
[0.99546302]
[0.99546116]
[0.007914 ]]
核心术语与代码解析
- 异或加密(XOR Cipher) :利用异或运算的特性(
a XOR b XOR b = a)实现的轻量加密方式,加密和解密使用同一个密钥,属于对称加密的一种。 - 前向传播(forward propagation):神经网络的基础计算过程,从输入层开始,依次经过隐藏层、输出层,逐层计算得到预测结果的过程。
- Sigmoid 激活函数:常用的非线性激活函数,将数值映射到 0~1 之间,适合二分类任务的输出层,也可用于隐藏层引入非线性。
- 交叉熵损失(cross entropy):二分类任务的经典损失函数,用于衡量模型预测的概率分布与真实标签的差异,越接近 0 表示预测越准确。
- 偏置列(bias column):在输入中拼接全 1 的列,用于融合模型的偏置参数,让权重矩阵的乘法能同时完成加权和加偏置的计算,简化网络结构。
- tf.cast:TensorFlow 中用于张量类型转换的函数,此处将随机初始化的 float32 类型权重转换为 float64,保证计算精度一致。