TensorFlow 和 Keras 来构建和训练一个简单的神经网络模型。我们来逐行解析它的功能
import tensorflow as tf
import numpy as np
tensorflow
:导入 TensorFlow 库,TensorFlow 是一个开源的机器学习框架。numpy
:导入 NumPy 库,它是 Python 中用于进行数组操作和科学计算的基础库。
构建神经网络模型
l1 = tf.keras.layers.Dense(units=3, activation='sigmoid')
l2 = tf.keras.layers.Dense(units=1, activation='sigmoid')
model = tf.keras.Sequential([l1, l2])
-
l1 = tf.keras.layers.Dense(units=3, activation='sigmoid')
:创建一个 全连接层(Dense Layer),该层有 3 个输出节点(units=3),使用sigmoid
激活函数。这意味着该层将输出 3 个值,每个值在 0 和 1 之间。 -
l2 = tf.keras.layers.Dense(units=1, activation='sigmoid')
:创建第二个全连接层,包含 1 个输出节点,并使用sigmoid
激活函数。该层输出一个值,表示模型的最终输出。 -
model = tf.keras.Sequential([l1, l2])
:创建一个 顺序模型(Sequential Model),将之前定义的两层(l1
和l2
)按顺序连接起来。这样,输入数据会先经过l1
层,然后传递到l2
层,最后得到输出。
定义优化器与模型编译
sgd = tf.keras.optimizers.SGD(learning_rate=0.9)
model.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['accuracy'])
-
sgd = tf.keras.optimizers.SGD(learning_rate=0.9)
:定义了一个 随机梯度下降优化器(SGD Optimizer),它的学习率为 0.9。学习率决定了在每次更新参数时步长的大小,较高的学习率可以加快训练,但也有可能导致模型震荡或不稳定。 -
model.compile(...)
:编译模型,指定:optimizer=sgd
:使用之前定义的 SGD 优化器。loss='binary_crossentropy'
:选择 二元交叉熵损失函数,适用于二分类问题。它衡量了预测概率和实际标签之间的差异。metrics=['accuracy']
:设置模型评估指标为 准确率(accuracy)。
准备数据
x = np.array([[1, 1], [1, -1], [-1, 1], [-1, -1], [0.7, 0.7], [0.7, -0.7], [-0.7, -0.7], [-0.7, 0.7]])
y = np.array([1, 1, 1, 1, 0, 0, 0, 0])
x
:这是输入数据集,每一行是一个样本,包含两个特征。可以理解为每个样本是一个二维空间中的坐标点(例如,[1,1]
,[1,-1]
等)。y
:这是标签数据集,表示每个输入数据对应的类别。1
表示正类,0
表示负类。
训练模型
model.fit(x, y, epochs=1000)
model.fit(x, y, epochs=1000)
:开始训练模型,使用x
作为输入数据,y
作为目标标签,训练 1000 个周期(epochs)。每个周期,模型都会根据输入数据和真实标签进行前向传播和反向传播,更新模型权重。
保存模型(使用 Keras 格式):
# 保存训练好的模型(Keras 格式)
model.save('my_model.keras')
总结:
这段代码构建了一个简单的 二分类神经网络模型,其输入数据有两个特征,模型有两层:
- 第一层有 3 个节点,使用
sigmoid
激活函数。 - 第二层有 1 个节点,输出一个值(0 或 1),表示类别。
训练过程中,使用 二元交叉熵损失函数 和 随机梯度下降优化器,并计算 准确率 作为评估指标。
模型将根据输入的 8 个样本训练 1000 个周期,以便学习如何将输入数据映射到相应的类别(1
或 0
)。
完整代码
test.py 训练模型
import tensorflow as tf
import numpy as np
# 创建int32类型的0维张量,即标量
l1=tf.keras.layers.Dense(units=3,activation='sigmoid')
l2=tf.keras.layers.Dense(units=1,activation='sigmoid')
model=tf.keras.Sequential([l1,l2])
sgd = tf.keras.optimizers.SGD(learning_rate=0.9)
model.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['accuracy'])
x=np.array([[1,1],[1,-1],[-1,1],[-1,-1],[0.7,0.7],[0.7,-0.7],[-0.7,-0.7],[-0.7,0.7]])
y=np.array([1,1,1,1,0,0,0,0])
model.fit(x,y,epochs=2000)
# 保存训练好的模型(Keras 格式)
model.save('my_model.keras')
test2.py加载模型并进行预测:
import tensorflow as tf
import numpy as np
# 加载训练好的模型
model = tf.keras.models.load_model('my_model.keras')
# 预测数据
nx = np.array([[2, 2], [0.1, 0.1], [1.1, 1.2], [0.3, 0.3]])
# 获取预测结果
predictions = model.predict(nx)
# 输出预测结果
print(predictions)
# 如果需要将概率转化为类别(0或1)
predicted_classes = (predictions > 0.9).astype(int)
# 输出最终的类别预测
print(predicted_classes)
视频分享
初识TensorFlow
https://v.douyin.com/ifG2mmLH/
复制此链接,打开Dou音搜索,直接观看视频!