y值開始浮動了征堪,那么loss現(xiàn)在是什么情況呢?
單輸出loss背桐,似乎看不出來优烧。
在tensorboard中觀察一下
看來基本面是向好的链峭,權(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)呢?有坤候!這就是 胁赢、小批量梯度下降法。
目前代碼
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)