当使用预测作为训练示例时,为什么我的损失函数不是零?

2022-12-05 02:40:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用ROS、OpenCV和Keras构建一个神经网络来控制一个摇摄-倾斜万向节。我将位置误差及其导数表示为状态输入,我的方法是将运动导致的输出命令位置误差添加到输出命令中。因此,我的示例收集如下: 输入(t)——>;输出(t)+错误(t+1),我的理解是,当错误很小时,网络更新将停止

然而,在未能收敛之后,我决定尝试删除错误项,以验证我的损失为零。我认为无论网络的当前状态如何,我都在通过它已经预测的培训示例。令我惊讶的是,这仍然给了我一个非零损失。我觉得在网络如何训练方面,我缺少了一些基本的东西

我把一个随机输入的最小工作示例放在一起,为了简单起见,去掉了倾斜轴,但如果我的问题出在这里,则保留基本的神经网络结构

from tensorflow.keras.layers import Input, Dense, BatchNormalization, Dropout, Activation
from tensorflow.keras.models import Model
from tensorflow.keras import optimizers
from tensorflow.keras.regularizers import l2
import numpy as np 

input_dims = 4
batch_size = 4

state_input = Input(shape=input_dims)
initializer = 'glorot_uniform'
x = Dense(128, kernel_initializer = initializer, kernel_regularizer=l2(0.1), 
bias_regularizer=l2(0.01), name='neural_inputLayer')(state_input)
x = BatchNormalization()(x)
x = Activation('softplus')(x)
x = Dropout(0.3)(x)
x_pan = Dense(128, activation='softplus', kernel_initializer = initializer, 
kernel_regularizer=l2(0.1), bias_regularizer=l2(0.01), name='neural_PantLayer')(x)
mu_pan = Dense(1, activation='linear',kernel_initializer = initializer, kernel_regularizer=l2(0.1), 
bias_regularizer=l2(0.01), name='neural_ctrl_output_mu_pan')(x_pan)

model = Model(inputs=state_input, outputs=mu_pan)

OPTIMIZER = optimizers.Nadam(learning_rate=0.01, beta_1=0.9, beta_2=0.999, clipnorm=0.5, 
clipvalue=0.1)

model.compile(optimizer=OPTIMIZER, loss='mse')
model.summary()

test_inputs = np.array([])
test_outputs = np.array([])

for i in range(batch_size):
    test_input = np.random.rand(input_dims)
    test_output = model.predict(test_input.reshape(1,input_dims))

    #save IO pairs
    if i == 0:
        test_inputs = test_input
    else:
        test_inputs = np.vstack((test_inputs, test_input))

    test_outputs = np.append(test_outputs,test_output)


test_loss = model.fit(test_inputs, 
test_outputs,batch_size=batch_size,verbose=True,shuffle=True,epochs=10)