Являются ли эти 2 кера кода глубокого обучения одинаковыми для нескольких выходов? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть проблема, связанная с прогнозированием скорости профиля и давления, учитывая AOA, x, y. Я использую керас с MLP. У меня есть 3 входа (AOA, x, y), и я должен предсказать 3 выхода (u, v, p). У меня изначально есть код, который выводит потери MSE как одно значение. Тем не менее, я изменил код, так что у меня есть MSE для каждого выхода. Однако я не получаю среднюю MSE из 3 выходов (u_mean_squared_error: 73,63%, v_mean_squared_error: 1,13%, p_mean_squared_error: 2,16%), равную более ранней единственной потере MSE (mean_squared_error: 5,81%). Следовательно, мне интересно, если мой новый код неверен. Или я делаю это правильно. Может ли кто-нибудь помочь?

Старый код:

# load pima indians dataset
dataset = numpy.loadtxt("S1020_data.csv", delimiter=",")
# split into input and output variables
X = dataset[:,0:3]
Y = dataset[:,3:6]

# split into 67% for train and 33% for test
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)

# create model
input_data = layers.Input(shape=(3,))

#create the layers and pass them the input tensor to get the output tensor:    
hidden1Out = Dense(units=12, activation='relu')(input_data)
hidden2Out = Dense(units=8, activation='relu')(hidden1Out)    
finalOut = Dense(units=3, activation='relu')(hidden2Out)   

#define the model's start and end points
model = Model(input_data, finalOut)

# Compile model
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error'])

# Fit the model
model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=10, batch_size=1000)

# evaluate the model
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

Новый код:

# load pima indians dataset
dataset = numpy.loadtxt("S1020_data.csv", delimiter=",")
# split into input and output variables
X = dataset[:,0:3]
Y = dataset[:,3:6]

# split into 67% for train and 33% for test
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)

# create model
input_data = layers.Input(shape=(3,))

#create the layers and pass them the input tensor to get the output tensor:    
hidden1Out = Dense(units=12, activation='relu')(input_data)
hidden2Out = Dense(units=8, activation='relu')(hidden1Out)    
u_out = Dense(1, activation='relu', name='u')(hidden2Out)   
v_out = Dense(1, activation='relu', name='v')(hidden2Out)   
p_out = Dense(1, activation='relu', name='p')(hidden2Out)   

#define the model's start and end points
model = Model(input_data,outputs = [u_out, v_out, p_out])

# Compile model
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error'])

# Fit the model
model.fit(X_train, [y_train[:,0], y_train[:,1], y_train[:,2]], validation_data=(X_test,[y_test[:,0], y_test[:,1], y_test[:,2]]), epochs=10, batch_size=1000)

# evaluate the model
scores = model.evaluate(X, [Y[:,0], Y[:,1], Y[:,2]])

for i in range(7):
    print("\n%s: %.2f%%" % (model.metrics_names[i], scores[i]*100))

1 Ответ

0 голосов
/ 22 марта 2020

Я думаю, что разница исходит от цели оптимизации.

В вашем старом коде целью было:

sqrt ((u_true - u_pred) ^ 2 + (v_true - v_pred) ^ 2 + (p_true - p_pred) ^ 2)

, что минимизирует 2-норму вектора [u_pred, v_pred, p_pred] относительно его цели.


Но в новой целью стало:

sqrt ((u_true - u_pred) ^ 2) + sqrt ((v_true - v_pred) ^ 2) + sqrt ((p_true - p_pred) ^ 2)

что сильно отличается от предыдущего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...