oNg*_*Ing 6 machine-learning neural-network deep-learning keras
问题更多的是关于DNN的训练算法而不是软件keras.
据我所知,深度神经网络由于训练算法的改进而起作用.从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])
Run Code Online (Sandbox Code Playgroud)
sas*_*cha 14
你错了.
过去的神经网络和今天的神经网络之间的区别不在于训练算法.每个DNN都使用Backpropagation进行训练,基于一些基于SGD的算法,与过去完全一样.(有一些新算法尝试使用自适应学习速率来减少参数调整,如Adam,RMSprop和co .;但是普通SGD仍然是最常用的算法,例如用于AlphaGo)
差异只是尺寸=层数(深度;这可能是由于基于GPU的评估)和激活功能的选择.ReLU比经典的Sigmoid或Tanh激活(关于速度和稳定性)更好.
我也认为,预培训在5到10年前非常受欢迎,但今天没有人这样做(如果你有足够的数据)!让我引用这里:
这是真的,无监督前培训最初是什么使我们能够更深入的培训网络,但最近几年的训练前的做法已基本废弃.如今,深度神经网络与80年代的堂兄弟更相似.而不是预训练,现在的差异在于使用的激活函数和正则化方法(有时在优化算法中,尽管更少).我要说的是,2006年左右开始的"训练前时代"在10年代早期结束,当时人们开始使用整流线性单元(ReLUs),后来辍学,并发现预训练不再有利于此网络类型.
我可以推荐这些幻灯片作为现代深度学习的入门(作为起点).
归档时间: |
|
查看次数: |
2663 次 |
最近记录: |