2016-05-16 81 views
4

這個問題更多的是關於DNN而不是軟件keras的訓練算法。爲什麼在keras中未指定DNN的預訓練?

據我所知,由於訓練算法的改進,深度神經網絡起作用。從20世紀80年代開始,BP算法一直用於訓練神經網絡,但當網絡深度較大時會導致過度擬合問題。大約10年前,Hinton首先使用未標記的數據預先訓練網絡,然後使用BP算法對算法進行了改進。預培訓對避免過度擬合起着重要作用。

但是,當我開始嘗試Keras時,使用SGD算法的mnist DNN示例(在下面)沒有提及預訓練過程,這導致了非常高的預測準確性。所以,我開始懷疑預培訓的去向了嗎?我誤解了深度學習訓練算法(我認爲經典BP與SGD幾乎相同)?或者新的培訓技術已經取代了培訓前的流程?

非常感謝您的幫助!

'''Trains a simple deep NN on the MNIST dataset. 
Gets to 98.40% test accuracy after 20 epochs 
(there is *a lot* of margin for parameter tuning). 
2 seconds per epoch on a K520 GPU. 
''' 

from __future__ import print_function 
import numpy as np 
np.random.seed(1337) # for reproducibility 

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


batch_size = 128 
nb_classes = 10 
nb_epoch = 20 

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

X_train = X_train.reshape(60000, 784) 
X_test = X_test.reshape(10000, 784) 
X_train = X_train.astype('float32') 
X_test = X_test.astype('float32') 
X_train /= 255 
X_test /= 255 
print(X_train.shape[0], 'train samples') 
print(X_test.shape[0], 'test samples') 

# convert class vectors to binary class matrices 
Y_train = np_utils.to_categorical(y_train, nb_classes) 
Y_test = np_utils.to_categorical(y_test, nb_classes) 

model = Sequential() 
model.add(Dense(512, input_shape=(784,))) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(512)) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(10)) 
model.add(Activation('softmax')) 

model.summary() 

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

history = model.fit(X_train, Y_train, 
        batch_size=batch_size, nb_epoch=nb_epoch, 
        verbose=1, validation_data=(X_test, Y_test)) 
score = model.evaluate(X_test, Y_test, verbose=0) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 
+0

我是機器學習的新手。什麼是DNN?這與動態CNN相同嗎? –

+2

DNN =深度神經網絡。與以前一樣,但大多數時間更多圖層和不同的激活功能。 – sascha

回答

8

你錯了。

過去與今天

在過去的神經網絡之間的區別和那些今天是不是訓練算法。每個DNN都採用基於SGD算法的反向傳播進行訓練,與以往完全相同。 (有一些新算法試圖通過自適應學習速率來減少參數調整,如Adam,RMSprop和co;但是普通的SGD仍然是最常見的算法,並且例如用於AlphaGo)

區別只是大小=層數(深度;這是由於基於GPU的評估可能的)以及激活函數的選擇。 ReLU比傳統的Sigmoid或Tanh激活(關於速度和穩定性)更好。

前培訓

我也認爲,這前培訓是非常普遍的5 - 10年前,但沒有人在做,今天(如果你有足夠多的數據)! 讓我引用from here

這是真的,無監督前培訓最初是什麼使我們能夠更深入的培訓網絡,但最近幾年的訓練前的做法已基本廢棄。 如今,深層神經網絡與他們80年代的表兄弟很相似。除了預訓練之外,現在差別在於使用的激活函數和正則化方法(有時在優化算法中,儘管更少)。 我想說2006年左右開始的「訓練前時代」在10年代初人們開始使用校正後的線性單位(ReLU)並且後來輟學,並且發現預訓練不再有益於這種類型的網絡。

我可以推薦these slides作爲現代深度學習的介紹(作爲出發點)。

+0

非常感謝。這正是我想知道的。 – oNgStrIng

相關問題