4.9软工日报(神经网络

发布时间 2023-04-09 22:46:37作者: -她的梦-

跟着书学了神经网络的一些最最最基本的内容,首先安装了numpy库,还有matplotlib库,第二个库是用来绘图用的。

其次还安装了

 

 这两个软件包用于将numpy数组的图片转化成其他维度和形状,当然还有很多其他功能,安装完这些库就够用了。

首先神经网络大致可分为三层,输入层,中间层和输出层,中间层可以有若干层。每一次都有若干个神经元。(神经网络的模型基于感知机。

相邻两层的神经元之间的箭头上面的w代表权重,神经元b代表的是偏置。

对于感知机来说,权重和加上偏置若大于0就返回1,若小于等于0就返回0.

接着是激活函数。激活函数的作用是将输入信号的总和转化为输出信号。神经元和节点含义相同。

对于激活函数而言,先介绍阶跃函数和sigmoid函数。阶跃函数以阈值为界,一旦输出超过阈值就切换输出。可以说感知机就使用了阶跃函数。

其次是sigmoid函数。h(x) = 1 / 1 + exp(-x) //在这里exp(x)函数的作用就是e的x次方。

import numpy as np
import matplotlib.pylab as plt


def step_fucntion(x):
    return np.array(x > 0, dtype=np.int_)


x = np.arange(-5.0, 5.0, 0.1)
y = step_fucntion(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

这是阶跃函数的图像和代码展示

 

 

import numpy as np
import matplotlib.pylab as plt


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

 

 这是sigmoid函数的图像。

 

sigmoid函数的平滑性对神经网络的学习具有重要意义。

sigmoid函数和阶跃函数都是非线性函数,如果使用线性函数的话,加深神经网络的层数就没有意义了。

其次是ReLU函数, h(x) = x (x>0) h(x) = 0 (x<=0)

然后是多维数组的运算。以下是多维矩阵运算的代码

import numpy as np
import matplotlib.pylab as plt


A = np.array([1,2,3,4])
print(A)
print(np.ndim(A))#返回数组的维数
print(A.shape)#返回的是一个元组

# 以下是矩阵的乘法运算
B = np.array([[1,2],[3,4]])
C = np.array([[5,6],[7,8]])
D = np.dot(B,C)
print(D)

特别要注意,从隐藏层到输出层,一般把激活函数h(x)换成σ(x)(读作sigma)

其次是输出层的设计。一般来说回归问题使用恒等函数,分类问题使用softmax()函数。

softmax函数 yk = exp(ak) /∑ exp(ai ) i是从0 到n 所有数, 然后分母进行求和。

以下是展示数据集第一张图片的代码

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image


def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[0]
label = t_train[0]
print(label)  # 5

print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 把图像的形状变为原来的尺寸
print(img.shape)  # (28, 28)

img_show(img)

这里的load_mnist对我们初学者来说就是一个黑盒,我们只知道怎么使用,但是不理解内部原理。

x_train是一个二维数据 第一维代表图片的数量,第二位代表每一个图片像素乘积数。 t_train是一个一位数组,代表所有分类的结果,分别存入一维数组中。

前两个是训练集,后两个是测试的数据。可以计算准确率。

其次是具体的实现代码

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax

//通过load_mnist函数获取到训练集和数据集  normalize代表是否将图像正规化 flatten代表是否展开输入图像(变成一位数组) one_hot_label为True时标签只存在0和1
t_train和t_test就是标签,如果one_hot_label为False时,这里t_test就代表从0-9的一维数组
def get_data(): (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False) return x_test, t_test //从pkl文件中读取权重的字典和偏置的字典,返回值是一个字典 def init_network(): with open("sample_weight.pkl", 'rb') as f: network = pickle.load(f) return network //返回计算之后,输出的值 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 //下面的代码用于计算正确率 x, t = get_data() network = init_network() accuracy_cnt = 0 for i in range(len(x)): y = predict(network, x[i]) p= np.argmax(y) # 获取概率最高的元素的索引 ,y是一个一维数组,argmax函数用来找出一维数组的最大值所对应的下标。 if p == t[i]: accuracy_cnt += 1 print("Accuracy:" + str(float(accuracy_cnt) / len(x)))