import numpy as np
import tensorflow as tf
def get_data():
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_test = x_test.reshape(-1, 28 * 28) / 255.0 # 展平并归一化
return x_test, y_test
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def softmax(x在神经网络中,初始化权重时乘以一个小的常数(如 0.01)是一个常见的做法,):
exp_x = np.exp(x - np.max(x)) # 防止溢出
return exp_x / exp_x.sum(axis=1, keepdims=True)
def predict(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)
return y
# 初始化网络
def initialize_network(input_size, hidden_size1, hidden_size2, output_size):
network = {}
network['W1'] = np.random.randn(input_size, hidden_size1) * 0.01
network['b1'] = np.zeros((1, hidden_size1))
network['W2'] = np.random.randn(hidden_size1, hidden_size2) * 0.01
network['b2'] = np.zeros((1, hidden_size2))
network['W3'] = np.random.randn(hidden_size2, output_size) * 0.01
network['b3'] = np.zeros((1, output_size))
return network
# 主程序
x, ti = get_data() # 获取测试数据和标签
network = initialize_network(28 * 28, 128, 64, 10) # 初始化网络
accuracy_cnt = 0
for i in range(len(x)):
y = predict(network, x[i:i+1]) # 预测时需要保持输入的形状
p = np.argmax(y)
if p == ti[i]:
accuracy_cnt += 1
accuracy = accuracy_cnt / len(x)
print(f'Accuracy: {accuracy * 100:.2f}%')
展开/折叠结果
Accuracy: 9.58%
在神经网络中,初始化权重时乘以一个小的常数(如 0.01)是一个常见的做法。如果权重初始化得太大,可能会导致在前向传播时激活值过大,从而在反向传播时产生非常大的梯度,导致梯度爆炸。相反,如果权重初始化得太小,可能会导致激活值接近于零,从而导致梯度消失。乘以一个小的常数可以帮助保持权重在一个合理的范围内,减少这些问题的发生。小的权重值可以使得神经元在初始阶段的输出更为平滑,避免在训练开始时产生过大的激活值。这有助于网络在训练初期更好地学习特征。
np.zeros 是 NumPy 库中的一个函数,用于创建一个指定形状的数组,并将所有元素初始化为零。





