jiachuzhang 2023-03-06 16:43 采纳率: 100%
浏览 75
已结题

基于多层感知机的船舶油耗预测模型如何去改良?

该多层感知机网络的输入特征有风速,吃水,舵角等多项传感器数据,输出只有油耗预测一项。
本人使用TensorFlow构建模型的代码如下:


import pandas as pd
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
import tensorflow as tf
from keras.callbacks import EarlyStopping, ModelCheckpoint

ENV = pd.read_csv(r"C:\Users\14013\Desktop\数据预处理\大表\datas15one.csv")
features = ENV.iloc[:,[6,7,8,9,11,13,14,15]]
target= ENV.iloc[:,[0]]

features_train,features_test, target_train, target_test =train_test_split(features,target,test_size=0.2)

model = tf.keras.Sequential([tf.keras.layers.Dense(8,input_shape=(8,)),
                             tf.keras.layers.Dense(32,activation='tanh'),
                             tf.keras.layers.Dense(32,activation='tanh'),
                             tf.keras.layers.Dense(1)])
    
model.compile(optimizer = 'adam',
              loss = 'mse' # 均方误差
)

callbacks = [EarlyStopping(monitor="val_loss",patience=20,min_delta=0,verbose=2,mode="min"),
             ModelCheckpoint(filepath="best_model.h5",monitor="val_loss",save_best_only=True)]

history=model.fit(features_train,target_train,
                    epochs=15000,
                    verbose=1,
                    callbacks =callbacks,
                    validation_data=(features_test,target_test))

如何从模型结构和训练方法上改良这个感知机模型?(本科生毕设导师要求有创新性,苦啊!)

注:改良方法里不包括:正则化,提前停止,dropout,单纯改感知机内参数的方法。

PS:本人这个毕设感知机网络做的手足无措,若有贵人相助,必重金酬谢。若有意,请在CSDN上请联系我。

  • 写回答

