首页 > 编程知识 正文

神经网络 回归问题,dnn神经网络模型

时间:2023-05-03 05:09:40 阅读:239617 作者:2948

2020_11_01

DNN Regression

参考资料:《Python深度学习》 Francois Choll

神经网络可以主要解决三大类问题:二分类、多分类、回归。

回归问题特点在于结果是连续值,因此调参过程也与分类问题相异。

在了解DNN回归问题后,我们可以以波士顿房价预测的经典问题作为案例与模板。

数据准备 Code Block # 从Keras.datasets数据集中导入 Boston_Housing Problemfrom keras.datasets import boston_housing# 导入数据(train_data, train_targets),(test_data, test_targets) = boston_housing.load_data()

波士顿房价预测案例数据集已经内置于Keras.datasets数据库中,作为公开练习数据使用。

详细内容参考:https://keras.io/zh/datasets/

IPython: In [1]: train_data.shapeOut[1]: (404, 13)In [2]: train_targets.shapeOut[2]: (404,)In [3]: test_data.shapeOut[3]: (102, 13)In [4]: test_targets.shapeOut[4]: (102,)In [5]: type(train_data)Out[5]: numpy.ndarray

了解到:

训练集与测试集都是小数据量,分别为404,102条。其中,输入特征变量个数为13个。训练集和测试集的数据格式都是np.array数组。 标准化 # 数据标准化mean = train_data.mean(axis = 0)train_data -= meanstd = train_data.std(axis = 0)train_data /= std# !用于测试数据标准化的均值和标准差都是在训练数据上计算得到的test_data -= meantest_data /= std

标准化是让模型更加普适性的操作,不会对于训练集产生依赖性。

搭建神经网络 # 构建神经网络def build_model(): model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape = (train_data.shape[1],))) model.add(layers.Dense(64, activation='relu')) # !网络的最后一层只有一个单元,没有激活,是一个线性层 # !这是标量回归(标量回归是预测单一连续值的回归)的典型设置 model.add(layers.Dense(1)) # !编译网络用的是mse损失函数,即均方误差(MSE, mean squared error) # !预测值与目标值之差的平方,这是回归问题常用的损失函数 # !平均绝对误差(MAE, mean absolute error) # !是预测值与目标值之差的绝对值 model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) return model K折训练 # K折验证k = 4num_value_sample = len(train_data) // knum_epochs = 100all_scores = []for i in range(k): print("Processing fold #", i) # !提取第i折的训练集与验证集 val_data = train_data[i * num_value_sample : (i + 1) * num_value_sample] val_targets = train_targets[i * num_value_sample : (i + 1) * num_value_sample] partial_train_data = np.concatenate( [train_data[:i * num_value_sample], train_data[(i + 1) * num_value_sample:]], axis = 0) partial_train_targets = np.concatenate( [train_targets[:i * num_value_sample], train_targets[(i + 1) * num_value_sample:]], axis = 0) # !使用训练集训练 model = build_model() model.fit(partial_train_data, partial_train_targets, epochs = num_epochs, batch_size = 1, verbose=0) # !使用验证集验证 val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) all_scores.append(val_mae)

All Code # -*- coding: utf-8 -*-"""Created on Sat Oct 31 19:07:30 2020@author: Gavin"""import numpy as npimport pandas as pd# 从Keras.datasets数据集中导入 Boston_Housing Problemfrom keras.datasets import boston_housing# 从Keras导入构建神经网络的库from keras import modelsfrom keras import layers# 导入数据# !数据类型均为 np.ndarray(train_data, train_targets),(test_data, test_targets) = boston_housing.load_data()# 数据标准化mean = train_data.mean(axis = 0)train_data -= meanstd = train_data.std(axis = 0)train_data /= std# !用于测试数据标准化的均值和标准差都是在训练数据上计算得到的test_data -= meantest_data /= std# 构建神经网络def build_model(): model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape = (train_data.shape[1],))) model.add(layers.Dense(64, activation='relu')) # !网络的最后一层只有一个单元,没有激活,是一个线性层 # !这是标量回归(标量回归是预测单一连续值的回归)的典型设置 model.add(layers.Dense(1)) # !编译网络用的是mse损失函数,即均方误差(MSE, mean squared error) # !预测值与目标值之差的平方,这是回归问题常用的损失函数 # !平均绝对误差(MAE, mean absolute error) # !是预测值与目标值之差的绝对值 model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) return model# K折验证k = 4num_value_sample = len(train_data) // knum_epochs = 500all_scores = []for i in range(k): print("Processing fold #", i) # !提取第i折的训练集与验证集 val_data = train_data[i * num_value_sample : (i + 1) * num_value_sample] val_targets = train_targets[i * num_value_sample : (i + 1) * num_value_sample] partial_train_data = np.concatenate( [train_data[:i * num_value_sample], train_data[(i + 1) * num_value_sample:]], axis = 0) partial_train_targets = np.concatenate( [train_targets[:i * num_value_sample], train_targets[(i + 1) * num_value_sample:]], axis = 0) # !使用训练集训练 model = build_model() model.fit(partial_train_data, partial_train_targets, epochs = num_epochs, batch_size = 1, verbose=0) # !使用验证集验证 val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) all_scores.append(val_mae) 总结

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。