如何将输入传递给占位符?

时间:2018-11-24 17:33:51

标签: python tensorflow machine-learning linear-regression

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排放。我在tensorflow中使用上面的代码。 1)当我使用此代码时,权重和偏差保持不变。代码有什么问题? 2)另外,如果我想将引擎大小和里程数作为输入。应该进行哪些代码更改

预先感谢

1 个答案:

答案 0 :(得分:0)

下面提到的代码中几乎没有错误:

  • 您正在使用占位符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_Xtest_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'])