Sigmoid简单实现

import numpy as np

def sigmoid(x):
    ## 对正值与负值分别处理,避免溢出
    positive_mask = (x >= 0)
    negative_mask = ~positive_mask
    
    ## 处理正值
    result = np.zeros_like(x, dtype=float)
    result[positive_mask] = 1 / (1 + np.exp(-x[positive_mask]))
    
    ## 处理负值
    result[negative_mask] = np.exp(x[negative_mask]) / (1 + np.exp(x[negative_mask]))
    
    return result
    
    
z = np.array([[100000, 1, -1, -100000]])
result = sigmoid(z)
print(result)
[[1.         0.73105858 0.26894142 0.        ]]

Numpy整型数组向下截断问题

import numpy as np

a = np.array([[1, 2, 3, 4]])
a_int = np.zeros_like(a)
a_float = np.zeros_like(a, dtype=float)

a_sqrt = np.sqrt(a)
a_int[:] = np.sqrt(a)
a_float[:] = np.sqrt(a)
print("原始开平方结果:", a_sqrt)
print("不指定dtype时的结果:", a_int)
print("指定dtype时的结果:", a_float)
原始开平方结果: [[1.         1.41421356 1.73205081 2.        ]]
不指定dtype时的结果: [[1 1 1 2]]
指定dtype时的结果: [[1.         1.41421356 1.73205081 2.        ]]

 np.where()使用误区

import numpy as np

a = np.array([[10000, 1, 2, 3]])

print("表达式1、2都成立:", np.where(a >= 0, 1, 0))
print("表达式2溢出:", np.where(a>=0, 1, np.exp(a)))
表达式1、2都成立: [[1 1 1 1]]
表达式2溢出: [[1. 1. 1. 1.]]
/tmp/ipykernel_33/4034753557.py:6: RuntimeWarning: overflow encountered in exp
  print("表达式2溢出:", np.where(a>=0, 1, np.exp(a)))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用sigmoid算法实现前馈神经网络时,需要进行以下几个步骤: 1. 初始化参数:初始化权重和偏置值,可以使用随机数或者其他方法进行初始化。 2. 前向传播:通过计算每一层的加权输入和激活函数的输出,将输入数据从输入层传递到输出层。 3. 计算损失:根据预测值和真实值之间的差异,计算损失函数的值。 4. 反向传播:根据损失函数的值,计算每一层的梯度,并更新参数。 5. 重复步骤2-4,直到达到预定的迭代次数或者损失函数收敛。 下面是一个简单的用sigmoid算法实现前馈神经网络的代码示例: ```python import numpy as np # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 初始化参数 def initialize_parameters(layer_dims): parameters = {} L = len(layer_dims) for l in range(1, L): parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01 parameters['b' + str(l)] = np.zeros((layer_dims[l], 1)) return parameters # 前向传播 def forward_propagation(X, parameters): caches = [] A = X L = len(parameters) // 2 for l in range(1, L): Z = np.dot(parameters['W' + str(l)], A) + parameters['b' + str(l)] A = sigmoid(Z) caches.append((Z, A)) ZL = np.dot(parameters['W' + str(L)], A) + parameters['b' + str(L)] AL = sigmoid(ZL) caches.append((ZL, AL)) return AL, caches # 计算损失 def compute_cost(AL, Y): m = Y.shape cost = -np.sum(Y * np.log(AL) + (1 - Y) * np.log(1 - AL)) / m cost = np.squeeze(cost) return cost # 反向传播 def backward_propagation(AL, Y, caches): grads = {} L = len(caches) m = AL.shape Y = Y.reshape(AL.shape) dAL = - (np.divide(Y, AL) - np.divide(1 - Y, 1 - AL)) dZL = dAL * sigmoid(caches[L-1]) * (1 - sigmoid(caches[L-1])) grads['dW' + str(L)] = np.dot(dZL, caches[L-1].T) / m grads['db' + str(L)] = np.sum(dZL, axis=1, keepdims=True) / m for l in reversed(range(L-1)): dA = np.dot(parameters['W' + str(l+2)].T, dZ) dZ = dA * sigmoid(caches[l]) * (1 - sigmoid(caches[l])) grads['dW' + str(l+1)] = np.dot(dZ, caches[l].T) / m grads['db' + str(l+1)] = np.sum(dZ, axis=1, keepdims=True) / m return grads # 更新参数 def update_parameters(parameters, grads, learning_rate): L = len(parameters) // 2 for l in range(L): parameters['W' + str(l+1)] -= learning_rate * grads['dW' + str(l+1)] parameters['b' + str(l+1)] -= learning_rate * grads['db' + str(l+1)] return parameters # 定义前馈神经网络模型 def model(X, Y, layer_dims, learning_rate, num_iterations): parameters = initialize_parameters(layer_dims) for i in range(num_iterations): AL, caches = forward_propagation(X, parameters) cost = compute_cost(AL, Y) grads = backward_propagation(AL, Y, caches) parameters = update_parameters(parameters, grads, learning_rate) if i % 100 == 0: print("Cost after iteration {}: {}".format(i, cost)) return parameters # 示例数据 X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]]) Y = np.array([[0, 1, 1, 0]]) # 定义神经网络结构 layer_dims = [2, 4, 1] # 训练模型 parameters = model(X, Y, layer_dims, learning_rate=0.01, num_iterations=1000) ``` 这段代码实现了一个简单的前馈神经网络,其中使用了sigmoid函数作为激活函数。你可以根据自己的需求进行修改和扩展。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值