8条回答 默认 最新

  • 「已注销」 2023-03-06 17:02
    关注

    这个可以有,你把数据集发给我吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • jiachuzhang 2023-03-06 16:59
    关注

    就这些特征和数据,只能用感知机网络mlp,回答的改良方式请从从训练方法和改变模型结构出发。

    评论
  • BitGPT 2023-03-06 16:48
    关注

    该回答引用ChatGPT

    针对你的多层感知机模型,以下是几个可能的改良建议:

    1、考虑增加更多的隐藏层并更改激活函数:
    目前你的模型仅包含两个隐藏层,可以尝试添加更多的隐藏层,以增加模型的复杂度和拟合能力。同时,尝试不同的激活函数,如ReLU、LeakyReLU或ELU,以改善模型的非线性表达能力。

    2、添加批量标准化:
    批量标准化是一种通过规范化输入数据来提高模型性能的技术。添加批量标准化层可以使模型更容易收敛,并且可以提高模型在训练集和测试集上的准确性。

    3、使用更优化的优化器:
    优化器对训练过程非常重要。你当前使用的是Adam优化器,但也可以尝试其他的优化器,如SGD、Adagrad或RMSProp,以改进模型性能。

    4、尝试其他类型的神经网络:
    多层感知机是一种最基本的神经网络模型,还有其他类型的神经网络,如卷积神经网络(CNN)和循环神经网络(RNN),可以在特定场景下比MLP模型表现更好。例如,如果你的数据是图像数据,则使用CNN模型通常会更好。

    5、数据增强:
    对于模型性能提升,数据增强是一个非常有用的技术。通过数据增强技术,可以使用旋转、翻转等方式来增加数据量,并帮助模型更好地泛化。例如,对于风速数据,可以考虑通过对风速数据进行随机扰动,来增加训练集数据量。

    评论
  • 「已注销」 2023-03-06 16:50
    关注

    “Devil组”引证GPT后的撰写:
    有几种方法可以改进您的多层感知机(MLP)模型:

    • 数据预处理
      尝试使用不同的数据预处理技术来减少噪声和异常值对模型的影响。例如,可以尝试使用不同的缩放技术(例如min-max缩放、标准化、正则化等)来对特征进行预处理。还可以使用不同的方法来填充缺失值,例如使用中值、平均值或最常见的值来替换缺失值。
    • 添加新特征
      尝试添加新特征,这些特征可能与输出变量相关。可以根据领域知识或进行特征选择技术来选择可能与输出变量相关的特征。
    • 使用不同的激活函数
      尝试使用不同的激活函数来增强模型的非线性性。例如,可以尝试使用ReLU、LeakyReLU、ELU、sigmoid等激活函数。
    • 改变网络结构
      尝试使用不同的网络结构来增加模型的复杂度和灵活性。可以尝试添加更多的隐藏层、增加隐藏单元的数量或改变隐藏层的结构。
    • 批规范化
      尝试使用批规范化技术来加速训练、改善模型的收敛性,并提高模型的泛化能力。
    • 学习率调度
      尝试使用不同的学习率调度技术来优化模型的训练过程。例如,用动态学习率调度技术,如Adaptive Learning Rate(Adagrad、Adadelta、RMSProp、Adam等),来调整学习率以适应训练过程的动态变化。
    • 模型集成
      尝试使用模型集成技术来改进模型性能。例如,用bagging、boosting、stacking等技术来组合多个不同的模型,以提高预测精度和稳定性。
    评论 编辑记录
  • 「已注销」 2023-03-06 16:54
    关注

    参考GPT和自己的思路,以下是一些改进多层感知机的方法,您可以考虑它们来创新您的毕设:

    1 特征工程:从数据预处理阶段入手,挖掘更多的特征,将原始数据进行组合、衍生等,提高模型输入的维度和多样性。

    2 模型结构改进:除了多层感知机,还可以考虑使用其他的深度学习模型,如循环神经网络(RNN)、卷积神经网络(CNN)等。

    3 模型集成:通过将多个模型的输出结果进行融合来提高模型的性能,如投票、加权平均等。

    4 模型优化:在训练过程中,可以使用不同的优化算法、学习率衰减策略、批次归一化等来提高模型性能。

    5 集成其他数据源:可以考虑引入其他数据源,如历史油耗、航线信息、天气等,将多个数据源融合到模型中,提高预测精度。
    6 使用自编码器:自编码器可以用于特征提取,通过学习数据的表示来自动提取有用的特征,从而提高模型的性能。

    7 迁移学习:将已经训练好的模型在本问题上进行微调,可以在不增加数据量的情况下提高模型性能。

    希望这些方法能够给您带来启示。

    评论 编辑记录
  • 实相无相 2023-03-06 16:55
    关注

    该多层感知机网络的输入特征包括风速、吃水、舵角等多项传感器数据,输出只有油耗预测一项。

    目前模型

    当前模型使用 TensorFlow 构建,代码如下:

    import pandas as pd
    from matplotlib import pyplot as plt
    from sklearn.model_selection import train_test_split
    import tensorflow as tf
    from keras.callbacks import EarlyStopping, ModelCheckpoint
    
    ENV = pd.read_csv(r"C:\\Users\\14013\\Desktop\\数据预处理\\大表\\datas15one.csv")
    features = ENV.iloc[:,[6,7,8,9,11,13,14,15]]
    target= ENV.iloc[:,[0]]
    
    features_train,features_test, target_train, target_test =train_test_split(features,target,test_size=0.2)
    
    model = tf.keras.Sequential([tf.keras.layers.Dense(8,input_shape=(8,)),
                                 tf.keras.layers.Dense(32,activation='tanh'),
                                 tf.keras.layers.Dense(32,activation='tanh'),
                                 tf.keras.layers.Dense(1)])
    
    model.compile(optimizer = 'adam',
                  loss = 'mse' # 均方误差
    )
    
    callbacks = [EarlyStopping(monitor="val_loss",patience=20,min_delta=0,verbose=2,mode="min"),
                 ModelCheckpoint(filepath="best_model.h5",monitor="val_loss",save_best_only=True)]
    
    history=model.fit(features_train,target_train,
                        epochs=15000,
                        verbose=1,
                        callbacks =callbacks,
                        validation_data=(features_test,target_test))
    

    改良建议

    以下是一些可以考虑的模型结构和训练方法改良建议:

    1. 增加层数

    可以增加模型的层数,以提高模型的复杂度和表达能力。可以通过增加 Dense 层或者其他类型的层来实现。需要注意的是,增加层数可能会导致过拟合的问题,需要进行适当的正则化或其他方法来缓解这个问题。

    2. 使用更复杂的激活函数

    可以考虑使用更复杂的激活函数,如 ReLU、LeakyReLU 等来提高模型的表达能力。

    3. 使用更先进的优化算法

    可以使用更先进的优化算法,如 AdamW、RAdam 等来加速模型的收敛速度和提高模型的准确率。

    4. 添加批归一化层

    可以添加批归一化层来加速模型的收敛速度和提高模型的准确率。批归一化层可以在每个批次的数据上对输入进行归一化,从而加速模型的训练和提高模型的鲁棒性。

    5. 使用更多的特征

    可以考虑增加更多的特征,如船舶的载重量、船舶的长度、船舶的宽度等,来提高模型的预测能力。

    6. 使用其他类型的神经网络

    可以考虑使用其他类型的神经网络,如卷积神经网络、循环神经网络等,来提高模型的表达能力和预测能力。

    7. 数据增强

    可以使用数据增强的方法来扩充数据集,从而提高模型的泛化能力。例如可以对数据进行旋转、平移、缩放等操作,从而扩充数据集。

    评论
  • dahe0825 2023-03-06 17:40
    关注

    参考chatGPT的回答内容,感知机模型的改良可以从以下几个方面考虑:

    1.增加更多的特征:可以考虑添加更多的传感器数据,例如船舶的航速、航向等数据,这些数据对于油耗的预测可能有重要的影响。

    2.使用更高级的激活函数:可以考虑使用一些比tanh更高级的激活函数,例如ReLU、LeakyReLU等,这些激活函数在某些情况下可能能够提高模型的表现。

    3.增加更多的隐藏层:可以增加更多的隐藏层来增加模型的复杂度,这有助于模型更好地拟合训练数据,但要注意避免过拟合。

    4.调整学习率:可以通过调整学习率来改善模型的训练效果,学习率过小可能导致模型收敛速度较慢,学习率过大可能导致模型无法收敛。

    5.使用更高级的优化器:可以考虑使用一些比Adam更高级的优化器,例如Adagrad、RMSprop等,这些优化器在某些情况下可能能够提高模型的表现。

    6.使用正则化技术:可以考虑使用L1或L2正则化、Dropout等技术来避免过拟合。

    改进的代码如下:

    import pandas as pd
    from matplotlib import pyplot as plt
    from sklearn.model_selection import train_test_split
    import tensorflow as tf
    from keras.callbacks import EarlyStopping, ModelCheckpoint
    
    ENV = pd.read_csv(r"C:\Users\14013\Desktop\数据预处理\大表\datas15one.csv")
    features = ENV.iloc[:,[6,7,8,9,11,13,14,15]]
    target= ENV.iloc[:,[0]]
    
    features_train,features_test, target_train, target_test =train_test_split(features,target,test_size=0.2)
    
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(8, input_shape=(8,), activation='relu'),
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dense(1)
    ])
    
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
    model.compile(optimizer=optimizer, loss='mse')
    
    callbacks = [EarlyStopping(monitor="val_loss", patience=20, min_delta=0, verbose=2, mode="min"),
                 ModelCheckpoint(filepath="best_model.h5", monitor="val_loss", save_best_only=True)]
    
    history=model.fit(features_train,target_train,
                      epochs=15000,
                      verbose=1,
                      callbacks=callbacks,
                      validation_data=(features_test,target_test),
                      batch_size=32)
    
    
    

    在这个改进的代码中,我们使用了ReLU作为激活函数,增加了一个输入层和一个更高级的优化器Adam,并在训练时使用了更小的批次大小。如果模型仍然无法满足预期的表现,则可以考

    评论
  • 蓝白、波罗歌 2023-03-06 18:16
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    以下是一些可能的改良方法:

    1. 添加更多的特征和神经元:考虑添加更多的传感器数据作为输入特征,比如温度、湿度、船舶载重等等。同时增加神经元的数量可能能够提高模型的表现。

    2. 使用更复杂的神经网络结构:考虑添加卷积层、循环神经网络层或者注意力机制等更高级的层次,以模型性能提高为目标。

    3. 使用不同的优化算法:除了Adam外,可以尝试SGD、RMSprop等不同的优化算法,以提高训练效率和模型精度。

    4. 使用更大的数据集:增加更多的数据量可以提高模型的泛化性、准确性和鲁棒性。

    5. 对特征进行预处理:应用标准化、归一化或者离散化等技术可以提高模型的性能,并且相对简单易行。

    6. 对输出进行后处理:应用后处理技术,例如PCA、SVD等降维,可以减少噪声并提高模型效果。

    下面是代码示例:

    import pandas as pd
    from matplotlib import pyplot as plt
    from sklearn.model_selection import train_test_split
    import tensorflow as tf
    from keras.callbacks import EarlyStopping, ModelCheckpoint
    
    # 加载数据
    ENV = pd.read_csv(r"C:\Users\14013\Desktop\数据预处理\大表\datas15one.csv")
    features = ENV.iloc[:,[6,7,8,9,11,13,14,15]]
    target= ENV.iloc[:,[0]]
    
    # 划分训练集和测试集
    features_train,features_test, target_train, target_test =train_test_split(features,target,test_size=0.2)
    
    # 构建模型
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(16,input_shape=(8,)), # 添加更多神经元
        tf.keras.layers.Dense(32,activation='relu'), # 添加激活函数
        tf.keras.layers.Dense(64,activation='relu'), # 添加更多神经元和激活函数
        tf.keras.layers.Dropout(0.2), # 添加 Dropout 层来减少过拟合
        tf.keras.layers.Dense(1)
    ])
    
    # 使用不同优化器、损失函数和评价指标
    model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=0.001,amsgrad=True),
                  loss = tf.keras.losses.MeanSquaredError(),
                  metrics = [tf.keras.metrics.MeanSquaredError(),tf.keras.metrics.MeanAbsoluteError()])
    
    # 添加学习率调整器
    scheduler = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss',patience=3,verbose=1,factor=0.5)
    callbacks = [EarlyStopping(monitor="val_loss",patience=20,min_delta=0,verbose=2,mode="min"),
                 ModelCheckpoint(filepath="best_model.h5",monitor="val_loss",save_best_only=True),
                 scheduler]
    
    # 训练模型
    history=model.fit(features_train,target_train,
                        epochs=5000, # 压缩训练轮次
                        verbose=1,
                        callbacks = callbacks,
                        validation_data=(features_test,target_test))
    

    评估模型

    model.evaluate(features_test,target_test,verbose=2)
    

    如果我的回答解决了您的问题,请采纳!

    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 已采纳回答 3月6日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 k210显示failed init to model
  • ¥15 Evil-droid生成的APK手机已经下载但无法建立任务
  • ¥25 c语言韩信点兵的变式
  • ¥15 怎么根据书上的例子完成这个问题呢?
  • ¥15 ECharts 增加Zoom,整行包括右边的Text一起滑动
  • ¥15 关于网上一个easyx制作的见缝插针小游戏(c++)
  • ¥15 开地址法双散列函数处理碰撞
  • ¥15 想问一下这个是什么情况 虚拟机Linux打不开了
  • ¥15 联通光猫掉注册了怎么重新注册上去
  • ¥15 关于unity开发steamvr程序遇到的问题