分享

记一次新手的keras深度学习心得

 imelee 2017-04-15

最近tensorflow0.12出了,支持Windows了。在ubuntu系统上折腾GPU加速非常难过。在Windows上安装CUDA和cuDNN就非常容易了,一个直接exe安装,另一个直接复制粘贴。安装了anaconda之后,直接用pip即可装上tensorflow,theano和keras,再在用户文件夹下改一下tensorflow的backend,GPU加速瞬间就可用了!

本来打算准备好好看一些例子和相关的教程书籍再自己操作的,但是总觉得应该自己亲手先摸索一下,于是选择了比较好用的keras作为进行深度学习的工具,之后理解透彻了再和tensorflow对比一下吧。

这次的keras实践结果并不是很好,调整了很多参数,最后loss只能降到0.8左右,accuracy最高也就才56%。也许是模型构建的原因,也许是数据的原因,总之今后会重新再来看这一次实践。

数据的选择
我理解的深度学习是把一些不容易发现的相关性展示出来,因而数据怎么样也要有一定的联系,这次实践的结果并不是很好,可能一部分是因为数据本身相关性就十分缺乏。
数据并没有选择官方给的那些手写数字等图片数据,而是从加州大学欧文分校的机器学习数据库获取的:
http://archive.ics./ml/machine-learning-databases/
选择的是一个关于白酒质量的数据库,名称为“winequality-white.csv”,总共4898组数据,每组数据分别包含非挥发性酸含量,挥发性酸含量,柠檬酸,糖残量,卡路里,游离二氧化硫,总二氧化硫,密度,pH,硫酸盐,酒精含量以及酒的等级共12个数据。打算用前面11个物理化学性质来判断最后一个酒的质量分级。
酒的质量分级,本身就具有很强的主观因素,并且这个数据中还没有十分关键的酯类物质含量等信息,整体来说相关性并不是很强。一些指标比如密度、硫酸盐等,是几乎完全很难和酒品质量相关的。另外即使是一个等级的酒,某些指标也是千差万别,更何况这整个11长度的数据要压缩成7个分级,并且最主要的5、6、7级的酒加起来就占了92%,所以说处理起来难度很大。
而当初建模型时没有对这些数据进行预处理,原封不动的把所有数据作为了机器学习的内容,也导致了最后结果的不理想。

数据的处理
4898个数据,分成4398和500为train和test。

import numpy as np
files = open('winequality-white.csv', 'r').readlines()
quality=[]
r=1
data=[]
for i in files:
            i=i.split(',')
            quality.append(i[11][0])
            for j in range(0,11):
                data.append((i[j]))
def get_float(list):
    temp=[]
    for i in list:
        temp.append(float(i))
    return temp

data_train=get_float(data[0:48378])
quality_train=get_float(quality[0:4398])
data_test=get_float(data[48378:])
quality_test=get_float(quality[4398:])

data_train=np.array(data_train)
data_train=data_train.reshape(4398,11)

quality_train=np.array(quality_train)
quality_train=quality_train.reshape(4398,1)

data_test=np.array(data_test)
data_test=data_test.reshape(500,11)

quality_test=np.array(quality_test)
quality_test=quality_test.reshape(500,1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

模型

def layer():
    model = Sequential()
    model.add(Dense(input_shape=(11,),output_dim=50))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(input_shape=(50,), output_dim=10))
    model.add(Activation('softmax'))
    model.compile(optimizer='rmsprop',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    model.fit(data_train, quality_train, batch_size=batch_size, nb_epoch=nb_epoch,
              verbose=1, validation_data=(data_test, quality_test))
    score = model.evaluate(data_test, quality_test, verbose=0)
    return score[0], score[1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

第一次建立模型,很多数值的选取都没有经验,所以需要慢慢摸索,这里我采用调整各种数值然后作图的方式。
第一层后outdim的影响,至少能够说明outdim<50都是不可取的。
这里写图片描述
nb_epoch(迭代次数)的影响,至少要在150以上。
这里写图片描述
batch_size在这里影响不是很大。
网络层数的影响,这里采用的激活函数是relu,(采用sofmax激活函数的话,最后得出的predict全部是同一个值。),每层的outdim减10。可看出层数越多,loss越大。
这里写图片描述
之后,即使是把白酒的分级数据处理了,只剩下5、6、7分级的数据,还是不能够把很好地把这些数据分类。

可能是数据的原因,可能是模型的原因,总之今后会再来回顾的,记住这一次。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多