构建基础神经网络主要分为四个步骤:

  • 定义训练数据
  • 定义神经层
  • 定义模型
  • 进行模型训练

下面请听我一一为您道来:

First:定义训练数据,这里采用Numpy随机定义训练数据

import numpy as np

x_data = np.linspace(-1, 1, 300)[:, np.newaxis]    # 生成 x
noise = np.random.normal(0, 0.05, x_data.shape)    # 生成 noise
y_data = np.square(x_data) - 0.5 + noise           # 生成 y

x_data = x_data.reshape([-1, 1])    # 将 x 转换为维度为 (300, 1) 的矩阵

Second:定义神经层,需要定义一个使用 relu 激活函数的全连接层。自定义层需要继承 tf.keras.layers.Layer 类,并重写 init() 、 build() 和 call() 三个方法。

class LinearLayer(tf.keras.layers.Layer):    # 继承 tf.keras.layers.Layer 类
    def __init__(self, units):    # units 是输出张量的维度
        super().__init__()
        self.units = units

    def build(self, input_shape):
        self.w = self.add_weight(name='w',
            shape=[input_shape[-1], self.units], initializer=tf.zeros_initializer())    # 权重 w,初始化为 0,shape 为 [input_shape[-1], units]
        self.b = self.add_weight(name='b',
            shape=[self.units], initializer=tf.zeros_initializer())    # 偏置 b,初始化为 0,shape 为 [units]

    def call(self, inputs):
        y_pred = tf.nn.relu(tf.matmul(inputs,self.w) + self.b)    # y = relu(x * w + b)
        return y_pred

Third:定义模型MyModel,同样需要继承tf.keras.Model类,对__init__()和call()函数进行重写(注:这里的MyModel定义有点问题,后面有解释)

class MyModel(tf.keras.Model):    # 继承 tf.keras.Model 类
    def __init__(self):
        super().__init__()
        self.layer1 = LinearLayer(units=10)             # 自定义的全连接层
        self.layer2 = tf.keras.layers.Dense(units=1)    # tensorflow 的 Dense 层

    def call(self, inputs):
        x = self.layer1(inputs)    # 添加隐藏层
        output = self.layer2(x)    # 添加输出层
        return output

Fourth: 进行训练模型,但在此之前需要对模型进行实例化

model = MyModel()    # 实例化模型
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)    # 设置优化器为 Adam 优化器,学习率为 0.1
from sklearn.utils import shuffle

epoches = 10    # 设置迭代次数

for epoch in range(epoches):
    
    trainX, trainY =x_data[0:250], y_data[0:250]    # 取前 250 个数据为训练集
    
    with tf.GradientTape() as tape:    # 自动求导记录器
        y_pred = model(trainX)
        loss = tf.reduce_mean(tf.square(y_pred - trainY))    # 使用均方损失
        
    grads = tape.gradient(loss, model.variables)    # 使用 model.variables 这一属性直接获得模型中的所有变量
    optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))
    
    testX, testY = x_data[250:300], y_data[250:300]    # 取后 50 个数据为训练集
    y_pred_test = model(testX)
    loss_test = tf.reduce_mean(tf.square(y_pred_test - testY))
    print( " Average loss for epoch " + str (epoch) + ":" + str(loss_test.numpy()/50))    # 打印测试集的平均损失
    
    x_data, y_data = shuffle(x_data, y_data)    # 打乱数据

-------------------------------------------------------------------------------------

以上就是基础神经网络的大致结构,但通过结果显示,我们会发现一个问题,我们搭建的模型有点过拟合了( Overfitting

But 办法总比困难多,Dropout 的出现很好的可以解决这个问题。

class MyModelDrop(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.layer1 = LinearLayer(units=10)
        self.layer2 = tf.keras.layers.Dropout(rate=0.5)    # 添加 Dropout,参数 rate 用于指定 drop 的比例
        # 隐含节点 dropout 率等于 0.5 的时候效果最好,即 rate = 0.5,
        # 原因是 0.5 的时候 dropout 随机生成的网络结构最多。
        self.layer3 = tf.keras.layers.Dense(units=1)
        

    def call(self, inputs):
        x = self.layer1(inputs)
        x = self.layer2(x)
        output = self.layer3(x)
        return output
model = MyModelDrop()    # 实例化模型
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)

epoches = 10
for epoch in range(epoches):
    
    trainX, trainY =x_data[0:250], y_data[0:250]
    with tf.GradientTape() as tape:
        y_pred = model(trainX)
        loss = tf.reduce_mean(tf.square(y_pred - trainY))
    grads = tape.gradient(loss, model.variables)
    optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))
    
    testX, testY = x_data[250:300], y_data[250:300]
    y_pred_test = model(testX)
    loss_test = tf.reduce_mean(tf.square(y_pred_test - testY))
    print( " Average loss for epoch " + str (epoch) + ":" + str(loss_test.numpy()/50))
    
    x_data, y_data = shuffle(x_data, y_data)

主要内容就是以上这些,如果还有需要了解的其他典型模型,请在评论去留言。

补充: 在使用Jupyter noterbook运行代码时,出现以下问题

ModuleNotFoundError: No module named 'tersorflow'

问度娘后,刚开始以为是TensorFlow2.x与python3.x版本不一致,于是又安装了python2.x版本,但还是报相同错误。以前在Pycharm中遇到类似情况,首先考虑的是软件没有安装TensorFlow包,那么Jupyter notebook上会不会也是类似状况?抱着试一试的态度,打开Anaconda命令框,使用conda list命令查看已安装的包

conda list

结果并没有发现TensorFlow包(有点小欣喜,我好像知道问题出在哪了),使用conda install tensorflow 命令安装TensorFlow(注:尽量选一个网速畅快的时间段,要不然TensorFlow的安装会是一段漫长的过程),安装好之后,重新重启Anaconda,重新导入 import tensorflow as tf 就可正常运行。

在这里插入图片描述

最后在此附上实验结果
1. 未使用Dropout前

在这里插入图片描述

2.使用Dropout后

在这里插入图片描述

结果分析:两个结果差别不是很大,主要是因为之前数据的选择比较规整,以后遇到新数据再拿来测试一下。

基础神经网络对应方法论请移步:

构建基础神经网络(理论篇)

小记: 这个小问题阻碍了我一天的进度,归咎原因还是自己代码功底不扎实,浪费时间,实属劳民伤财,可怜我的电脑为安装python2.x整整跑了一天,罪过罪过。

常用的模型评价指标

  1. Acc 衡量的是模型的精确率,指被正确预测的样本占总样本的比例
  2. Precision 衡量的是模型的查准率,指模型识别出的文档数与识别的文档总数的比率
  3. Recall召回率(敏感度)衡量的是检索系统的查重率,指模型识别出的相关文档数和文档中所有的相关文档数的比率
  4. F值是精确率与召回率的调和平均数
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