咱们在这篇文章中将了解与练习深度学习的构建模块--线性单元。
开始深度学习的入门练习
利用这个系列的文章,您即将学习到构建自己的深度神经网络所需的一切。
通过使用Keras和Tensorflow,您将学习以下内容:
咱们这个系列文章将通过完整的实例向您介绍这些主题,然后在练习中,您将更深入地探索这些主题,并将它们应用于真实世界的数据集中。
现在让我们开始!
深度学习究竟是什么?
最近几年人工智能领域最令人印象深刻的进展之一是深度学习领域。
自然语言翻译、图像识别和游戏玩耍等任务,深度学习模型已经接近甚至超过了人类水平的表现。
那么什么是深度学习呢?
通过其强大的能力和可伸缩性,神经网络已成为深度学习的定义模型。
神经网络由神经元组成,每个神经元仅执行简单的计算。
神经网络的强大之处在于这些神经元之间可以形成复杂的连接。
线性单元
让我们从神经网络的基本组件开始:单个神经元。
作为一个图示,具有一个输入的神经元(或单元)如下所示:
输入是x。它与神经元的连接具有权重w。
当一个值通过连接流动时,你将该值乘以连接的权重。对于输入x,到达神经元的值为w * x。神经网络通过修改它的权重来"学习"。
b是一种特殊的重量,我们称之为偏置。偏置没有与之关联的输入数据;
相反,我们在图中放置一个1,以使到达神经元的值只是b(因为1 * b = b)。偏置使神经元能够独立于其输入来修改输出。
y是神经元最终输出的值。为了得到输出,神经元将通过其连接接收到的所有值相加起来。
这个公式 y=wx+b 看起来熟悉吗?
这是一条直线的方程!这是斜率截距方程,其中 w 表示斜率,b 表示 y 轴截距。
例子 - 以线性单元为模型
尽管个体神经元通常只能作为更大网络的一部分发挥作用,但从单个神经元模型作为基线开始通常是有用的。单个神经元模型是线性模型。
而且,根据我们的公式检验,我们有卡路里=2.5×5+90=102.5,正如我们所预期的一样。
多重输入
这个神经元的公式是 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')。
这个模型现在已经准备好拟合训练数据了!
做个练习
在本文中,我们学习了神经网络的构建块:线性单元。
我们看到,只有一个线性单元的模型可以将线性函数拟合到一个数据集上(等同于线性回归)。
在这个练习中,你将构建一个线性模型,并在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的代码。
2. 定义一个线性模型
现在定义一个适合这个任务的线性模型。请注意模型应该有多少个输入和输出。
from tensorflow import keras
from tensorflow.keras import layers
# YOUR CODE HERE
model = ____
# Check your answer
q_2.check()
检查:当你更新了起始代码后,check()函数将告诉你你的代码是否正确。你需要更新创建模型变量的代码。
3.查看权重
在内部,Keras使用张量来表示神经网络的权重。
张量基本上是TensorFlow版本的Numpy数组,但有一些差异使其更适合深度学习。其中最重要的是,张量与GPU和TPU(张量处理器)加速器兼容。实际上,TPU是专门设计用于张量计算的。
# YOUR CODE HERE
w, b = ____
# Check your answer
q_3.check()
顺便说一下,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()
演绎如下: