构建基础神经网络(实践篇)
构建基础神经网络主要分为四个步骤:定义训练数据定义神经层定义模型进行模型训练下面请听我一一为您道来:First:定义训练数据,这里采用Numpy随机定义训练数据import numpy as npx_data = np.linspace(-1, 1, 300)[:, np.newaxis]# 生成 xnoise = np.random.normal(0, 0.05, x_data.shape)#
·
构建基础神经网络主要分为四个步骤:
- 定义训练数据
- 定义神经层
- 定义模型
- 进行模型训练
下面请听我一一为您道来:
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运行代码时,出现以下问题
问度娘后,刚开始以为是TensorFlow2.x与python3.x版本不一致,于是又安装了python2.x版本,但还是报相同错误。以前在Pycharm中遇到类似情况,首先考虑的是软件没有安装TensorFlow包,那么Jupyter notebook上会不会也是类似状况?抱着试一试的态度,打开Anaconda命令框,使用conda list命令查看已安装的包
结果并没有发现TensorFlow包(有点小欣喜,我好像知道问题出在哪了),使用conda install tensorflow 命令安装TensorFlow(注:尽量选一个网速畅快的时间段,要不然TensorFlow的安装会是一段漫长的过程),安装好之后,重新重启Anaconda,重新导入 import tensorflow as tf 就可正常运行。
最后在此附上实验结果
1. 未使用Dropout前
2.使用Dropout后
结果分析:两个结果差别不是很大,主要是因为之前数据的选择比较规整,以后遇到新数据再拿来测试一下。
基础神经网络对应方法论请移步:
小记: 这个小问题阻碍了我一天的进度,归咎原因还是自己代码功底不扎实,浪费时间,实属劳民伤财,可怜我的电脑为安装python2.x整整跑了一天,罪过罪过。
常用的模型评价指标
- Acc 衡量的是模型的精确率,指被正确预测的样本占总样本的比例
- Precision 衡量的是模型的查准率,指模型识别出的文档数与识别的文档总数的比率
- Recall召回率(敏感度)衡量的是检索系统的查重率,指模型识别出的相关文档数和文档中所有的相关文档数的比率
- F值是精确率与召回率的调和平均数

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