2.3 tensorflow简单自定义损失函数

本文详细介绍了在TensorFlow中如何自定义损失函数,包括损失函数的作用、基本原理及其实现步骤,通过实例展示了自定义损失函数在深度学习模型训练中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import tensorflow as tf
# 利用numpy生成数据集
from numpy.random import RandomState
# 定义训练集的barch大小
batch_size = 8

# 定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2,3],stddev = 1,seed=1))

# 在shape的一个维度上使用None可以方便使用不同规模大小的batch
x =  tf.placeholder(tf.float32,shape=(None,2),name='x_input') #不指定行数只指定输入列数
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y_input')

#定义神经网络的前向传播过程
y = tf.matmul(x,w1)


# 激活函数的选择
# ReLU f(x) = max(x,0)
# sigmoid f(x) = 1 / (1+e**-x)
# tanh f(x) = (1-e**-2*x) / (1+e**-2*x)

# 定义损失函数和反向传播算法
# 如果预测少了损失函数系数为10,预测多了损失函数系数为1
loss_less = 10
loss_more = 1
# tf.where 第一个参数是条件,第二个参数是为真的取值,第三个参数是为假的取值,类似于excel
# tf.greater(a,b) if a> b return True else return False
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)

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)
    print(sess.run(w1))


    '''
    [[-0.81131822  1.48459876  0.06532937]
    [-2.4427042   0.0992484   0.59122431]]
    '''

    # 设定训练的轮数
    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={x: X[start:end],y_:Y[start:end]})

        if i % 1000 == 0:
            total_loss_function = sess.run(loss,feed_dict={x:X,y_:Y})
            print("After %d training steps, loss function on all data is %g"%(i,total_loss_function))
        
    '''
    After 0 training steps, loss function on all data is 4705.95
    After 1000 training steps, loss function on all data is 2297.3
    After 2000 training steps, loss function on all data is 1001.62
    After 3000 training steps, loss function on all data is 172.299
    After 4000 training steps, loss function on all data is 66.8202
    '''

    print(sess.run(w1))

    '''
    [[ 1.57269204  1.01884651  1.01993823]
    [ 0.94328171  1.04256701  1.04327226]]
    '''
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值