Bootstrap

TensorFlow 手动构建一个神经网络


TensorFlowKeras 来构建和训练一个简单的神经网络模型。我们来逐行解析它的功能

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),将之前定义的两层(l1l2)按顺序连接起来。这样,输入数据会先经过 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')

总结:

这段代码构建了一个简单的 二分类神经网络模型,其输入数据有两个特征,模型有两层:

  1. 第一层有 3 个节点,使用 sigmoid 激活函数。
  2. 第二层有 1 个节点,输出一个值(0 或 1),表示类别。

训练过程中,使用 二元交叉熵损失函数随机梯度下降优化器,并计算 准确率 作为评估指标。

模型将根据输入的 8 个样本训练 1000 个周期,以便学习如何将输入数据映射到相应的类别(10)。

完整代码
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音搜索,直接观看视频!

;