简体   繁体   中英

The loss in training is always zero

I want to duplicate the house price prediction model in Andrew Ng's course, but after the training result is generated, the loss is always zero and the weight variables are zero too. Can anyone please assist with this?

import pandas as pd
import numpy as np

def normalize_feature(df):
    return df.apply(lambda column: (column - column.mean()) / column.std())


df = normalize_feature(pd.read_csv('data1.csv',
                                   names=['square', 'bedrooms', 'price']))

ones = pd.DataFrame({'ones': np.ones(len(df))})
df = pd.concat([ones, df], axis=1)
df.head()X_data = np.array(df[df.columns[0:3]])
y_data = np.array(df[df.columns[-1]]).reshape(len(df), 1)

print(X_data.shape, type(X_data))
print(y_data.shape, type(y_data))import tensorflow as tf

alpha = 0.1 
epoch = 500 

X = tf.placeholder(tf.float32, X_data.shape)
y = tf.placeholder(tf.float32, y_data.shape)

W = tf.get_variable("weights", (X_data.shape[1], 1), initializer=tf.constant_initializer())
y_pred = tf.matmul(X, W)


loss_op = 1 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True)
opt = tf.train.GradientDescentOptimizer(learning_rate=alpha)
train_op = opt.minimize(loss_op)with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    for e in range(1, epoch + 1):
        sess.run(train_op, feed_dict={X:X_data, y:y_data})
        if e % 10 == 0:
            loss, w = sess.run([loss_op, W], feed_dict={X: X_data, y: y_data})
            log_str = "Epoch %d \t Loss=%.4g \t Model: y = %.4gx1 + %.4gx2 + %.4g"
            print(log_str % (e, loss, w[1], w[2], w[0]))

The result is

Epoch 10     Loss=0      Model: y = 0x1 + 0x2 + 0
Epoch 20     Loss=0      Model: y = 0x1 + 0x2 + 0
Epoch 30     Loss=0      Model: y = 0x1 + 0x2 + 0
Epoch 40     Loss=0      Model: y = 0x1 + 0x2 + 0
Epoch 50     Loss=0      Model: y = 0x1 + 0x2 + 0
...
Epoch 500    Loss=0      Model: y = 0x1 + 0x2 + 0

The result for your loss_op variable is most likely automatically rounded. Try replacing the numerator with an explicit float, like this

loss_op = 1.0 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True)

This way you explicitly coerce the output to type float

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM