tensorflow keras 构建神经网络、Alex net、VGG、CNN网络

Tensorflow keras 极简神经网络构建与使用

Keras在希腊语中意为号角,它来自古希腊和拉丁文学中的一个文学形象。

以 mnist 数据集为例, 构建一个神经网络实现手写数字的训练与测试, 首先我们需要认识一下 mnist 数据集, mnist 数据集有 6 万张手写图像, 1 万张测试图像. Keras 通过 datase 来下载与使用 mnist 数据集, 下载与读取的代码如下:

mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) =mnist.load_data()

通过下面的代码可以显示手写数字图像:

print(train_labels[0])
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([   ])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.gray)
    plt.xlabel(str(train_labels[i]))
plt.show()

tensorflow keras 构建神经网络、Alex net、VGG、CNN网络_第1张图片

对数据 re-scale 到 0~1.0 之间, 对标签进行了 one-hot 编码, 代码如下:

# re-scale to 0~1.0 之间
train_images = train_images / 255.0
test_images = test_images / 255.0
train_labels = one_hot(train_labels)
test_labels = one_hot(test_labels)

其中 one-hot 编码函数如下:

def one_hot(labels):
    onehot_labels = np.zeros(shape=[len(labels), 10])
    for i in range(len(labels)):
        index = labels[i]
        onehot_labels[i][index] = 1
    return onehot_labels

建立模型
构建神经网络
输入层为 28x28=784 个输入节点
隐藏层 120 个节点
输出层 10 个节点
首先需要定义模型:
model = keras.Sequential()
然后按顺序添加模型各层

model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(units=120, activation=tf.nn.relu))
model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))

编译模型
模型还需要再进行几项设置才可以开始训练. 这些设置会添加到模型的编译步骤:
损失函数
衡量模型在训练期间的准确率. 我们希望尽可能缩小该函数, 以 “引导” 模型朝着正确的方向优化.
优化器
根据模型看到的数据及其损失函数更新模型的方式.
指标
用于监控训练和测试步骤. 以下示例使用准确率, 即图像被正确分类的比例

model.compile(optimizer=tf.train.AdamOptimizer(),
loss="categorical_crossentropy", metrics=['accuracy'])

训练模型

训练神经网络模型需要执行以下步骤:

将训练数据馈送到模型中, 在本示例中为 train_images 和 train_labels 数组.

模型学习将图像与标签相关联. 我们要求模型对测试集进行预测, 在本示例中为 test_images 数组. 我们会验证预测结果是否与 test_labels 数组中的标签一致.

要开始训练, 请调用 model.fit 方法, 使模型与训练数据 “拟合”:

model.fit(x=train_images, y=train_labels, epochs=5)

评估模型

模型在测试集数据上运行:

test_loss, test_acc = model.evaluate(x=test_images, y=test_labels)
print("Test Accuracy %.2f"% test_acc)

使用模型进行预测:

# 开始预测
cnt = 0
predictions = model.predict(test_images)
for i in range(len(test_images)):
    target = np.argmax(predictions[i])
    label = np.argmax(test_labels[i])
    if target == label:
        cnt += 1
print("correct prediction of total : %.2f"%(cnt/len(test_images)))

卷积神经网络

mnist 数据转换为四维:

rain_images = np.expand_dims(train_images, axis=3)
test_images = np.expand_dims(test_images, axis=3)

创建模型并构建 CNN 各层:

model = keras.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=5, strides=(1, 1),
                              padding='same', activation=tf.nn.relu, input_shape=(28, 28, 1)))
model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1),
                              padding='same', activation=tf.nn.relu))
model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(units=128, activation=tf.nn.relu))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))

编译与训练模型:

# 训练模型
model.compile(optimizer=tf.train.AdamOptimizer(), loss="categorical_crossentropy", metrics=['accuracy'])
model.fit(x=train_images, y=train_labels, epochs=10)

tensorflow keras 构建神经网络、Alex net、VGG、CNN网络_第2张图片

以上内容来自:https://www.h3399.cn/201812/643765.html

AlexNet

LeNet 是最早推动深度学习领域发展的卷积神经网络之一。这项由 Yann LeCun 完成的开创性工作自 1988 年以来多次成功迭代之后被命名为 LeNet5。AlexNet 是 Alex Krizhevsky 等人在 2012 年发表的《ImageNet Classification with Deep Convolutional Neural Networks》论文中提出的,并夺得了 2012 年 ImageNet LSVRC 的冠军,引起了很大的轰动。AlexNet 可以说是具有历史意义的一个网络结构,在此之前,深度学习已经沉寂了很长时间,自 2012 年 AlexNet 诞生之后,后面的 ImageNet 冠军都是用卷积神经网络(CNN)来做的,并且层次越来越深,使得CNN成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。

卷积神经网络
1 卷积层
2 激活层
3 池化层
4 全连接层

AlexNet 模型
1.模型
tensorflow keras 构建神经网络、Alex net、VGG、CNN网络_第3张图片

AlexNet 模型( 5 卷积层+ 3 全连接层共 8 层神经网络,使用 2GPU 故分上下两部分)

2.局部归一化
tensorflow keras 构建神经网络、Alex net、VGG、CNN网络_第4张图片

AlexNet 过拟合处理
1 数据扩充
2 Dropout

VGG

tensorflow keras 构建神经网络、Alex net、VGG、CNN网络_第5张图片

模型的名称——“VGG”代表了牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人。

小卷积核
VGGNet则清一色使用3x3卷积。因为卷积不仅涉及到计算量,还影响到感受野。

VGG比较神奇的一个特点就是“全连接转卷积”,在测试阶段把网络中原本的三个全连接层依次变为1个conv7x7,2个conv1x1,也就是三个卷积层。改变之后,整个网络由于没有了全连接层,网络中间的feature map不会固定,所以网络对任意大小的输入都可以处理

1x1卷积
选用1x1卷积核的最直接原因是在维度上继承全连接,然而作者首先认为1x1卷积可以增加决策函数(decision function,这里的决策函数就是softmax)的非线性能力,非线性是由激活函数ReLU决定的,本身1x1卷积则是线性映射,即将输入的feature map映射到同样维度的feature map。

优点:

(1)VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)

(2)几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5或7x7)卷积层好

(3)验证了通过不断加深网络结构可以提升性能

缺点:

CNN

卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

alexnet与VGG

1,算法:就是各种优秀的网络结构,再加上各种设计trick,比如relu,BatchNorm等等

2,算力:最重要的就是GPU的发展,再这方面Nvidia做出了很大的贡献,不过它这几年的股价也是让他们赚的盆满钵满

3,数据:互联网的高速发展产生了大量的数据,数据是宝贵的财富,目前的说到底还是数据驱动的深度学习

你可能感兴趣的:(ARPG游戏深度强化学习)