小白学CNN以及Keras的速成(2)
首先在理解CNN之前,我们有必要先理解一下什么是神经网络,这样我们才能开始了解更高级的卷积神经网络。
要学习神经网络当然有很多途径,网上不少的大牛写了很多攻略,有的推崇从理论到工程完成深度学习,有的希望从工程出发发现问题,解决问题。各种各样的方式都有不同的人去尝试,攻略也是一大推,这使得不少的小白直接倒在了选择材料的路上,一直在补先修知识,待到热情结束就放弃了学习,连卷积网络都不知道是什么,大大地打击了大家的学习热情。今天,sherlock在这里给大家推荐一个学习材料,保证你能够快速入门cnn,出去装逼也能够和别人聊几句。
这个材料是什么呢,就是大名鼎鼎的standford的cs231n这门课程 http://cs231n.github.io/ stanford大学确实算是深度学习和人工智能领域非常牛逼的学校。
神经网络
废话不多说,我们开始学习我们的神经网络。
neuron.png这是一张脑神经的图片,神经网络的发明也是由此开始的,这就是所谓的一个神经元,上面有各种接受突触,然后通过一个脑神经来接受,最后得到输出的结果。
那么由这张脑神经图能够抽象出来的神经网络是什么呢?就是下面这个神经网络模型。
neuron_model.png
这个怎么理解呢?就是输入一个向量,然后给向量的每一个元素分配一个权重,然后通过权重求和得到一个结果,然后将这个结果输入一个激活函数,得到最后的输出结果。
激活函数又是什么鬼?激活函数的出现是因为人脑的构造,人脑里面接受信息得到结果这个过程是非线性的,比如你看到一样东西,你不可能保留这个东西的全部特征,你会重点观察你感兴趣的地方,这就是非线性的,也就是说需要一个非线性变化将输入的结果变换为非线性的结果。现在常用的非线性函数就是Relu(x) = max(x, 0),就是将小于0的部分去掉,只保留大于0的部分。
这就是个单元的输入和输出,将这些单元合在一起就是一个神经网络。
neural_net.png这就是简单的一层网络,也可以由多层网络
neural_net2.png这里面的input layer就是所谓的单个训练集的维数,将所有的训练集输入就可以开始训练一个神经网络。
Keras实现简单的神经网络
知道了神经网络的基本结构和原理,如果大家还记得我前面一篇文章说的工具keras,我们可以开始使用keras去实现一个简单的神经网络。
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
导入必要的package
x = np.array([[0, 1, 0], [0, 0, 1], [1, 3, 2], [3, 2, 1]])
y = np.array([0, 0, 1, 1]).T
设定输入的x和y
simple_model = Sequential()
simple_model.add(Dense(5, input_shape=(x.shape[1],), activation='relu', name='layer1'))
simple_model.add(Dense(4, activation='relu', name='layer2'))
simple_model.add(Dense(1, activation='sigmoid', name='layer3'))
输入一个三层的神经网络,中间的hidden layer的元素个数是5和4,最后一层输出一个结果
simple_model.compile(optimizer='sgd', loss='mean_squared_error')
complie这个简单的模型
simple_model.fit(x, y, epochs=20000)
训练20000次模型
simple_model.predict(x[0:1])
可以预测一下第一个输入的x的结果与实际的是否相符
这就是一个简单三层网络的keras实现,下一篇文章我们将正式进入Convolutional Neural Network