loss下降之路 —— 小批量梯度下降法

y值開始浮動了征堪,那么loss現(xiàn)在是什么情況呢?

單輸出loss背桐,似乎看不出來优烧。

loss有在下降嗎?

在tensorboard中觀察一下

似乎有一點(diǎn)點(diǎn)的下降

看來基本面是向好的链峭,權(quán)重開始學(xué)習(xí)到東西了畦娄。

在修改了GradientDescentOptimizer學(xué)習(xí)率后發(fā)現(xiàn),loss僅僅也只能下降到那種程度了,batch的增加對loss都沒有幫助纷责,還加大了loss的波動捍掺。又陷入的困境。

在嘗試了tf.nn.sigmoid和tf.nn.tanh之后再膳,發(fā)現(xiàn)tf.nn.relu仍是最好的激活函數(shù)挺勿。

因?yàn)樽非髄oss下降,在最開始的測試過程中嘗試過小批量梯度下降法(5個)和隨機(jī)梯度下降法喂柒,在這兩種梯度下降法中不瓶,發(fā)現(xiàn)隨機(jī)梯度下降法能看到比較顯著的梯度變化,于是后續(xù)的優(yōu)化中灾杰,一直使用了隨機(jī)梯度下降蚊丐。當(dāng)我看到下面一段話后,意識到之前出了loss不下降之外艳吠,還存在著loss方差過大的問題麦备。在實(shí)現(xiàn)了loss基本面下降后,終于loss在趨于正常的下降了昭娩。

    隨機(jī)梯度下降法凛篙,和批量梯度下降法是兩個極端,一個采用所有數(shù)據(jù)來梯度下降栏渺,一個用一個樣本來梯度下降呛梆。自然各自的優(yōu)缺點(diǎn)都非常突出。對于訓(xùn)練速度來說磕诊,隨機(jī)梯度下降法由于每次僅僅采用一個樣本來迭代填物,訓(xùn)練速度很快,而批量梯度下降法在樣本量很大的時候霎终,訓(xùn)練速度不能讓人滿意滞磺。對于準(zhǔn)確度來說,隨機(jī)梯度下降法用于僅僅用一個樣本決定梯度方向莱褒,導(dǎo)致解很有可能不是最優(yōu)雁刷。對于收斂速度來說,由于隨機(jī)梯度下降法一次迭代一個樣本保礼,導(dǎo)致迭代方向變化很大,不能很快的收斂到局部最優(yōu)解责语。

    那么炮障,有沒有一個中庸的辦法能夠結(jié)合兩種方法的優(yōu)點(diǎn)呢?有坤候!這就是 胁赢、小批量梯度下降法。

loss終于看到了明顯的下降

目前代碼

import numpy as np

import pandas as pd

import tensorflow as tf

#轉(zhuǎn)為onehot編碼

def turn_onehot(df):

? ? for key in df.columns:

? ? ? ? oneHot = pd.get_dummies(df[key])

? ? ? ? for oneHotKey in oneHot.columns: #防止重名

? ? ? ? ? ? oneHot = oneHot.rename(columns={oneHotKey : key+'_'+str(oneHotKey)})

? ? ? ? df = df.drop(key, axis=1)

? ? ? ? df = df.join(oneHot)

? ? return df

#獲取一批次的數(shù)據(jù)

def get_batch(x_date, y_date, batch):

? ? global pointer

? ? x_date_batch = x_date[pointer:pointer+batch]

? ? y_date_batch = y_date[pointer:pointer+batch]

? ? pointer = pointer + batch

? ? return x_date_batch, y_date_batch

#生成layer

def add_layer(input_num, output_num, x, layer, active=None):

? ? with tf.name_scope('layer'+layer+'/W'+layer):

? ? ? ? W = tf.Variable(tf.random_normal([input_num, output_num]), name='W'+layer)

? ? ? ? tf.summary.histogram('layer'+layer+'/W'+layer, W)

? ? with tf.name_scope('layer'+layer+'/b'+layer):

? ? ? ? b = tf.Variable(tf.zeros([1, output_num])+0.1, name='b'+layer)

? ? ? ? tf.summary.histogram('layer'+layer+'/b'+layer, b)

? ? with tf.name_scope('layer'+layer+'/l'+layer):

? ? ? ? l = active(tf.matmul(x, W)+b) #使用sigmoid激活函數(shù)白筹,備用函數(shù)還有relu

? ? ? ? tf.summary.histogram('layer'+layer+'/l'+layer, l)

? ? return l

hiddenDim = 1000 #隱藏層神經(jīng)元數(shù)

save_file = './train_model.ckpt'

istrain = True

istensorborad = True

pointer = 0

if istrain:

? ? samples = 2000

? ? batch = 10 #每批次的數(shù)據(jù)輸入數(shù)量

else:

? ? samples = 550

? ? batch = 1 #每批次的數(shù)據(jù)輸入數(shù)量

with tf.name_scope('inputdate-x-y'):

? ? #導(dǎo)入

? ? df = pd.DataFrame(pd.read_csv('GHMX.CSV',header=0))

