Python的MNIST预测

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 库中的一个函数,用于创建一个指定形状的数组,并将所有元素初始化为零。

评论

发表评论

了解 数据控|突破是我们的每一步 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读