学习笔记
1.3 需求预测
1.简化的单一神经元模型
*x
是学习算法的输入,在一般的机器学习算法中,我们使用f
作为输出,在神经网络中我们用a
代替f
,activation
代表激活量。
*我们可以将当前的逻辑回归算法看做一个简单的神经元模型,x作为神经元的输入,通过神经元的处理之后,输出activation,作为对其下游神经元的输入。
2.神经网络
*神经网络由多层神经网络层组成,每层的神经元可以多个或一个
*每层的神经元可以获取来自上一层神经网络层的所有特征
*中间的层一般称为隐藏层,因为这层的神经元获取上一层神经元的哪些信息以及这层神经元会输出多少激活量都是不需要我们去设置的,神经网络会自动设置
*本神经网络接收一个特征向量x,hidden layer接收特征向量,输出新的向量a传送到output layer,output layer输出最终的预测值
3.包含多层隐藏层的神经网络
1.4 举例-图像感知
1.如图所示是图像通过神经网络的识别过程
2.1 神经网络中的网络层 neural network layer
1.输入层一般为网络层0,我们通常使用右上方标,表明对应的参数是第几层网络层的数据
2.
2.2 更复杂的神经网络 more complex neural networks
1.按照惯例,我们说神经网络有四层的时候,包括所有的隐藏层,但不包含输入层。如图,本节的案例是一个四层神经网络。
2.
l是所在的网络层[0...]
,j是所在网络层内对应的神经元[1,2...]
a_j^l=g(**w_j*a_j^l-1**+b_j^l)
计算所在网络层单个神经元激活量
2.3 神经网络前向传播 forward propagation
1.layer_1的计算
2.layer_2的计算
3.layer_3的计算
4.前向传播,神经网络的激活值传播方向向前。这种类型的神经网络架构一般越接近输出层,隐藏层中神经元的数量越少。
3.1 如何用代码实现推理
1.Dense
是密集层,是神经网络层的一种类型Dense(units=25,activation='sigmoid')
表示创建一层神经网络,有25个神经元,用于计算的激活函数是sigmoid
3.2 Tensorflow中数据形式
1.
*[[...]]
和[...]
之间的区别在于,前者是一个(m,n)
的矩阵,后者是一个一维数组,没有行列的概念,只是一个列表
2.
*输入x采用矩阵形式[[...]]
tensorflow和numpy表示数据的方式有些不同,但tensor.numpy()
可以将tensor转化为numpy数组形式layer_(x)
得到的是一个tf.Tensor([[0.2 0.7 0.3]],shape=(1,3),dtype=float32)
是一个二阶张量
3.3 搭建一个神经网络
1.
*sequential framework
顺序串联网络层,构建神经网络
*训练神经网络需要调用2个函数model.compile(...)
和model.fit(x,y)
,后者在tensorflow中通过顺序串联的方式搭建神经网络,并使用数据x和y对其进行拟合
4.1 单个网络层上的前向传播 forward prop in a single layer
1.
*tips:我们这里统一用一维数组表示数据
4.2 前向传播的一般实现
1.
5.1 强人工智能
1.AI的分类为ANI和AGI,由于我们本身对人脑的研究工作尚未达到很高的境界,因此是否能达到AGI也未可知。
6.1 神经网络为何如此高效
1.
*利用GPU并行式计算,向量化的矩阵乘法使得神经网络变得高效
6.4 矩阵乘法代码
1.ndarray.T
对数组进行转置
2.Z=np.matmul(AT,W)
是矩阵乘法Z=AT*W
的代码化实现,我们也可以通过Z=AT@W
实现矩阵乘法
3.矩阵乘法的算法与代码实现
Labs
- lab1
- lab02
- lab03
C2
lab01 neurons and layers
1.引入tensorflow相关的包
...
import tensorflow as tf
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras import Sequential
from tensorflow.keras.losses import MeanSquaredError, BinaryCrossentropy
from tensorflow.keras.activations import sigmoid
...
tf.autograph.set_verbosity(0)
2.
创建单一神经元
1.linear_layer=tf.keras.layers.Dense(units=1,activation='linear')
,units表示创建的Dense密集神经网络层的神经元的数量,activation对应我们使用什么类型的激活函数去计算激活值。
2.a1=linear_layer(X_train[0].reshape(1,1))
*这里我们通过传入训练集对模型进行初始的训练,返回值为预测的y_hat
。
*在这种情形下,默认的参数w一般是随机设置的很小的数字,b一般默认为0,同样的,我们通过tensorflow得到的值依旧是张量
*需要注意的是,tensorflow接收的数据必须是一个矩阵,因此我们在传入训练集的时候需要对其进行reshape。
*a1的值是一个tensor张量,[[-0.01]],对应训练的结果
3.linear_layer.get_weights([np.array([[200.]]),np.array([100])])
设置训练参数
创建包含隐藏层的神经网络
1.
*Sequential顺序模型是一种简单的神经网络模型架构
*可以通过model.summary()
返回模型的信息,关于模型的层数,每层包含的参数等
可以通过model.get_layer('L1')
得到某一层神经网络,从而进行我们在上一小节中的操作,通过先设置好某一神经网络的参数再进行模型训练a1=model.predict(X_train[0].reshape(1,1))
返回经过神经网络训练得到的activation值
安装虚拟环境教程
1.https://blog.csdn.net/ZM_MY/article/details/129585895安装虚拟环境+吴恩达课程bug
2.https://zhuanlan.zhihu.com/p/94744929用conda创建虚拟环境泛化教程+常见conda命令
3.Keras和Tensorflow的关系
*在tf2.0版本之后,keras被集成到tf中,作为默认API使用
*Keras的版本与TensorFlow的版本是紧密相关的,因为它们之间存在依赖关系,精确到每一版
*TensorFlow 2.x支持Keras,但旧版本的TensorFlow可能需要不同版本的Keras
*在TensorFlow 2.0版本及以下,Keras是作为一个单独的软件包进行安装和使用的,并且可以与其他深度学习框架一起使用。
lab02 CoffeeRoasting_TF
1.虽然在本周的课程中没有提到,但是正如我们之前的课程提到的,对数据进行normalization标准化、对特征参数进行正则化regularization等,可以加速我们的计算过程。
2.在tensorflow中,我们创建Keras normalization layer,对数据进行标准化处理,但需要注意的是,这并不是包含在我们神经网络中的神经网络层。
3.一共分3步处理norm_1=tf.keras.layers.Normalization(axis=-1)
tf.keras.layers.Normalization是标准化连续特征的预处理层,axis默认为-1,表示其中输入的最后一个轴被假定为特征维度并按索引进行归一化处理。这里的操作是模型实例化,并设定需要标准化数据的标准维度。norm_1.adapt(X)
学习X的方差和均值等数据
*Xn=norm_1(X)
通过之前的数据对X进行标准化处理
4.建立神经网络
model=Sequential(
[
tf.Keras.Input(shape=(2,)),
Dense(3,activation='sigmoid',name='layer1'),
Dense(1,activation='sigmoid',name='layer2')
]
)
*`tf.Keras.Input(shape=(2,))`这句可以在实践中省去,此句限定了输入数据的特征维度,因为如果我们将当前神经网络层`l`输入的数据看作`a[l-1]`的话,就是一般是以A的形态传入的。![image.png](https://cdn.nlark.com/yuque/0/2023/png/26817966/1692624878385-fc3994c2-211e-483f-82d6-6b10a0cb3fa7.png#averageHue=%23f9f8f7&clientId=ud653cdef-148a-4&from=paste&height=145&id=u7d4867df&originHeight=181&originWidth=446&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=42179&status=done&style=none&taskId=u4ff1d121-c3b0-407e-bf2f-2a33475923b&title=&width=356.8)<br />*获取各层的权重与偏差`W,b=model.get_layer("layer1").get_weight()`,W对应的size`(features' number of input,neurons' number)`,b对应的size`(neurons' number,)`<br />![image.png](https://cdn.nlark.com/yuque/0/2023/png/26817966/1692625476155-6549355a-f04e-408a-af53-ecf1c291ddae.png#averageHue=%23faf9f8&clientId=ud653cdef-148a-4&from=paste&height=325&id=u061fccf9&originHeight=406&originWidth=681&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=48695&status=done&style=none&taskId=ub1e0e455-8788-4dd4-a818-c4062d54ef4&title=&width=544.8)<br />*`epochs`表示训练迭代的次数
model.compile(
loss = tf.keras.losses.BinaryCrossentropy(),
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01),
)
model.fit(
Xt,Yt,
epochs=10,
)
*
*我们的输入数据size是(m,2)
其中m是样本的数量
*因为我们已经标准化了输入特征,所以我们也必须标准化我们的测试数据
*要进行预测,可以应用model.predict(X)
方法