關於訓練時Loss值不變的情況分析

2021-08-29 20:32:51 字數 3268 閱讀 8440

今天在搭建簡單模型訓練花資料的時候發現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,因為...