Python神经网络-常见的科学计算库中的易错点和技巧

文章说明:本文主要内容来自吴恩达老师的神经网络课程的课后练习,结合何宽的博客,希望能为大家更加通俗清晰地理解和解决一些在使用Python实现神经网络中可能遇到的一些问题。

常见的科学计算库中的易错点和技巧

矩阵相加

看一下下面的这两个随机数组“a”和“b”:

a = np.random.randn(2, 3) # a.shape = (2, 3)
b = np.random.randn(2, 1) # b.shape = (2, 1)
c = a + b

问数组c的维度是多少?

答: 因为B的列维数为1,所以先为B的列向量复制3次,使得A与B的行维数与列维数都相等,然后进行每项元素的相加,得:c.shape = (2, 3)

这个其实就是Python语法中的广播机制


另一种情况是A、B矩阵元素相乘,即A * B,只有当A与B的矩阵之间维数相等时,A、B才能相乘,若A矩阵的列数不等于B矩阵的列数,或A矩阵的行数不等于B矩阵的行数,则不能将两个矩阵相乘,程序会报错,如下:

a = np.random.randn(4, 3) # a.shape = (4, 3)
b = np.random.randn(3, 2) # b.shape = (3, 2)
c = a * b
# ValueError: operands could not be broadcast together with shapes (4,3) (3,2)

然而,当a,b矩阵的行数或列数中有一个相等时,乘法是可以成立的,如下:

# a,b矩阵的行数相等,列数不相等
a = np.random.randn(3, 3)
b = np.random.randn(3, 1)
c = a * b
"""
[[ 0.30044552  0.32163572  0.83089828]
 [-0.41384331  0.140933    0.20342014]
 [ 0.15084242 -0.24968459  0.06532467]]
"""

在这种情况下,将会使用广播机制,b会被复制三次,就会变成(3,3),再使用元素乘法。所以有: c.shape = (3, 3).

矩阵乘法

np.dot(a,b在a和b上执行矩阵乘法,而a * b执行元素方式的乘法。

例如下面的两个随机数组ab

a = np.random.randn(4, 3) # a.shape = (4, 3
b = np.random.randn(3, 2) # b.shape = (3, 2)
c = np.dot(a, b)

问c的维度是多少?

答: 两个矩阵相乘,获得的矩阵行数等于前一个矩阵的行数,列数等于后一个矩阵的列数c.shape = (4, 2)

广播机制的缺点

当使用numpy进行科学计算的时候,可能对产生一个秩为1的矩阵,例如:

import numpy as np
a = np.random.randn(5)
a.shape
# (5,)

此时,如果将a矩阵与a矩阵的转置相乘,你猜结果会如果

print(np.dot(a,a.T))
# 3.948322708713407

结果竟然得到一个数,而不是矩阵。

在来看看另一个例子:

A = np.random.randn(4,3)
B = np.sum(A, axis = 0)
B.shape

来猜测一些结果如何

答案是:(3,) 。这是因为对A矩阵进行行纵向相加后,返回了一个秩为1的矩阵。

那么为了确保A.shape(4,1)而不是(4,),则需要在sum函数中添加参数keepdims = True,这使我们的代码更加地严谨。

小结

在写神经网络时,不推荐使用类似的秩为1的矩阵,可能会造成一些误差。

但是可以将a转变为一个数组:

a = np.random.randn(5,1)
a.shape
# (5,1)

这个时候,就不会发生刚才的状况了。

小技巧

当自己不确定矩阵a的形状是否正确,则可以使用assert(a.shape==(m,n)来断言a的形状,此时如果a的形状错误,则程序会抛出异常,这样就不怕出错了。


未完待续~~~

### 使用全连接神经网络实现高风险低风险分类的方法 #### 数据准备 为了构建用于风险分类的全连接神经网络,首先需要准备好输入数据 \( X \) 标签数据 \( Y \)[^2]。在这个场景中,\( X \) 是经过预处理的企业特征数据文件(如 `new_base_info1.xlsx`),而 \( Y \) 则是从带有标注的企业数据文件(如 `enterprise_info.xlsx`)提取出来的二分类标签。 这些数据通常会被划分为训练集测试集,以便评估模型性能。划分比例可以根据具体需求调整,常见的做法是采用 80% 的数据作为训练集,剩余 20% 作为测试集。 #### 构建全连接神经网络 全连接神经网络的核心在于其结构设计以及权重矩阵 \( W \) 的初始化与更新过程。每一层中的神经元会与其前一层的所有神经元相连,形成完整的连接关系[^1]。以下是典型的全连接神经网络架构: 1. **输入层**: 输入维度由特征数量决定,假设企业特征数据包含 \( n \) 个特征,则输入层大小为 \( n \)。 2. **隐藏层**: 隐藏层数量及其节数可根据实际问题复杂度设定。一般情况下,增加隐藏层数可以提升表达能力,但也可能导致过拟合。 3. **输出层**: 对于二分类任务,输出层只有一个节,并使用激活函数(如 Sigmoid 或 Softmax)将结果映射到概率空间。 下面是一个简单的 Python 实现示例,基于 TensorFlow/Keras 完成上述描述的任务: ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout # 定义模型 model = Sequential([ Dense(64, activation='relu', input_shape=(n_features,)), # 假设 n_features= 特征数目 Dropout(0.5), # 添加 dropout 层防止过拟合 Dense(32, activation='relu'), Dense(1, activation='sigmoid') # 输出层,Sigmoid 函数适用于二分类 ]) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', # 适合二分类任务的损失函数 metrics=['accuracy']) # 训练模型 history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test)) ``` #### 参数优化 在训练过程中,神经网络的参数通过梯度下降法不断调整以最小化目标函数值。尽管现代框架能够自动计算梯度并执行反向传播操作,但在某些特殊场合仍需手动推导梯度公式[^3]。这一步骤虽然繁琐易错,但对于深入理解算法机制非常有益。 #### 性能评估 最后,在验证集或独立测试集上评价模型表现至关重要。常用的指标包括准确率 (Accuracy)、精确率 (Precision)、召回率 (Recall),以及 F1-Score 等综合考量标准。如果发现模型存在偏差或者方差过高现象,则可能需要重新审视超参设置或是引入正则项约束。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DEROOCE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值