import tensorflow as tffrom numpy.random import randomstate
import os
os.environ['tf_cpp_min_log_level'] = '2'
batch_size = 8
#兩個輸入節點。
x = tf.placeholder(tf.float32,shape=(none,2),name='x-input')
#乙個輸出節點。
y_ = tf.placeholder(tf.float32,shape=(none),name='y-input')
#定義了乙個單層的神經網路前向傳播過程,這裡就是簡單加權和。
w1 = tf.variable(tf.random_normal([2,1],stddev=1,seed=1))
y = tf.matmul(x,w1)
#自定義損失函式
#定義**多了和**少了的成本。
loss_less = 10
loss_more = 1
#此處用到了tf.greater 和 tf.where 來實現選擇操作,tf.greater 的輸入是兩個張量,此函式會比較這兩個輸入張量中每個元素的大小,並返回比較結果。
#當tf.greater的輸入張量維度不一樣時,tensorflow會進行類似numpy廣播操作處理。
#tf.where函式有三個引數,第乙個為選擇條件根據,當為true時,tf.where函式選擇第二個引數中的值,否則使用第三個引數中的值。
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),(y - y_)*loss_more,(y_ - y)*loss_less))
train_step = tf.train.adamoptimizer(0.001).minimize(loss)
#通過隨機數生成乙個模擬資料集
rdm = randomstate(1)
dataset_size = 128
x = rdm.rand(dataset_size,2)
#設定回歸的正確值為兩個輸入的和加上乙個隨機變數。之所以要加上乙個隨機量是為了加入不可**的噪音,
#否則不同損失函式的意義就不大了,因為不同損失函式都會在能完全**正確的時候最低。一般來說噪音為乙個均值為0的小量,
#所以這裡的噪音設定為-0.05~0.05的隨機數。
y = [[x1 + x2 +rdm.rand()/10.0-0.05] for (x1,x2) in x]
#訓練神經網路。
with tf.session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
steps = 5000
for i in range(steps):
start = (i * batch_size) % dataset_size
end = min(start+batch_size,dataset_size)
sess.run(train_step,
feed_dict=)
print (sess.run(w1))
'''輸出結果:
[[1.0193471]
[1.0428091]]
'''
TensorFlow2 0 自定義層與自定義網路
自定義層函式需要繼承layers.layer,自定義網路需要繼承keras.model。其內部需要定義兩個函式 1 init 初始化函式,內部需要定義構造形式 2 call函式,內部需要定義計算形式及返回值。self def layer class mydense layers.layer inhe...
tensorflow2 0 自定義層
無引數的自定義層可以使用 keras.layers.lambda函式 customized spftplus keras.layers.lambda lambda x tf.nn.softplus x print customized spftplus 1.0 1.0 1.0 0.0 0.1 0.2...
tensorflow 2 1 自定義訓練
常常會遇到自定義網路結構的情況,自定結構後往往會有多個輸入,或者還需要自定義loss或者accuracy函式,那麼keras的fit就無法使用了,因此需要自定義訓練步驟 下面則自定義一次batch的訓練步驟,包含了計算loss,accuracy和梯度下降。tensorflow2.0 主推eager模...