почему я различаю model.evaluate () и вычисленные потери самостоятельно на основе model.predict ()? - PullRequest
1 голос
/ 24 апреля 2020

Я управляю нейронной сетью по 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))

Я считаю, что loss1 совпадает с loss2, но отличается от loss3. Так что я чувствую себя таким смущенным. Может ли кто-нибудь сказать мне, почему?

1 Ответ

0 голосов
/ 24 апреля 2020

Возможно, это связано с разными dtypes для Test_Y и y_pred. Keras пытается автоматически позаботиться о несоответствиях dtype для вас, поэтому возможно, что Test_Y - это float64, а y_pred - это float32. Если это действительно так, попробуйте преобразовать один из их dtypes для вычисления loss3 и посмотрите, совпадают ли значения.

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