本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

wzatv:【j2开奖】专栏 | 卷积神经网络简介(5)

时间:2017-02-21 22:05来源:报码现场 作者:118KJ 点击:
该 6272 元向量送给后面一个三层的全连接神经网络。该网络的神经元个数是 1000 x 1000 x 10。两个隐藏层各有 1000 个神经元,最后的输出层有 10 个神经元,代

该 6272 元向量送给后面一个三层的全连接神经网络。该网络的神经元个数是 1000 x 1000 x 10。两个隐藏层各有 1000 个神经元,最后的输出层有 10 个神经元,代表 10 个数字。假如第六个输出为 1,其余输出为 0,就表示网络判定这个手写数字为「5」(数字「0」占第一个输出,所以「5」占第六个输出)。数字「5」就编成了:

训练集和测试集的数字标签都这么编(one-hot 编码)。

全连接神经网络这部分的激活函数都采用了 Sigmoid。这出于我一个过时且肤浅的理解:用「弯弯绕」较多的 Sigmoid 给网络贡献非线性。实际上当代深度学习从生物神经的行为中得到启发,设计了其它一些表现优异的激活函数,比如单边线性 Relu。

误差函数采用均方误差 mse。优化算法采用 rmsprop,这是梯度下降的一个变体。它动态调整学习速率 LR。训练过程持续 10 轮。注意这里 10 轮不是指当前解在解空间只运动 10 步。一轮是指全部 31500 个训练样本都送进网络迭代一次。每次权值更新以 32 个样本为一个 batch 提交给算法。下图展示了随着训练,mse 的下降情况:

  

wzatv:【j2开奖】专栏 | 卷积神经网络简介

图 15

下图是分类正确率随着训练的变化情况:

  

wzatv:【j2开奖】专栏 | 卷积神经网络简介

图16

该 CNN 在测试集上的正确率(accuracy)是 96.7%,各数字的准确率 / 召回率 / f1-score 如下:

wzatv:【j2开奖】专栏 | 卷积神经网络简介

该 CNN 对测试集 10 种数字分类的混淆矩阵为:

  

wzatv:【j2开奖】专栏 | 卷积神经网络简介

图17

训练完成神经网络后,最有趣的是将其内部权值以某种方式展现出来。看着那些神秘的、不明所以的连接强度最后竟产生表观上有意义的行为,不由让我们联想起大脑中的神经元连接竟构成了我们的记忆、人格、情感 ... 引人遐思。

在 CNN 上就更适合做这种事情。因为卷积层训练出来的是滤波器。用这些滤波器把输入图像滤一滤,看看 CNN 到底「看到」了什么。下图用第一、二卷积层的 32 个滤波器滤了图 13 第 8 行第 8 列的那个手写数字「6」。32 个 channel 显示如下:

  

wzatv:【j2开奖】专栏 | 卷积神经网络简介

图 18

  

wzatv:【j2开奖】专栏 | 卷积神经网络简介

图 19

其中有些把边缘高亮(输出值较大),有些把「6」的圈圈高亮,等等。这些就是 CNN 第一步滤波后「看到」的信息。再经过后面的各神经层,抽象程度逐层提高,它就这样「认出」了手写数字。

  最后把代码附上。CNN 使用的是 keras 库。数据集来自 kaggle :https://www.kaggle.com/c/digit-recognizer/data。

import pandas as pd

from keras.models import Sequential

from keras.layers import Dense, Flatten, Reshape, AveragePooling2D, Convolution2D

from keras.utils.np_utils import to_categorical

from keras.utils.visualize_util import plot

from keras.callbacks import Callback

from sklearn.model_selection import train_test_split

from sklearn.metrics import classification_report, accuracy_score, confusion_matrix

class LossHistory(Callback):

def __init__(self):

Callback.__init__(self)

self.losses = []

self.accuracies = []

def on_train_begin(self, logs=None):

pass

def on_batch_end(self, batch, logs=None):

self.losses.append(logs.get('loss'))

self.accuracies.append(logs.get('acc'))

history = LossHistory()

data = pd.read_csv("train.csv")

digits = data[data.columns.values[1:]].values

labels = data.label.values

train_digits, test_digits, train_labels, test_labels = train_test_split(digits, labels)

train_labels_one_hot = to_categorical(train_labels)

test_labels_one_hot = to_categorical(test_labels)

model = Sequential()

model.add(Reshape(target_shape=(1, 28, 28), input_shape=(784,)))

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容