一边学,一边写出的人工智能教程(一)


  (keras安装可参考个人文章:Windows 下 Python 3.6 下安装 TensorFlow,和pyopencl不要紧)python


  首先,你要有一些数学和哲学知识,好比:
小程序

  • 据说过【向量】 (知道能够把数写成(1,2,3,4)这种形式便可)数组

  • 懂一点【抽象】,能提炼出一些事物的关联 (好比,汽车和自行车有什么共同点?)网络

  • 能不看教程写出python小程序(好比打印helloworld)dom

  • (技巧:看不很懂就试图“观其大略”)
    ide


  对于向量,若是想进一步了解,能够参考视频:函数

  3Blue1Brown的视频教程(线性代数) 工具

  (你至少会从中习惯,能够把向量竖着写)测试


  接下来的三个视频也是一样的来源。显然他们说的比我好,我只须要放连接……翻译

  3Blue1Brown的视频教程(神经网络)1

  3Blue1Brown的视频教程(神经网络)2

  3Blue1Brown的视频教程(神经网络)3 (分上下篇)


  再放一个:(我是按顺序放的)

  知乎回答(卷积层)(卷积神经网络简称CNN)

  (做者:地球的外星人君;来源:知乎)


  下面的代码就出自上方回答。但我处理了一下,写成了伪代码……

### 准备原料

### 制做饲料

### 制做猫

### 喂猫


  (笑)大概就是这么个过程,虽然比较抽象,但可以说明问题。具体一点的话,第一步是这样的:

### 准备原料!
import numpy

from keras.datasets import mnist
        # data数据,set集合,datasets数据集;    mnist是一个著名的数字图像识别数据集

from keras.models import Sequential
        # model模型;    Sequential 序贯模型(应该就是最简单的模型——层与层相继链接而已)

from keras.layers import Dense
        # layer层;    dense密集的(多是指普通的一层)

from keras.layers import Dropout
        # dropout丢弃

from keras.layers import Flatten
        # flatten压平,numpy中此名称对应函数是把无论多少维的矩阵中的数 列为一行

from keras.layers.convolutional import Conv2D
        # convolutional卷积;    Conv2D大概是2维卷积

from keras.layers.convolutional import MaxPooling2D
        # MaxPooling 区域中共同最大值 (记得那个回答中的“池化”么)

from keras.utils import np_utils
        # util工具;    np应该是numpy

seed = 7
numpy.random.seed(seed)
        # 随机数初始化,seed种子(若是你知道个人世界种子,就很好理解)
        # 种子随机就是说,用同一个种子会生成同一个随机数列,即便反复运行


  第二步:(你可能须要事先理解多维数组)

  (代码较宽,向右选中文字能够移动)

### 制做饲料!

# 加载信息
(X_train, y_train), (X_test,y_test) = mnist.load_data()
        # 两个X都是列表,其元素为图像(二维矩阵表示);两个y也都是列表,其元素是X中图像对应的数字;train表示训练用,test表示测试用

# 使信息成为模型能处理的格式
X_train = X_train.reshape(X_train.shape[0],28, 28,1).astype('float32')
        # (张量,英文tensor,0维张量是标量,1维是向量,2维是矩阵,3维大概是立方阵,等等)
        # n维张量的shape是由各维度上的元素个数组成的n元向量,好比三阶方阵的shape是(3,3)
        # reshape就是把矩阵按顺序展平后从新拼(好比全是1的三阶方阵通常是这么表示的:[[1,1,1],[1,1,1],[1,1,1]],展平就是只留最外层括号)
        # 另:最后一个1是图像通道数,灰度图天然是1,三色应该就是3

X_test = X_test.reshape(X_test.shape[0],28, 28,1).astype('float32')
        # 整数类型化为浮点类型

X_train = X_train / 255
X_test = X_test / 255
        # (0-255 -> 0-1)

y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
        # 序列化,即用[1,0,0,0,0,0,0,0,0,0] 代替 0,[0,1,0,0,0,0,0,0,0,0] 代替 1,[0,0,1,0,0,0,0,0,0,0] 代替 2,等等,
        # 记得3Blue1Brown视频里输出的样子么?一列

num_classes = y_test.shape[1]
        # 结果数量


  第三步:

### 制做猫!

def baseline_model():

	model = Sequential()
	        # 建一个空的“序贯模型”

	model.add(Conv2D(32, (3, 3), padding='valid', input_shape=(28, 28,1), activation='relu'))
	model.add(MaxPooling2D(pool_size=(2, 2)))
	        # 添加卷积层

	model.add(Conv2D(15, (3, 3), padding='valid' ,activation='relu'))
	model.add(MaxPooling2D(pool_size=(2, 2)))
	        # 彷佛是再加一个卷积层    (导入部分已经翻译了函数名称)

	model.add(Flatten())
	        # 进入一维模式    (记得视频里把图像一维化么,这里是先卷积再一维化)

	model.add(Dense(128, activation='relu'))
	model.add(Dense(num_classes, activation='softmax'))
	        # “密集层”(彷佛也叫“全链接”)

	model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
	        # compile编译,这总不应解释运行了……
	return model

model = baseline_model()
        # (用函数加调用来建立模型“看起来更清晰”)


  第四步:

### 喂猫

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=128, verbose=2)


  运行很是慢(这但是神经网络!),我没有GPU,训练一次大约要40秒(最后一行的epoch表示训练次数)。看着别人的个位数秒数,有点难过。


  (2018-2-6 于地球)

相关文章
相关标签/搜索