大家好,我剛學(xué)神經(jīng)網(wǎng)路不久。我想到一個regression實驗,想測試神經(jīng)網(wǎng)路能不能學(xué)到這個特例。這是一個簡單的試驗,training data是隨機(jī)產(chǎn)生的10,000筆資料,每筆資料特征向量維度為10x1,label為特征向量第1個元素值。
from numpy.random import RandomState
rdm=RandomState(1)
data_size=10000
xdim=10
X=rdm.rand(data_size,xdim)
Y = [x1[0] for x1 in X]
我用一個一層的網(wǎng)路來訓(xùn)練,預(yù)期輸出是Weights=[1,0,0,0,0,0,0,0,0,0],bias=0。
我分別寫了tensorflow跟keras兩種版本。奇怪的是keras可以得到正確結(jié)果,tensorflow的訓(xùn)練卻無法收斂。而且兩個版本的loss差異很大。
Tensorflow版本:
import tensorflow as tf
x=tf.placeholder(tf.float64,shape=(None,xdim))
y=tf.placeholder(tf.float64,shape=(None))
Weights = tf.Variable(tf.random_normal([xdim, 1],dtype=tf.float64))
biases = tf.Variable(0.1,dtype=tf.float64)
y_predict = tf.matmul(x, Weights) + biases
loss = tf.reduce_mean(tf.square(y_predict - y))
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
batch_size=100
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(10001):
start = i * batch_size % data_size
end = min(start + batch_size,data_size)
sess.run(optimizer,feed_dict={x:X[start:end],y:Y[start:end]})
if i % 1000 == 0:
ypred,training_loss= sess.run([y_predict,loss],feed_dict={x:X,y:Y})
print("Epoch %d: loss=%g"%(i,training_loss))
Tensorflow版本的輸出:
Epoch 0: loss=1.0679
Epoch 1000: loss=0.11685
Epoch 2000: loss=0.0842979
Epoch 3000: loss=0.0827121
Epoch 4000: loss=0.0824983
Epoch 5000: loss=0.0824296
Epoch 6000: loss=0.0824021
Epoch 7000: loss=0.0823903
Epoch 8000: loss=0.0823851
Epoch 9000: loss=0.0823826
Epoch 10000: loss=0.0823814
Keras版本:
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
model = Sequential()
model.add(Dense(units=1, input_dim=xdim))
model.compile(loss='mse', optimizer='sgd')
batch_size=100
for i in range(10001):
start = i * batch_size % data_size
end = min(start + batch_size,data_size)
cost = model.train_on_batch(X[start:end], np.array(Y[start:end]))
if i % 1000 == 0:
print("Epoch %d: loss=%g"%(i,cost))
Keras版本的輸出:
Epoch 0: loss=0.261707
Epoch 1000: loss=0.00811771
Epoch 2000: loss=0.000325865
Epoch 3000: loss=2.21623e-05
Epoch 4000: loss=4.63907e-06
Epoch 5000: loss=1.66684e-06
Epoch 6000: loss=6.55329e-07
Epoch 7000: loss=2.61024e-07
Epoch 8000: loss=1.04213e-07
Epoch 9000: loss=4.16416e-08
Epoch 10000: loss=1.66369e-08
我認(rèn)為兩段代碼應(yīng)該是等效的,差別是我不知道keras內(nèi)部如何設(shè)定learning rate。為什么keras可以得到正確結(jié)果,tensorflow卻不行呢?請問我哪邊弄錯呢?
y和y_predict的shape不一樣。前者是(批大小,),后者是(批大小,1)
wx+b之后把y_predict的shape用tf.squeeze()調(diào)整。...
y_predict = tf.matmul(x, Weights)+biases
# 在這里加上squeeze把y_predict的形狀調(diào)整得和y一樣
y_predict = tf.squeeze(y_predict)
loss = tf.reduce_mean(tf.square(y_predict - y))
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
...
mse的函數(shù),可以直接用tf.losses.mean_squared_error()代替tf.reduce_mean(tf.square(y_predict - y))。sgd默認(rèn)學(xué)習(xí)率是0.01,這個可以在文檔和源代碼查到,為了保證和tf對比一致,你也可以手動指定學(xué)習(xí)率optimizer=keras.optimizers.SGD(lr=0.01)
model.add(Dense(units=1, input_dim=xdim,kernel_initializer='weights初始化的方法',bias_initializer='biases初始化方法')) 來指定。北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。