政安晨:【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(一)—— 单个神经元

政安晨的个人主页:政安晨****

欢迎 👍点赞✍评论⭐收藏

收录专栏: 政安晨的机器学习笔记

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

咱们在这篇文章中将了解与练习深度学习的构建模块--线性单元。

开始深度学习的入门练习

利用这个系列的文章,您即将学习到构建自己的深度神经网络所需的一切。

通过使用Keras和Tensorflow,您将学习以下内容:

× 创建一个全连接的神经网络架构

× 将神经网络应用于两个经典的机器学习问题:回归和分类

× 使用随机梯度下降训练神经网络

× 通过使用dropout、批归一化(batch normalization)和其他技术来提高性能。

咱们这个系列文章将通过完整的实例向您介绍这些主题,然后在练习中,您将更深入地探索这些主题,并将它们应用于真实世界的数据集中。

现在让我们开始!


深度学习究竟是什么?

最近几年人工智能领域最令人印象深刻的进展之一是深度学习领域。

自然语言翻译、图像识别和游戏玩耍等任务,深度学习模型已经接近甚至超过了人类水平的表现。

那么什么是深度学习呢?

深度学习是一种机器学习方法,其特点是深层次的计算堆叠。

这种计算的深度使得深度学习模型能够解开最具挑战性的真实世界数据集中的复杂和层次化模式。

通过其强大的能力和可伸缩性,神经网络已成为深度学习的定义模型。

神经网络由神经元组成,每个神经元仅执行简单的计算。

神经网络的强大之处在于这些神经元之间可以形成复杂的连接。

线性单元

让我们从神经网络的基本组件开始:单个神经元。

作为一个图示,具有一个输入的神经元(或单元)如下所示:

输入是x。它与神经元的连接具有权重w。

当一个值通过连接流动时,你将该值乘以连接的权重对于输入x,到达神经元的值为w * x。神经网络通过修改它的权重来"学习"。

b是一种特殊的重量,我们称之为偏置。偏置没有与之关联的输入数据

相反,我们在图中放置一个1,以使到达神经元的值只是b(因为1 * b = b)。偏置使神经元能够独立于其输入来修改输出。

y是神经元最终输出的值 。为了得到输出,神经元将通过其连接接收到的所有值相加起来。

这个神经元的激活函数y = w * x + b,也可以用公式表示为y=wx+b。

这个公式 y=wx+b 看起来熟悉吗?

这是一条直线的方程 !这是斜率截距方程,其中 w 表示斜率,b 表示 y 轴截距。

例子 - 以线性单元为模型

线性单元是一种常见的机器学习模型,用于解决回归和分类问题。它是一种简单的数学模型,可以表示为输入特征的加权和加上一个偏置项。

线性单元的数学表达式可以表示为

y = w1x1 + w2x2 + ... + wn*xn + b

其中,y是输出变量,x1, x2, ..., xn是输入特征,w1, w2, ..., wn是对应特征的权重,b是偏置项。

线性单元的训练目标是通过调整权重和偏置项,使得模型的输出与训练样本的真实值之间的差距尽可能小。

通过训练数据集,可以使用不同的优化算法(如梯度下降)来调整权重和偏置项,使得模型尽可能拟合训练数据,并在测试数据上有较好的泛化能力。

线性单元的优点是简单、易解释,并且在某些问题上具有很好的表现。然而,它也有一些限制,例如不能处理非线性关系、对异常值敏感等。

总之,线性单元是机器学习中常用的模型之一,它在许多问题上都能够提供良好的性能和解释能力。

尽管个体神经元通常只能作为更大网络的一部分发挥作用,但从单个神经元模型作为基线开始通常是有用的。单个神经元模型是线性模型。

让我们思考一下如何在一个像80种谷物的数据集上进行训练。

我们以'糖分'(每份的克数)作为输入,以'卡路里'(每份的卡路里)作为输出,可能会发现偏差是b=90,权重是w=2.5。我们可以用这个模型来估计每份含有5克糖分的谷物的卡路里含量,方法如下:

而且,根据我们的公式检验,我们有卡路里=2.5×5+90=102.5,正如我们所预期的一样。

多重输入

80种麦片数据集不仅仅含有"糖分"这一特征。如果我们想要扩展我们的模型,包括像纤维或蛋白质含量这样的特征,这很容易实现。我们只需为每个额外的特征添加更多的输入连接到神经元。为了找到输出,我们需要将每个输入与其连接权重相乘,然后将它们全部相加。

这个神经元的公式是y=w0x0+w1x1+w2x2+b 。具有两个输入的线性单元可以拟合一个平面,而具有更多输入的单元可以拟合一个超平面。

Keras中的线性单元

在Keras中创建模型的最简单方法是通过keras.Sequential,它将神经网络以一系列层的堆叠形式创建。

我们可以使用一个密集层(在以后的文章中咱们将学习更多)来创建像上面那样的模型。

我们可以这样 定义一个线性模型,接收三个输入特征**('sugars','fiber'和'protein')** ,并产生一个输出**('calories'):**

from tensorflow import keras
from tensorflow.keras import layers

# Create a network with 1 linear unit
model = keras.Sequential([
    layers.Dense(units=1, input_shape=[3])
])

使用第一个参数units ,我们定义了我们想要的输出数量。在这种情况下,我们只是预测"卡路里",所以我们将使用units=1。

使用第二个参数input_shape,我们告诉Keras输入的维度。设置input_shape = [3]确保模型将接受三个特征作为输入('sugars','fiber'和'protein')。

