【问题标题】:Increasing loss funcion in elementary example在基本示例中增加损失函数
【发布时间】:2019-09-11 03:17:10
【问题描述】:

我想预测理想的线性数据(相同的函数)

data = np.asarray(range(100),dtype=np.float32)

我习惯了这个线性函数

model = Sequential([
    Dense(1, input_shape=(1,))
])

model.compile(optimizer='sgd', loss='mse')

model.fit(data, data, epochs=10, batch_size=100)

但我的损失函数正在增加。这个简单的代码有什么问题?

Epoch 1/10
100/100 [==============================] - 1s 7ms/step - loss: 3559.4075
Epoch 2/10
100/100 [==============================] - 0s 20us/step - loss: 14893056.0000
Epoch 3/10
100/100 [==============================] - 0s 170us/step - loss: 62314639360.0000
Epoch 4/10
100/100 [==============================] - 0s 30us/step - loss: 260733187129344.0000
Epoch 5/10
100/100 [==============================] - 0s 70us/step - loss: 1090944439330799616.0000
Epoch 6/10
100/100 [==============================] - 0s 20us/step - loss: 4564665060617919397888.0000
Epoch 7/10
100/100 [==============================] - 0s 30us/step - loss: 19099198494067630815576064.0000
Epoch 8/10
100/100 [==============================] - 0s 30us/step - loss: 79913699011849558249925771264.0000
Epoch 9/10
100/100 [==============================] - 0s 50us/step - loss: 334370041805433555342669660553216.0000
Epoch 10/10
100/100 [==============================] - 0s 20us/step - loss: 1399051141583436919510296595359858688.0000

【问题讨论】:

    标签: python tensorflow keras neural-network regression


    【解决方案1】:

    您需要标准化输入功能。你可以学习How and why do normalization and feature scaling work?。让我在这里以(x-mean(x))/std(x)为例。

    import numpy as np
    from keras.layers import Dense
    from keras.models import Sequential
    
    data = np.asarray(range(100),dtype=np.float32)
    model = Sequential([
        Dense(1, input_shape=(1,))
    ])
    
    model.compile(optimizer='sgd', loss='mse')
    model.fit((data-np.mean(data))/np.std(data), data, epochs=200, batch_size=100) 
    
    Epoch 1/200
    100/100 [==============================] - 3s 26ms/step - loss: 3284.6235
    Epoch 2/200
    100/100 [==============================] - 0s 25us/step - loss: 3154.5522
    Epoch 3/200
    100/100 [==============================] - 0s 22us/step - loss: 3029.6318
    ...
    100/100 [==============================] - 0s 27us/step - loss: 1.1016
    Epoch 200/200
    100/100 [==============================] - 0s 28us/step - loss: 1.0579
    

    【讨论】:

    • 感谢您的回答,但我仍然不明白为什么没有监管它就行不通。该算法的每一步都试图找到最大梯度(损失函数最大减小的方向)......但更新后损失更大。 (我不使用动量之类的其他方法。)
    • @Newbie 其实除了正则化之外,你还可以尝试在SDG中使用像lr=0.0001这样足够小的学习率来得到上述结果。根本问题是模型无法收敛,并且像您的问题一样盲目更新参数。过高的学习率导致模型找不到全局最小值。正则化可以使损失函数更加平滑,加速模型的收敛。另外,如果使用类似于Adam的优化方法进行多次迭代,也可以得到上述结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多