? ? #產(chǎn)生 y_data 值 (1, n)

? ? y_date = df['number'].values

? ? y_date = y_date.reshape((-1,1))

? ? #產(chǎn)生 x_data 值 (n, 4+12+31+24)

? ? df = df.drop('number', axis=1)

? ? df = turn_onehot(df)

? ? x_data = df.values


###生成神經(jīng)網(wǎng)絡(luò)模型

#占位符

with tf.name_scope('inputs'):

? ? x = tf.placeholder("float", shape=[None, 71], name='x_input')

? ? y_ = tf.placeholder("float", shape=[None, 1], name='y_input')

#生成神經(jīng)網(wǎng)絡(luò)

l1 = add_layer(71, hiddenDim, x, '1', tf.nn.relu)

#l2 = add_layer(hiddenDim, hiddenDim, l1, '2', tf.nn.relu)

#l3 = add_layer(hiddenDim, hiddenDim, l2, '3', tf.nn.relu)

#l4 = add_layer(hiddenDim, hiddenDim, l3, '4', tf.nn.relu)

#l5 = add_layer(hiddenDim, hiddenDim, l4, '5', tf.nn.relu)

#l6 = add_layer(hiddenDim, hiddenDim, l5, '6', tf.nn.relu)

#l7 = add_layer(hiddenDim, hiddenDim, l6, '7', tf.nn.relu)

#l8 = add_layer(hiddenDim, hiddenDim, l7, '8', tf.nn.relu)

#l9 = add_layer(hiddenDim, hiddenDim, l8, '9', tf.nn.relu)

y = add_layer(hiddenDim, 1, l1, '10', tf.nn.relu)

#計算loss

with tf.name_scope('loss'):

? ? #loss = tf.reduce_mean(tf.reduce_sum(tf.square(y - y_), name='square'), name='loss')? #損失函數(shù)智末,損失不下降谅摄,換用別的函數(shù)

? ? #loss = -tf.reduce_sum(y_*tf.log(y))? #損失仍然不下降

? ? #loss = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)) , name='loss')

? ? loss = tf.losses.mean_squared_error(labels=y_, predictions=y)

? ? tf.summary.scalar('loss', loss)

#梯度下降

with tf.name_scope('train_step'):

? ? train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)? #有效的學(xué)習(xí)率0.000005

#初始化

init = tf.global_variables_initializer()

sess = tf.Session()

if istensorborad:

? ? merged = tf.summary.merge_all()

? ? writer = tf.summary.FileWriter('logs/', sess.graph)

sess.run(init)

#保存/讀取模型

saver = tf.train.Saver()

if not istrain:

? ? saver.restore(sess, save_file)

for i in range(samples):

? ? x_date_batch, y_date_batch = get_batch(x_data, y_date, batch)

? ? feed_dict = {x: x_date_batch, y_: y_date_batch}

? ? if istrain:

? ? ? ? _, loss_value, y_value, y__value = sess.run((train_step, loss, y, y_), feed_dict=feed_dict)

? ? ? ? print('y=', y_value, '----ture=', y__value)

? ? ? ? print(loss_value)

? ? else:

? ? ? ? _, test_assess_value = sess.run((loss, test_assess), feed_dict=feed_dict)

? ? ? ? print(test_assess_value)

? ? if istensorborad:

? ? ? ? result = sess.run(merged, feed_dict=feed_dict)

? ? ? ? writer.add_summary(result,i)

#保存模型

if istrain:

? ? saver.save(sess, save_file)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市系馆,隨后出現(xiàn)的幾起案子送漠,更是在濱河造成了極大的恐慌,老刑警劉巖由蘑,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闽寡,死亡現(xiàn)場離奇詭異,居然都是意外死亡尼酿,警方通過查閱死者的電腦和手機(jī)爷狈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裳擎,“玉大人涎永,你說我怎么就攤上這事÷瓜欤” “怎么了羡微?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抢野。 經(jīng)常有香客問我拷淘,道長,這世上最難降的妖魔是什么指孤? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任启涯,我火速辦了婚禮,結(jié)果婚禮上恃轩,老公的妹妹穿的比我還像新娘结洼。我一直安慰自己,他們只是感情好叉跛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布松忍。 她就那樣靜靜地躺著,像睡著了一般筷厘。 火紅的嫁衣襯著肌膚如雪鸣峭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天酥艳,我揣著相機(jī)與錄音摊溶,去河邊找鬼。 笑死充石,一個胖子當(dāng)著我的面吹牛莫换,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拉岁,長吁一口氣:“原來是場噩夢啊……” “哼坷剧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喊暖,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤惫企,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哄啄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雅任,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年咨跌,在試婚紗的時候發(fā)現(xiàn)自己被綠了沪么。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡锌半,死狀恐怖禽车,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刊殉,我是刑警寧澤殉摔,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站记焊,受9級特大地震影響逸月,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遍膜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一碗硬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓢颅,春花似錦恩尾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至信柿,卻和暖如春冀偶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渔嚷。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工进鸠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圃伶。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窒朋。 傳聞我的和親對象是個殘疾皇子搀罢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容