为什么model.evaluate()和我自己根据model.predict()计算损失之间有区别?

问题描述 投票:0回答:1

我正在运行keras的神经网络。有我的代码:

import numpy as np
from keras import Model
from keras.models import Sequential
from keras.layers import Dense
from keras import backend as K


def mean_squared_error(y_true, y_pred):
   return K.mean(K.square(y_pred - y_true),axis=-1)

np.random.seed(1)
Train_X = np.random.randint(low=0,high=100,size = (50,5))
Train_Y = np.matmul(Train_X,np.arange(10).reshape(5,2))+np.random.randint(low=0,high=10,size=(50,2))
Test_X = np.random.randint(low=0,high=100,size = (10,5))
Test_Y = np.matmul(Test_X,np.arange(10).reshape(5,2))+np.random.randint(low=0,high=10,size=(10,2))

model = Sequential()
model.add(Dense(4,activation = 'relu')) 
model.add(Dense(2,activation='relu')) 
model.add(Dense(2,activation='relu'))
model.add(Dense(2))
model.compile(loss=mean_squared_error, optimizer='adam', metrics=['mae'])

history = model.fit(Train_X, Train_Y, epochs=100, batch_size=5,validation_data = (Test_X, Test_Y)) 

loss1 = model.evaluate(Test_X,Test_Y)
loss2 = history.history['val_loss'][99]

y_pred = model.predict(Test_X)
y_true = Test_Y
loss3 = np.mean(np.square(y_pred-y_true))

我发现loss1loss2相同,但与loss3不同。所以我感到很困惑。有人可以告诉我为什么吗?

keras neural-network predict evaluate
1个回答
0
投票

[这可能是由于Test_Yy_pred的dtype不同-Keras会尝试自动为您解决dtype不匹配的情况,因此Test_y可能是float64,y_pred是float32。如果确实如此,请尝试对loss3计算执行此操作,然后查看它是否对您有用:

y_pred = model.predict(Test_X)
y_true = Test_Y.astype(np.float32)
loss3 = np.mean(np.square(y_pred-y_true))
© www.soinside.com 2019 - 2024. All rights reserved.