最近tensorflow0.12出了,支持Windows了。在ubuntu系統(tǒng)上折騰GPU加速非常難過(guò)。在Windows上安裝CUDA和cuDNN就非常容易了,一個(gè)直接exe安裝,另一個(gè)直接復(fù)制粘貼。安裝了anaconda之后,直接用pip即可裝上tensorflow,theano和keras,再在用戶(hù)文件夾下改一下tensorflow的backend,GPU加速瞬間就可用了!
本來(lái)打算準(zhǔn)備好好看一些例子和相關(guān)的教程書(shū)籍再自己操作的,但是總覺(jué)得應(yīng)該自己親手先摸索一下,于是選擇了比較好用的keras作為進(jìn)行深度學(xué)習(xí)的工具,之后理解透徹了再和tensorflow對(duì)比一下吧。
這次的keras實(shí)踐結(jié)果并不是很好,調(diào)整了很多參數(shù),最后loss只能降到0.8左右,accuracy最高也就才56%。也許是模型構(gòu)建的原因,也許是數(shù)據(jù)的原因,總之今后會(huì)重新再來(lái)看這一次實(shí)踐。
數(shù)據(jù)的選擇
我理解的深度學(xué)習(xí)是把一些不容易發(fā)現(xiàn)的相關(guān)性展示出來(lái),因而數(shù)據(jù)怎么樣也要有一定的聯(lián)系,這次實(shí)踐的結(jié)果并不是很好,可能一部分是因?yàn)閿?shù)據(jù)本身相關(guān)性就十分缺乏。
數(shù)據(jù)并沒(méi)有選擇官方給的那些手寫(xiě)數(shù)字等圖片數(shù)據(jù),而是從加州大學(xué)歐文分校的機(jī)器學(xué)習(xí)數(shù)據(jù)庫(kù)獲取的:
http://archive.ics.uci.edu/ml/machine-learning-databases/
選擇的是一個(gè)關(guān)于白酒質(zhì)量的數(shù)據(jù)庫(kù),名稱(chēng)為“winequality-white.csv”,總共4898組數(shù)據(jù),每組數(shù)據(jù)分別包含非揮發(fā)性酸含量,揮發(fā)性酸含量,檸檬酸,糖殘量,卡路里,游離二氧化硫,總二氧化硫,密度,pH,硫酸鹽,酒精含量以及酒的等級(jí)共12個(gè)數(shù)據(jù)。打算用前面11個(gè)物理化學(xué)性質(zhì)來(lái)判斷最后一個(gè)酒的質(zhì)量分級(jí)。
酒的質(zhì)量分級(jí),本身就具有很強(qiáng)的主觀(guān)因素,并且這個(gè)數(shù)據(jù)中還沒(méi)有十分關(guān)鍵的酯類(lèi)物質(zhì)含量等信息,整體來(lái)說(shuō)相關(guān)性并不是很強(qiáng)。一些指標(biāo)比如密度、硫酸鹽等,是幾乎完全很難和酒品質(zhì)量相關(guān)的。另外即使是一個(gè)等級(jí)的酒,某些指標(biāo)也是千差萬(wàn)別,更何況這整個(gè)11長(zhǎng)度的數(shù)據(jù)要壓縮成7個(gè)分級(jí),并且最主要的5、6、7級(jí)的酒加起來(lái)就占了92%,所以說(shuō)處理起來(lái)難度很大。
而當(dāng)初建模型時(shí)沒(méi)有對(duì)這些數(shù)據(jù)進(jìn)行預(yù)處理,原封不動(dòng)的把所有數(shù)據(jù)作為了機(jī)器學(xué)習(xí)的內(nèi)容,也導(dǎo)致了最后結(jié)果的不理想。
數(shù)據(jù)的處理
4898個(gè)數(shù)據(jù),分成4398和500為train和test。
import numpy as npfiles = open('winequality-white.csv', 'r').readlines()quality=[]r=1data=[]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 tempdata_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)
模型
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]
第一次建立模型,很多數(shù)值的選取都沒(méi)有經(jīng)驗(yàn),所以需要慢慢摸索,這里我采用調(diào)整各種數(shù)值然后作圖的方式。
第一層后outdim的影響,至少能夠說(shuō)明outdim<50都是不可取的。
可能是數(shù)據(jù)的原因,可能是模型的原因,總之今后會(huì)再來(lái)回顧的,記住這一次。
聯(lián)系客服