如何使用训练好的神经网络预测新数据(Tensorflow 2.0,回归分析)?

我刚开始学习机器学习,并且在使用Tensorflow。我按照Tensorflow网站上的教程训练了一个用于回归的神经网络。我有3个输入列和2个标记为“标签”的输出列。网络在使用测试数据时似乎能很好地预测数据,但是当我尝试预测测试和训练集之外的数据时,通过导入仅有3个输入列的文件,它会报错,显示“期望dense_input具有形状(5,),但得到的数组形状为(3,)”。我明白这是因为模型是在5列数据集上训练的,但我希望从训练好的模型中预测未知值,并且我不知道输出。当我只知道输入(3列)时,如何预测结果?如果我必须知道输出(我确定我不用知道),那么这种回归分析的意义何在?

我的数据看起来像这样:enter image description here

我希望神经网络能够以这种方式运行:enter image description here

我想预测那些我没有数据的输出(比如,RE = 25, BR=0.5, PR=0.25),而且我不能使用线性回归,因为输入和输出之间的关系不是线性的。我尝试过在训练后将输入预测为5列文件,最后两列是垃圾数据(零),但模型试图预测这些零。据我所知,一旦模型被训练,权重和偏置应该是固定的,无论最后两列(输出)中是什么,模型都应该给我预期的输出。我做错了什么?任何帮助都将不胜感激。我在这里上传了代码中使用的文件 https://drive.google.com/open?id=1HoMID_razNHcXEGIgvnL8WG3H5WRTl3B 。此外,有时我的MSE(均方误差)会收敛,有时不会。我怀疑这可能与随机向模型提供数据有关,尽管我不确定。


import tensorflow as tffrom tensorflow import kerasimport numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionimport picklecolumn_names = ['Reynolds Number', 'Blockage Ratio', 'Prandtl Number', 'Nusselt Number', 'Drag Coefficient']        dataset = pd.read_csv('WW.csv', names=column_names, skipinitialspace=True)      train_dataset = dataset.sample(frac=0.9,random_state=0)test_dataset = dataset.drop(train_dataset.index)    train_labels = train_dataset.iloc[:, 3:].valuestest_labels = test_dataset.iloc[:, 3:].values   print(train_dataset)print(test_dataset)                         def build_model():  model = keras.Sequential([    keras.layers.Dense(3, activation='relu', input_shape=[len(train_dataset.keys())]),    keras.layers.Dense(4, activation='relu'),    keras.layers.Dense(2)  ])  optimizer = tf.keras.optimizers.RMSprop(0.001)  model.compile(loss='mse',                optimizer=optimizer,                metrics=['mae', 'mse'])  return modelmodel = build_model()model.summary()class PrintDot(keras.callbacks.Callback):  def on_epoch_end(self, epoch, logs):    if epoch % 100 == 0: print('')    print('.', end='')EPOCHS = 5000early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=500)history = model.fit(train_dataset, train_labels, epochs=EPOCHS, validation_split = 0.2, verbose=0, callbacks=[early_stop, PrintDot()])model.save("model.h5")hist = pd.DataFrame(history.history)hist['epoch'] = history.epochprint('\n', hist.tail())def plot_history(history):  hist = pd.DataFrame(history.history)  hist['epoch'] = history.epoch  plt.figure()  plt.xlabel('Epoch')  plt.ylabel('Mean Abs Error [MPG]')  plt.plot(hist['epoch'], hist['mae'],           label='Train Error')  plt.plot(hist['epoch'], hist['val_mae'],           label = 'Val Error')  plt.ylim([0,5])  plt.legend()  plt.figure()  plt.xlabel('Epoch')  plt.ylabel('Mean Square Error [$MPG^2$]')  plt.plot(hist['epoch'], hist['mse'],           label='Train Error')  plt.plot(hist['epoch'], hist['val_mse'],           label = 'Val Error')  plt.ylim([0,20])  plt.legend()  plt.show()plot_history(history)test_predictions = model.predict(test_dataset)test_dataset['Predicted Nu'], test_dataset['Predicted CD'] = test_predictions[:,0], test_predictions[:,1]print(test_dataset)np.savetxt('test_dataset.txt', test_dataset, delimiter=',')predict = model.predict(train_dataset)train_dataset['Predicted Nu'], train_dataset['Predicted CD'] = predict[:,0], predict[:,1]print(train_dataset)np.savetxt('train_dataset.txt', train_dataset, delimiter=',')class_names = ['Reynolds Number', 'Blockage Ratio', 'Prandtl Number', 'junk Nusselt Number', 'junk Drag Coefficient']    all_inputs = pd.read_csv('Predict_Input.csv', names=class_names, skipinitialspace=True)all_outputs = model.predict(all_inputs)all_inputs['Predicted Nu'], all_inputs['Predicted CD'] = all_outputs[:,0], all_outputs[:,1]print(all_inputs)

回答:

所以,重新说明一下你的需求,你有一个总共5个特征的数据集。你需要使用前三个特征作为输入,最后两个作为目标。以下是需要更改的内容以实现这一点。


import tensorflow as tffrom tensorflow import kerasimport numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionimport picklecolumn_names = ['Reynolds Number', 'Blockage Ratio', 'Prandtl Number', 'Nusselt Number', 'Drag Coefficient']        dataset = pd.read_csv('WW.csv', names=column_names, skipinitialspace=True)      train_dataset = dataset.sample(frac=0.9,random_state=0)test_dataset = dataset.drop(train_dataset.index)    train_labels = train_dataset.iloc[:, 3:].valuestest_labels = test_dataset.iloc[:, 3:].values   print(train_dataset)print(test_dataset)                         

构建模型

你的模型应该只有三个特征。因此,input_shape应该是3(不是5)。Keras会自动添加批处理形状。


# 我们将输入大小设置为(None, 3)def build_model():  model = keras.Sequential([    keras.layers.Dense(3, activation='relu', input_shape=(3,)),    keras.layers.Dense(4, activation='relu'),    keras.layers.Dense(2)  ])  optimizer = tf.keras.optimizers.RMSprop(0.001)  model.compile(loss='mse',                optimizer=optimizer,                metrics=['mae', 'mse'])  return modelmodel = build_model()model.summary()class PrintDot(keras.callbacks.Callback):  def on_epoch_end(self, epoch, logs):    if epoch % 100 == 0: print('')    print('.', end='')

训练模型

在训练模型时,你只需将前三个特征作为输入,最后两个特征作为标签/目标。现在你应该看到这如何帮助解决你的问题。现在你可以安全地仅使用已知的三个特征来预测两个未知变量。

因此,在训练时作为输入我们只提供前三列,目标将是最后两列。


EPOCHS = 5000early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=500)# 注意输入只取前三列history = model.fit(train_dataset.iloc[:,:3], train_labels, epochs=EPOCHS, validation_split = 0.2, verbose=0, callbacks=[early_stop, PrintDot()])model.save("model.h5")

测试时间

在测试时同样适用这个规则,你就不用在测试时使用未知的两个特征来预测(即我们只使用前三个特征)。


test_predictions = model.predict(test_dataset.iloc[:,:3])print(test_dataset)test_dataset['Predicted Nu'], test_dataset['Predicted CD'] = test_predictions[:,0], test_predictions[:,1]print("\nPredicted\n")print(test_dataset)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注