关于神经网络的思考

神经网络已经被证明它能够拟合任意的函数,所以它的用途十分广泛。任意的输入X,只要它与Y输出有一个对应关系F,即Y=F(X)时,F即是我们要拟合的目标函数。特别是这种对应关系十分复杂时,神经网络就显示出它的强大来。比如语音信号,经过采样之后只是一维的数据,很难直接找到这种从声音到文字的对应关系。如果这种对应关系根本不存在的话,神经网络也没有办法找出一种对应关系。比如输入一张人脸,预测它犯罪的可能性,如果是婴儿,它的准确性一定很低,因为婴儿脸部没有特征可以与犯罪有对应关系。但是成人就不一定,比如长期吸食毒品的人,脸部会出现一些明显变化,肤色或者皮肤纹理或者口歪眼斜等等特征,这就暗示出脸部与犯罪存在一定的联系,这种联系可以用Y=F(X)来表示,这个F就是我们要拟合的目标函数。另外我们的输出Y一定是可分的,如果一个数据集的噪声很大,对于训练神经网络是非常不利的。
CNN的原理随着卷积核(filter)可视化可以稍微窥探一些端倪,一个filter实际上是为了探测一个feature,filter提取的特征是其前一层特征的组合排列,依次向前类推。所以在filter size和步长的选择上会有一定的规律可以遵循。
1.如果选择一个filter的size过大,则非常不利于feature的提取,因为过大的filter会导致输入层的信息损失严重,严重到网络没有办法基于这些过少的特征进行分类。极端情况是filter的size和输入的size一样大,这样整个输入样本经过卷积之后变成只有一维的数据,记作X',这个损失极其严重的X'和Y之间已经不存在对应关系F,目标函数已经不存在了,所以这个神经网络根本没有办法工作。

我做了一个实验,基于minist数据集,代码如下:

    modelCNN = Sequential()
    modelCNN.add(Convolution2D(1, 28, 28, input_shape=(28,28,1)))#这里使用1个filter,每个大小为28x28。输入图片大小28x28 尺寸相同
    modelCNN.add(Flatten())
    modelCNN.add(Dense(output_dim=500))
    modelCNN.add(Activation("sigmoid"))
    modelCNN.add(Dense(output_dim=500))
    modelCNN.add(Activation("sigmoid"))
    modelCNN.add(Dense(output_dim=10))
    modelCNN.add(Activation("sigmoid"))

    modelCNN.compile(loss='categorical_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])

    # input image dimensions
    img_rows, img_cols = 28, 28
    batch_size = 200
    num_classes = 10

    # the data, shuffled and split between train and test sets
    (x_train, y_train), (x_test, y_test) = mnist.load_data()

    if K.image_data_format() == 'channels_first':
        x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
        x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
        input_shape = (1, img_rows, img_cols)
    else:
        x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
        x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
        input_shape = (img_rows, img_cols, 1)

    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    print('x_train shape:', x_train.shape)
    print(x_train.shape[0], 'train samples')
    print(x_test.shape[0], 'test samples')

    # convert class vectors to binary class matrices
    y_train = keras.utils.to_categorical(y_train, num_classes)
    y_test = keras.utils.to_categorical(y_test, num_classes)

    tb_cb = keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=1, write_graph=True, write_images=False,
                                        embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
    #es_cb = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0.09, patience=5, verbose=0, mode='auto')
    cbks = [];
    cbks.append(tb_cb);
    #cbks.append(es_cb);

    modelCNN.fit(x_train, y_train,
              batch_size=batch_size,
              callbacks=cbks,
              epochs=100,
              verbose=1,
              validation_data=(x_test, y_test))
    score = modelCNN.evaluate(x_test, y_test, verbose=0)

这个卷积神经网络是在一个只训练2轮,准确率在94%以上的全连接网络前端加上一个filter进行卷积。只加了一个size为输入样本同样尺寸的filter。结果这个神经网络完全失效。我训练了100轮,结果基本没有效果。参见图1

图1

这个神经网络在训练100轮中精度基本没有提升,是一条直线,loss只是稍微有一点下降。读者可以检查一下是不是哪里出错了,如果有请帮助指正。
2.如果步长过长会有同样的问题,提取的特征过少,输入X在经过卷积后变成X',在此过程中可以基于分类的有效信息量衰减过大,导致X'不会和输入Y存在目标函数F的对应关系。
3.pooling的过程也会存在同样的问题,会造成有效信息的衰减。如果pooling选择尺寸过大,也会使神经网络的效果下降。李宏毅老师也提到alpha go的算法中,没有使用pooling其实也是这个原因,加入pooling会导致数据损失,而在围棋中就算是用2x2的size进行pooling都会造成严重的数据损失,因为围棋叫吃的时候是可以在3x3的范围内完成的。如果再pooling一下的话,alpha go 估计连基本的叫吃都看不明白了。

在上面的filter实验中,由于filter 的size选择有点极端,不知道keras或者tensorflow会不会产生异常情况,导致准确率不能有效提升。如果错了。。。请不要打脸[\尴尬]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容