4.9软工日报(神经网络
跟着书学了神经网络的一些最最最基本的内容,首先安装了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)))