【筆記】機器學習 - 李宏毅 - 11 - Keras Demo2 & Fizz Buzz


1. Keras Demo2
前節的Keras Demo代碼:

import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.optimizers import SGD,Adam
from keras.utils import np_utils
from keras.datasets import mnist

def load_data():
    (x_train,y_train),(x_test,y_test)=mnist.load_data()
    number=10000
    x_train=x_train[0:number]
    y_train=y_train[0:number]
    x_train=x_train.reshape(number,28*28)
    x_test=x_test.reshape(x_test.shape[0],28*28)
    x_train=x_train.astype('float32')
    x_test=x_test.astype('float32')
    y_train=np_utils.to_categorical(y_train,10)
    y_test=np_utils.to_categorical(y_test,10)
    x_train=x_train
    x_test=x_test
    x_train=x_train/255
    x_test=x_test/255
    return (x_train,y_train),(x_test,y_test)

(x_train,y_train),(x_test,y_test)=load_data()

model=Sequential()
model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))

model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])

model.fit(x_train,y_train,batch_size=100,epochs=20)

result= model.evaluate(x_test,y_test)

print('TEST ACC:',result[1])

Keras Demo中的結果不是很好,看一下在Training Data上的結果:

result= model.evaluate(x_test,y_test)
result2 = model.evaluate(x_train,y_train,batch_size=10000)

print('TEST ACC:',result[1])
print('TRAIN ACC:',result2[1])

結果如下:

TEST ACC: 0.1135
TRAIN ACC: 0.1128000020980835

說明在Training Data上結果也不好,接下來開始調參:

loss function
分類問題mse不適合,將loss mse function 改為categorical_crossentropy

model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.1),metrics=['accuracy'])

結果如下:

TEST ACC: 0.8488
TRAIN ACC: 0.8611000180244446

batch_size
batch_size從100改為10000,得到的結果不好。

model.fit(x_train,y_train,batch_size=10000,epochs=20)

結果如下:

TEST ACC: 0.101
TRAIN ACC: 0.10320000350475311

改為1,無法並行,速度變得很慢。

model.fit(x_train,y_train,batch_size=1,epochs=20)

deep layer
加10層,沒有train起來。

for _ in range(10):
    model.add(Dense(units=689,activation='sigmoid'))

結果如下:

TEST ACC: 0.101
TRAIN ACC: 0.10320000350475311

activation functon
把sigmoid都改為relu,發現現在train的accuracy就爬起來了,接近100%,在Test Data上也表現很好。

結果如下:

TEST ACC: 0.9556
TRAIN ACC: 0.9998000264167786

normalize
如果不進行normalize,把255去掉,得到的結果又不好了,這些細節也很重要。

# x_train=x_train/255
# x_test=x_test/255

結果如下:

TEST ACC: 0.098
TRAIN ACC: 0.10010000318288803

optimizer
把SGD(lr=0.1)改為Adam,然后再跑一次,用adam的時候最后收斂的地方差不多,但是上升的速度變快了。

結果如下:

TEST ACC: 0.9667
TRAIN ACC: 1.0

Random noise
加上noise之后,結果不好,overfitting了。

x_test=np.random.normal(x_test)

結果如下:

TEST ACC: 0.4986
TRAIN ACC: 0.9991000294685364

dropout
dropout 加在每個hidden layer之后,dropout加入之后,train的效果會變差,然而test的正確率提升了。

model.add(Dense(input_dim=28*28,units=689,activation='relu'))
model.add(Dropout(0.7))
model.add(Dense(units=689,activation='relu'))
model.add(Dropout(0.7))
model.add(Dense(units=689,activation='relu'))
model.add(Dropout(0.7))
model.add(Dense(units=10,activation='softmax'))

結果如下:

TEST ACC: 0.594
TRAIN ACC: 0.9894000291824341

2. FizzBuzz

題目描述:
給你100以內的數. 如果這個數被3整除,打印fizz.
如果這個數被5整除,打印buzz.
如果這個數能同時被3和5整除,打印fizz buzz.

FizzBuzz是一個很有意思的題目,如果用深度學習的方法來做的話,可以用如下代碼實現。

數據准備:
對數字101到1000都做了數據標注,即訓練數據xtrain.shape=(900,10),
每一個數字都是用二進位來表示,第一個數字是101,用二進位來表示即為[1,0,1,0,0,1,1,0,0,0],
每一位表示\(2^{n-1}\)\(n\)表示左數第幾位。現在一共有四個case,[一般,Fizz,Buzz,Fizz Buzz],所以y_train.shape=(900,10),對應的維度用1表示,其他都為0。

from keras.layers.normalization import BatchNormalization
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.optimizers import SGD,Adam
import numpy as np
def fizzbuzz(start, end):
    x_train, y_train=[],[]
    for i in range(start, end+1):
        num = i
        tmp = [0]*10
        j = 0
        while num:
            tmp[j] = num & 1
            num = num >> 1
            j += 1        
        x_train.append(tmp)
        if i % 3 == 0 and i % 5 == 0:
            y_train.append([0,0,0,1])
        elif i % 3 == 0:
            y_train.append([0,1,0,0])
        elif i % 5 == 0:
            y_train.append([0,0,1,0])
        else:
            y_train.append([1,0,0,0])
    return np.array(x_train), np.array(y_train)
x_train,y_train = fizzbuzz(101, 1000) #打標記函數
x_test,y_test = fizzbuzz(1, 100)

model = Sequential()
model.add(Dense(input_dim=10, output_dim=100))
model.add(Activation('relu'))
model.add(Dense(output_dim=4))
model.add(Activation('softmax'))

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

model.fit(x_train, y_train, batch_size=20, nb_epoch=100)

result = model.evaluate(x_test, y_test, batch_size=1000)

print('Acc:',result[1])

最后的結果不是100%,所以我們將hidden neure從100改為1000,結果就是100%了。

model.add(Dense(input_dim=10, output_dim=1000))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM