今天在搭建簡單模型訓練花資料的時候發現loss,始終為乙個數。
loss:實際輸出值和標籤值之間的誤差距離。在分類任務中,如何評判輸出和期望之間的接近?
交叉熵:刻畫了兩個概率分布之間的距離。是分類問題中應用比較廣的一種損失函式。
反向更新權重:有了損失函式,知道了實際輸出和真實值之間的距離,用梯度求導更新權重。
學習率:公式中的a就是學習率,表示的是每次權重更新的大小。
學習率設定:當學習率設定過大,x會在谷間震動,並沒有更新。可以設定隨著步伐增加,減小學習率。
import tensorflow as tf
import cv2 as cv
import numpy as np
filepath="/home/zw/資料集/flower_photos.tfrecords"
filequeue=tf.train.string_input_producer([filepath],shuffle=false)
reader=tf.tfrecordreader()
_,example=reader.read(filequeue)
features=tf.parse_single_example(
example,
features=)
image=features['image']
decode_image=tf.decode_raw(image,tf.uint8)
decode_image=tf.reshape(decode_image,[600,600,3])
img = tf.cast(decode_image, tf.float32) * (1. / 255) - 0.5
label = tf.cast(features['label'], tf.int64)
img_batch,labels_batch=tf.train.shuffle_batch([img,label],batch_size=20,capacity=160,min_after_dequeue=100)
with tf.variable_scope('conv1') as scop1:
w1=tf.get_variable('w1',[3,3,3,8],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32))
b1=tf.get_variable('b1',shape=[8],dtype=tf.float32,initializer=tf.constant_initializer(0.1,dtype=tf.float32))
conv1=tf.nn.conv2d(img_batch,w1,strides=[1,2,2,1],padding='same')
pre_activate1=tf.nn.bias_add(conv1,b1)
relu1=tf.nn.relu(pre_activate1)
with tf.variable_scope('pooling5') as scop4:
pooling5=tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='same')
with tf.variable_scope('fc1') as scop5:
dim=pooling5.get_shape().as_list()
nodes=dim[1]*dim[2]*dim[3]
reshape = tf.reshape(pooling5, [dim[0],nodes])
wfc1=tf.get_variable('wfc1',shape=[nodes,1000],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32))
bfc1=tf.get_variable('bfc1',shape=[1000],dtype=tf.float32,initializer=tf.constant_initializer(0.1,dtype=tf.float32))
fc1=tf.nn.relu(tf.matmul(reshape,wfc1)+bfc1)
with tf.variable_scope('fc3') as scop6:
wfc3=tf.get_variable('wfc3',[1000,5],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1))
bfc3=tf.get_variable('bfc3',[5],dtype=tf.float32,initializer=tf.constant_initializer(0.1,dtype=tf.float32))
fc3=tf.nn.relu(tf.matmul(fc1,wfc3)+bfc3)
print(fc3)
with tf.variable_scope('loss') as scop7:
cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels_batch,logits=fc3,name='xentropy_pre_example')
loss=tf.reduce_mean(cross_entropy)
with tf.variable_scope('optimizer') as scop8:
optimizer=tf.train.adamoptimizer(learning_rate=0.00000001)
#global_step=tf.variable(0,name='global_step',trainable=false)
train_op=optimizer.minimize(cross_entropy)
with tf.session() as sess:
sess.run(tf.global_variables_initializer())
coord=tf.train.coordinator()
threads=tf.train.start_queue_runners(sess=sess,coord=coord)
for i in range(2000):
lossed,trained=sess.run([loss,train_op],)
print(lossed)
coord.request_stop()
coord.join(threads)
訓練網路出現loss為NaN的情況
原因 在學習過程中,梯度變得非常大,使得學習的過程偏離了正常的軌跡。症狀 觀察輸出日誌中每次迭代的loss值,發現loss隨著迭代有明顯的增長,最後因為loss值太大以致於不能用浮點數去表示,所以變成nan。可採取的方法 1.降低學習率,比如solver.prototxt中base lr,降低乙個數...
網路訓練時loss不下降的原因
1.網路訓練時train loss與test loss的結果分析 1 train loss不斷下降,test loss不斷下降 可能發生的原因 網路還在學習中,loss在穩步下降。2 train loss不斷下降,test loss趨於不變 可能發生的原因 網路出現過擬合的現象,因此在訓練集上表現為...
loss訓練時的不下降 nan或者為0
1 loss不下降 2 檢測中faster rcnn的loss是nan 大部分是座標越界造成的 3 檢測中faster rcnn的bbox loss為0,主要是因為fg太少,遇到過第一階段的rois中,假設batch size是128,得到fg bg 1 127,很可能bbox loss等於0,因為...