设置随机种子的函数

```python
import random
import torch
from keras.layers import Dense, Input
from keras.models import Model
from keras.optimizers import Adam, SGD
import keras.backend as K
def huber_loss(input, target, in_keras=True):
    error = input - target
    quadratic_term = error * error / 2
    linear_term = abs(error) - 1 / 2
    use_linear_term = (abs(error) > 1.0)

    if isinstance(input,torch.Tensor):
        use_linear_term = use_linear_term.float()
        # print(type(use_linear_term))
    elif in_keras:
        use_linear_term = K.cast(use_linear_term, 'float32')
        # Keras won't let us multiply floats by booleans, so we explicitly cast the booleans to floats
        # print(type(use_linear_term))


    return use_linear_term * linear_term + (1 - use_linear_term) * quadratic_term

def set_seed(seed=1234): # 设置种子函数的方法 #设置随机种子好做对比,每次生成的随机数都是固定的这个种子可以随便设置
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
if __name__ == '__main__':
    set_seed()
    loss_fn = torch.nn.SmoothL1Loss(reduce=False, size_average=False)#torch 的内置huber_loss
    input_ = torch.autograd.Variable(torch.randn(3,4))
    target = torch.autograd.Variable(torch.randn(3,4))
    loss = loss_fn(input_ , target)

    print(input_ )
    print(target)
    print(loss)
    print("huber_loss",huber_loss(input_ ,target))#算huber loss的两种写法 可以发现huber_loss(input,target)和loss_fn算出的结果是相同的

keras的网络构建

lr_br = 0.05
input_ = Input(shape=[4,5], name='input')#输出层
hidden = Dense(64, activation='relu')(input_)#隐藏层
out = Dense(3, activation='softmax')(hidden)#输出层
model = Model(inputs=input_, outputs=out, name="br-model")
sgd_br = SGD(lr=lr_br)
model.compile(loss=huber_loss, optimizer=sgd_br, metrics=['accuracy', 'mse'])
testinput_ = torch.autograd.Variable(torch.randn(4, 4, 5))#因为训练的时候输入的需要是一个batch的数据,如果输入数据和输入的大小是相等的 则会报错 expected input to have 3 dimensions, but got array with shape torch.Size([4, 5]) 多出来的一维代表这是多少个数据
predictvalue = model.predict(testinput_)#输出的尺寸是数据个数*输出的shape
print("testinput_",testinput_)
print("predictvalue",predictvalue)

该函数对离群点的惩罚程度超过一定阈值会变成线性的,又不失可导性
这个图是huber loss不同的ρ对损失函数的惩罚程度,可以看出当ρ越小,超出±ρ的区域的惩罚变为线性的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值