Как передать ввод заполнителям? - PullRequest
0 голосов
/ 24 ноября 2018
import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd
import pylab as pl
import numpy as np
import tensorflow as tf
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (20, 6)

df1 = pd.read_csv("TrainData.csv")
df2 = pd.read_csv("TestData.csv")


train_data_X = np.asanyarray(df1['ENGINE SIZE'])
train_data_Y = np.asanyarray(df1['CO2 EMISSIONS'])
test_data_X = np.asanyarray(df2['ENGINE SIZE'])
test_data_Y = np.asanyarray(df2['CO2 EMISSIONS'])

W = tf.Variable(20.0, name= 'Weight')
b = tf.Variable(30.0, name= 'Bias')
X = tf.placeholder(tf.float32, name= 'Input')
Y = tf.placeholder(tf.float32, name= 'Output')

Y = W*X + b

loss = tf.reduce_mean(tf.square(Y - train_data_Y))
optimizer = tf.train.GradientDescentOptimizer(0.05)
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

loss_values = []
train_data = []
for step in range(100):
    _, loss_val, a_val, b_val = sess.run([train, loss, W, b], feed_dict={X:train_data_X, Y:train_data_Y})
    loss_values.append(loss_val)
    if step % 5 == 0:
      print(step, loss_val, a_val, b_val)
      train_data.append([a_val, b_val])

plt.plot(loss_values, 'ro')
plt.show()

Я пытаюсь создать модель линейной регрессии для обнаружения выбросов CO2, указав в качестве входных данных размер двигателя.Я использую приведенный выше код в тензор потока1) Когда я использую этот код, вес и смещение остаются неизменными.В чем проблема в коде?2) Также, если я хочу, чтобы размер двигателя и пробег оба как входные данные.какие изменения кода должны быть сделаны

Заранее спасибо

1 Ответ

0 голосов
/ 24 ноября 2018

В коде было несколько ошибок, упомянутых ниже:

  • Вы использовали заполнитель Y = W*X + b, который в последующем разделе кода использовался для подачи данных (feed_dict={X:train_data_X, Y:train_data_Y}).Вы должны были использовать другую переменную для прогнозирования (а не заполнитель, который вы использовали для подачи данных), и тогда вы должны были бы рассчитать функцию потерь.Однако необходимые изменения были внесены.Проверьте prediction= W*X + b в приведенном ниже коде
  • Вы сразу передавали полные данные в feed_dict (feed_dict={X:train_data_X, Y:train_data_Y}).Однако вам нужно передавать одно значение данных за один раз (feed_dict={X:x, Y:y})

Ниже код с необходимой коррекцией должен работать нормально.

import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd
import pylab as pl
import numpy as np
import tensorflow as tf
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (20, 6)

df1 = pd.read_csv("TrainData.csv")
df2 = pd.read_csv("TestData.csv")


train_data_X = np.asanyarray(df1['ENGINE SIZE'])
train_data_Y = np.asanyarray(df1['CO2 EMISSIONS'])
test_data_X = np.asanyarray(df2['ENGINE SIZE'])
test_data_Y = np.asanyarray(df2['CO2 EMISSIONS'])

W = tf.Variable(20.0, name= 'Weight')
b = tf.Variable(30.0, name= 'Bias')
X = tf.placeholder(tf.float32, name= 'Input')
Y = tf.placeholder(tf.float32, name= 'Output')
prediction= W*X + b


loss = tf.reduce_mean(tf.square(prediction - Y))
optimizer = tf.train.GradientDescentOptimizer(0.05)
train = optimizer.minimize(loss)
loss_values = []
train_data = []
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for step in range(100):
        for (x,y) in zip(train_data_X,train_data_Y):
            _, loss_val, a_val, b_val = sess.run([train, loss, W, b], feed_dict={X:x, Y:y})
            loss_values.append(loss_val)
        if step % 5 == 0:
            print(step, loss_val, a_val, b_val)
            train_data.append([a_val, b_val])

plt.plot(loss_values, 'ro')
plt.show()

Примечание : из-за неправильного выбора функции потерь ваша потеря продолжает увеличиваться с каждым шагом.

Я упомянулФункция потери ниже, которая может работать для ваших данных.Я не уверен, как выглядят ваши данные, но вы можете попробовать, если хотите, и сообщить мне, если это сработало.

n_samples = train_data_X.shape[0]
loss = tf.reduce_sum(tf.pow(prediction - Y, 2)) / (2 * n_samples)

Ответ на ваш второй запрос.

Предполагая, что ваши данные имеют имя столбца как MILEAGE , Вы можете выполнить следующие изменения в train_data_X и test_data_X.Остальная часть кода останется такой же, как указано выше.

train_data_X = np.asanyarray(df1[['ENGINE SIZE','MILEAGE']])
train_data_Y = np.asanyarray(df1['CO2 EMISSIONS'])
test_data_X = np.asanyarray(df2[['ENGINE SIZE','MILEAGE']])
test_data_Y = np.asanyarray(df2['CO2 EMISSIONS'])
...