这个模型现在已经准备好拟合训练数据了!

为什么input_shape是一个Python列表?

在这个系列的文章中,我们将使用表格数据,类似于Pandas dataframe中的数据

我们将为数据集中的每个特征设置一个输入。特征以列的形式排列,所以我们将始终有input_shape=[num_columns]。

Keras在这里使用列表的原因是为了允许使用更复杂的数据集。例如,图像数据可能需要三个维度:[高度,宽度,通道]。

做个练习

在本文中,我们学习了神经网络的构建块:线性单元

我们看到,只有一个线性单元的模型可以将线性函数拟合到一个数据集上(等同于线性回归)。

在这个练习中,你将构建一个线性模型,并在Keras中进行一些实践工作。

(这个练习我们是在Kaggle中执行的,使用的数据已经由Kaggle准备好)

# Setup plotting
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
       titleweight='bold', titlesize=18, titlepad=10)

# Setup feedback system
from learntools.core import binder
binder.bind(globals())
from learntools.deep_learning_intro.ex1 import *

背景介绍

红葡萄酒质量数据集包括大约1600瓶葡萄牙红葡萄酒的理化测量数据。此外,还包括每瓶酒的品质评分,评分是通过盲品测试得出的。

首先,运行下一个单元格以显示该数据集的前几行数据。

import pandas as pd

red_wine = pd.read_csv('../input/dl-course-data/red-wine.csv')
red_wine.head()

您可以使用shape属性获取数据帧(或Numpy数组)的行数和列数。

red_wine.shape # (rows, columns)

1. 输入形状

我们能够从理化测量中准确预测葡萄酒的品质吗?目标是"品质 - quality",其余的列是特征。你会如何设置Keras模型在此任务中的input_shape参数?

# YOUR CODE HERE
input_shape = ____

# Check your answer
q_1.check()

检查:当您更新了初始代码后check()将告诉您您的代码是否正确。您需要更新创建变量input_shape的代码。

Lines below will give you a hint or solution code

#q_1.hint()

#q_1.solution()

2. 定义一个线性模型

线性模型是一种描述变量之间线性关系的数学模型。它假设因变量与自变量之间存在线性关系,并试图使用线性方程来表示这种关系。在线性模型中,因变量被假设为自变量的线性组合,通过调整模型的系数,可以找到最佳拟合于数据的线性关系。线性模型适用于许多领域,如统计学、经济学和机器学习等,它提供了一种简单而有效的方法来理解和预测变量之间的关系。

现在定义一个适合这个任务的线性模型。请注意模型应该有多少个输入和输出。

from tensorflow import keras
from tensorflow.keras import layers

# YOUR CODE HERE
model = ____

# Check your answer
q_2.check()

检查:当你更新了起始代码后,check()函数将告诉你你的代码是否正确。你需要更新创建模型变量的代码。

Lines below will give you a hint or solution code

#q_2.hint()

#q_2.solution()

3.查看权重

在内部,Keras使用张量来表示神经网络的权重

张量基本上是TensorFlow版本的Numpy数组,但有一些差异使其更适合深度学习。其中最重要的是,张量与GPU和TPU(张量处理器)加速器兼容。实际上,TPU是专门设计用于张量计算的。

一个模型的权重以张量列表的形式保存在其权重属性中。

获取您上面定义的模型的权重。(如果您愿意,您可以使用类似以下的代码显示权重: print("Weights\n{}\n\nBias\n{}".format(w, b)))。

# YOUR CODE HERE
w, b = ____

# Check your answer
q_3.check()

Lines below will give you a hint or solution code

#q_3.hint()

#q_3.solution()

顺便说一下,Keras使用张量来表示权重,并且也使用张量来表示数据。

当你设置input_shape参数时,你告诉Keras训练数据中每个示例的数组应该具有的维度。

设置input_shape=[3]会创建一个接受长度为3的向量(例如[0.2, 0.4, 0.6])的网络。

可选:绘制一个未经训练的线性模型的输出

我们将通过接下来的文章解决的问题是回归问题 ,目标是预测某个数值目标 。回归问题类似于"曲线拟合"问题:我们试图找到最适合数据的曲线。让我们来看一下线性模型产生的"曲线"。(你可能已经猜到了它是一条直线!)

我们在之前提到过,在训练模型之前,模型的权重是随机设置的。运行下面的单元格几次,看看不同的随机初始化产生的线条。(这个练习没有编码,只是一个演示。)

import tensorflow as tf
import matplotlib.pyplot as plt

model = keras.Sequential([
    layers.Dense(1, input_shape=[1]),
])

x = tf.linspace(-1.0, 1.0, 100)
y = model.predict(x)

plt.figure(dpi=100)
plt.plot(x, y, 'k')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
plt.xlabel("Input: x")
plt.ylabel("Target y")
w, b = model.weights # you could also use model.get_weights() here
plt.title("Weight: {:0.2f}\nBias: {:0.2f}".format(w[0][0], b[0]))
plt.show()

演绎如下:


相关推荐
一位小说男主24 分钟前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习
IT古董2 小时前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
凯哥是个大帅比2 小时前
人工智能ACA(五)--深度学习基础
人工智能·深度学习
海棠AI实验室2 小时前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
AIGC大时代3 小时前
如何使用ChatGPT辅助文献综述,以及如何进行优化?一篇说清楚
人工智能·深度学习·chatgpt·prompt·aigc
古希腊掌管学习的神4 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
martian6654 小时前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础