TensorFlow(完全に接続されたニューラルネットワーク)に基づく燃料消費量の予測

完全に接続されたネットワークを使用して、自動車のパフォーマンスインデックスMPGの回帰問題の予測を完了します。

1.データセット

自動MPGデータセットは、さまざまな自動車性能指標の実際のデータと、シリンダー数、重量、馬力などの他の要因を記録します。表に示すように、データセットの最初の5項目を確認します。各フィールドは表にリストされています。カテゴリを示す原点の数値フィールドを除いて、他のフィールドはすべて数値です。生産地域は、1は米国、2はヨーロッパ、3は日本を意味します。

import pandas as pd
# 获取数据
dataset_path = '框架学习/tensorflow2.0/auto-mpg.csv'
# 利用pandas读取数据集,字段有效能(公里数每加仑),气缸数,排量,马力,重量,加速度,型号年份,产地
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight','Acceleration', 'Model Year', 'Origin','car name'] 
raw_dataset = pd.read_csv(dataset_path, names=column_names,na_values = "?", comment='\t', skipinitialspace=True) 
dataset = raw_dataset.copy()
dataset.drop(index=0,inplace=True)
del dataset['car name']
# 查看部分数据
dataset.describe()

ここに画像の説明を挿入
元のデータのデータには、フィールドが空(値が欠落)のデータ項目が含まれている可能性があり、これらのレコード項目をクリアする必要があります。

# 统计空白数据
dataset.isna().sum() 
# 删除空白数据项
dataset = dataset.dropna() 
# 再次统计空白数据
dataset.isna().sum() 

Originフィールドはカテゴリデータであるため、移動して3つの新しいフィールドに変換しました。米国、ヨーロッパ、日本で、それぞれがこの原産地からのものかどうかを表します。

# 处理类别型数据,其中 origin 列代表了类别 1,2,3,分布代表产地:美国、欧洲、日本 
# 先弹出(删除并返回)origin 这一列
origin = dataset.pop('Origin')
# 根据 origin 列来写入新的 3 个列
dataset['USA'] = (origin == 1)*1.0 
dataset['Europe'] = (origin == 2)*1.0 
dataset['Japan'] = (origin == 3)*1.0
dataset.tail()

トレーニングセットとテストセットを8:2の比率で分割します。

 # 切分为训练集和测试集
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
# 移动 MPG 油耗效能这一列为真实标签 Y 
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
# 查看训练集的输入 X 的统计数据
train_stats = train_dataset.describe() 
#train_stats.pop('MPG')
train_stats = train_stats.transpose()
# 标准化数据
def norm(x):
  return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset) 
normed_test_data = norm(test_dataset)

print(normed_train_data.shape,train_labels.shape) 
print(normed_test_data.shape, test_labels.shape)

セグメント化されたトレーニングセットデータを使用して、データセットオブジェクトを作成します。

# 构建Dataset对象
train_db = tf.convert_to_tensor(train_dataset.value,train_labels.value)
# 随机打散,批量化 
train_db = train_db.shuffle(100).batch(32) 

2.グリッドを作成します

自動MPGデータセットの規模が小さいことを考慮すると、MPG値予測タスクを完了するために、3層の完全に接続された層ネットワークのみが作成されます。入力Xには9つの特徴があるため、第1層の入力ノードの数は9です。第1層と第2層の出力ノードの数は64、64に設計されています。予測値は1つしかないため、出力層の出力ノードは1に設計されています。MPG∈ \ inを検討してください∈R +であるため、最後の活性化関数を省略したり、ReLU活性化関数を追加したりできます。

ネットワークをカスタムネットワーククラスとして実装するには、初期化関数で各サブネットワークレイヤーを作成し、順方向計算関数呼び出しでカスタムネットワーククラスの計算ロジックを実装するだけです。カスタムネットワーククラスは、カスタムネットワーククラスを作成する標準的な方法でもあるkeras.Model基本クラスを継承し、keras.Model基本クラスによって提供されるtrainable_variablesなどのさまざまな便利な関数を便利に使用できるようにします。

class Network(keras.Model): 
  # 回归网络
  def __init__(self):
    super(Network, self).__init__()
    # 创建3个全连接层
    self.fc1 = layers.Dense(64, activation='relu') 
    self.fc2 = layers.Dense(64, activation='relu') 
    self.fc3 = layers.Dense(1)
  def call(self, inputs, training=None, mask=None): 
    # 依次通过 3 个全连接层
    x = self.fc1(inputs)
    x = self.fc2(x)
    x = self.fc3(x) 
    return x

3.トレーニングとテスト

メインネットワークモデルクラスの作成が完了したら、ネットワークオブジェクトをインスタンス化し、オプティマイザーを作成しましょう。

# 创建网络类实例
model = Network() 
# 通过 build 函数完成内部张量的创建,其中 4 为任意的 batch 数量,9 为输入特征长度 
model.build(input_shape=(4, 9))
# 打印网络信息
model.summary()
# 创建优化器,指定学习率
optimizer = tf.keras.optimizers.RMSprop(0.001) 

次に、ネットワークトレーニング部分を実装します。エポックとステップの2層ループトレーニングネットワークを通じて、合計200のエポックがトレーニングされます。

for epoch in range(200): # 200个Epoch
  for step, (x,y) in enumerate(train_db): # 遍历一次训练集
  # 梯度记录器
  	with tf.GradientTape() as tape:
	    out = model(x) # 通过网络获得输出
	    loss = tf.reduce_mean(losses.MSE(y, out)) # 计算 MSE 
	    mae_loss = tf.reduce_mean(losses.MAE(y, out)) # 计算 MAE
  	if step % 10 == 0: # 打印训练误差 
    	print(epoch, step, float(loss))
  	# 计算梯度,并更新
  	grads = tape.gradient(loss, model.trainable_variables)
  	optimizer.apply_gradients(zip(grads, model.trainable_variables))

おすすめ

転載: blog.csdn.net/weixin_44127327/article/details/109067312