一、引言
本文是上一篇AI智能体研发之路-模型篇(四):一文入门pytorch开发的番外篇,对上文中pytorch的网络结构和tensorflow的模型结构部分进一步详细对比与说明(水一篇为了得到当天的流量卷哈哈,如果想更详细的了解pytorch,辛苦移步上一篇哈。
二、pytorch模型结构定义
def __init__(self, input_size, hidden_size, output_size): super(ThreeLayerDNN, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) # 第一层全连接层 self.fc2 = nn.Linear(hidden_size, hidden_size) # 第二层全连接层 self.fc3 = nn.Linear(hidden_size, output_size) # 输出层 self.sigmoid = nn.Sigmoid()
首先定义了一个名为`ThreeLayerDNN`的类,它是基于PyTorch框架的,用于构建一个具有三个全连接层(也称为密集层)的深度神经网络,特别适用于二分类问题。下面是对代码的详细解释:
- `__init__`: 这是Python中的构造函数,当创建`ThreeLayerDNN`类的新实例时会被调用。
- `super(ThreeLayerDNN, self).__init__()`: 这行代码调用父类的初始化方法。因为`ThreeLayerDNN`继承自PyTorch的`nn.Module`类,这一步确保了`ThreeLayerDNN`具有`nn.Module`的所有基本属性和方法。
- `self.fc1 = nn.Linear(input_size, hidden_size)`: 这里定义了神经网络的第一层全连接层(fully connected layer)。`input_size`是输入数据的特征数量,`hidden_size`是这一层的神经元数量。全连接层意味着输入数据的每个特征都将与这一层的每个神经元相连接。
- `self.fc2 = nn.Linear(hidden_size, hidden_size)`: 定义了第二层全连接层,结构与第一层相同,保持了相同的隐藏层大小,这在某些架构中用于加深网络而不立即增加模型复杂度。
- `self.fc3 = nn.Linear(hidden_size, output_size)`: 这是网络的输出层,其输入大小与隐藏层相同,输出大小为`output_size`,对于二分类问题,通常为1。
- `self.sigmoid = nn.Sigmoid()`: 这行代码定义了一个Sigmoid激活函数,它将在网络的输出层之后应用。Sigmoid函数将输出映射到(0, 1)之间,非常适合二分类问题,其中输出可以解释为属于正类的概率。
综上所述,这段代码构建了一个基础的神经网络结构,适合进行二分类任务,通过全连接层提取特征,并使用Sigmoid函数将网络输出转换为概率估计。
三、tensorflow模型结构定义
model = Sequential([ Dense(512, input_shape=(X_train.shape[1],)), # 第一层 Activation('relu'), Dense(512), # 第二层 Activation('relu'), Dense(1), # 输出层 Activation('sigmoid') # 二分类使用sigmoid ])
使用Keras库(现在是TensorFlow的一个部分)定义了一个简单的深度学习模型,具体来说是一个顺序(Sequential)模型,适用于进行二分类任务。下面是对这段代码的详细解释:
- Sequential模型: 这是一种线性堆叠层的模型,适合于简单的前向传播神经网络。
- Dense层: 也称为全连接层,每个神经元都与前一层的所有神经元相连。
Dense(512, input_shape=(X_train.shape[1],))
: 第一层,有512个神经元,input_shape=(X_train.shape[1],)
指定了输入数据的形状,这里假设X_train
是一个二维数组,其中每一行是一个样本,X_train.shape[1]
表示每个样本的特征数量。Dense(512)
: 第二层,同样有512个神经元,由于是在Sequential模型中,它自动接收前一层的输出作为输入。Dense(1)
: 输出层,只有一个神经元,适用于二分类问题。
- Activation层: 激活函数层,为神经网络引入非线性。
Activation('relu')
: 使用ReLU(Rectified Linear Unit)作为激活函数,它在输入大于0时输出输入值,小于0时输出0,有助于解决梯度消失问题。- 最后一层使用
Activation('sigmoid')
: 二分类任务中,输出层常用sigmoid激活函数,将输出映射到(0, 1)之间,便于解释为概率。
四、总结
两种框架在定义模型结构时思路基本相同,pytorch基于动态图,更加灵活。tensorflow基于静态图,更加稳定。