这周学习了python的链表里的单向链表,卷积神经网络一些基础知识。
1、首先我们来介绍以下链表
链表里的每个节点都由一个数值和一个指针构成。这里面涉及了指针的知识。
链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。相比于数组,链表的一个主要优势是它的大小可以动态变化,因为节点可以在运行时添加或删除。链表可以分为单向链表、双向链表和循环链表三种类型。
单向链表中每个节点只有一个指针,指向下一个节点。从头节点开始,通过遍历指针依次访问每个节点。
双向链表中每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。这使得在链表中向前或向后遍历都很容易。
循环链表与单向或双向链表的不同之处在于,最后一个节点指向第一个节点,形成一个循环。这使得在链表中进行循环遍历时非常方便。
链表的缺点是,它的访问时间比数组更慢,因为链表的节点不是连续存储的,而是分散在内存中。此外,链表的插入和删除操作相对于数组更为高效,但是在访问链表的第n个元素时需要遍历前n-1个元素,所以查找链表中某个元素的时间复杂度是O(n)。
class Node:
def __init__(self, date):
self.date = date
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, date):
new_node = Node(date)
new_node.next = self.head
self.head = new_node
def insert_at_end(self, date):
new_node = Node(date)
if self.head is None:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
def insert_after_node(self, prev_node, date):
if prev_node is None:
print("Previous node is not in the link")
return
new_node = Node(date)
new_node.next = prev_node.next
prev_node.next = new_node
def delete_node(self, key):
curr_node = self.head
if curr_node and curr_node.data == key:
self.head = curr_node.next
curr_node = None
return
prev_node = None
while curr_node and curr_node.data != key:
prev_node = curr_node
curr_node = curr_node.next
if curr_node is None:
return
prev_node.next = curr_node.next
curr_node = None
def print_list(self):
curr_node = self.head
while curr_node:
print(curr_node.data)
curr_node = curr_node.next
这涉及了单向链表的定义、头部插入、尾部插入、中间插入、打印等
2、介绍一下权重、偏置项、激活函数和损失函数
1、权重(weights):权重是神经元之间的连接强度,用于控制输入信号在神经元之间的传递和转化。在神经网中,
每个神经元都有一组权重向量,用于对输入信号进行加权求和。权重是神经网络中最重要和最需要优化的参数之一,
其优化结果直接影响神经网络的性能和准确率。
2、偏置项(bias):偏置项是神经元的激活阈值,用于控制神经元的激活状态。在神经网络中,每个神经元都有一个
偏置项,用于调节神经元的输出值。偏置项通常被初始化为一个较小的常数值,以确保神经元的初始状态不会过于偏向某个方向,从而避免神经网络出现梯度消失或梯度爆炸等问题。
3、激活函数
在神经网络中,激活函数(activation function)用来处理神经元的输入信号,产生输出信号的一种数学函数。激活函数的主要作用是引入非线性因素,使得神经网络能够更好地适应复杂得输入数据。激活函数通常被应用于每个神经
元得输出值,将其转化为一个非线性得激活状态,从而使得神经网络能够更好地捕捉数据中得非线性关系。
常见得激活函数包括:
1、Sigmoid函数:Sigmoid函数是一种常用得激活函数,它将输入值映射到0到1之间的输出值,具有连续可导性和
可逆性等优点,但Sigmoid函数在输入值较大或者较小时,梯度会趋近于0,导致梯度消失问题。
2、ReLu函数:ReLU函数是一种简单而有效的激活函数,它将负数输入值直接设置为0,保持正数输入值不变。ReLu函数具有非线性特征和计算速度快等优点,但也存在输出值不可为负数的问题。
3、Tanh函数:Tanh函数是一种双曲正切函数,它将输入值映射到-1到1之间的输出值,具有Sigmoid函数的非线性特征,但对于输入值过大或过小,同样存在梯度消失问题。
4、Softmax函数:Softmax函数是一种常用的激活函数,主要用于多分类问题中,将神经元的输出值归一化到0到1之间,且所有输入值之和为1,方便进行分类任务的预测和概率计算等。
5、损失函数(loss function)是机器学习中用于衡量模型预测结果与真实结果之间差异的函数。在监督学习中,通常将损失函数定义为模型的预测结果与真实结果之间的差异(也称为误差或损失),并将其最小化。因此,损失函数是模型优化过程中的一个重要指标,优化的目标是使损失函数最小化。
常见的损失函数包括:
-
均方误差(Mean Squared Error,MSE):是回归问题中最常见的损失函数,它计算预测结果和真实结果之间的平均平方误差。
-
交叉熵(Cross Entropy):是分类问题中最常用的损失函数,它计算预测结果和真实结果之间的差异,通常用于二分类问题或多分类问题。
-
KL散度(Kullback-Leibler Divergence):也是分类问题中的一种损失函数,它测量两个概率分布之间的差异。
-
Hinge loss:是支持向量机(SVM)中常用的损失函数,主要用于分类问题,它将正确分类的预测结果(即预测结果和真实结果之间的差异为0)与错误分类的预测结果(即预测结果和真实结果之间的差异为正数)区分开来。
-
交叉熵损失(Binary Cross Entropy / Categorical Cross Entropy):是用于二分类或多分类问题的分类损失函数,通常与Sigmoid或softmax激活函数一起使用。