Tensorflow均方误差计算与sklearn

时间:2018-07-26 04:43:52

标签: python tensorflow

我正在尝试使用张量流计算mse并将结果与​​sklearn.metrics.mean_squared_error方法进行比较。

def mse(y,y_hat):
    return tf.reduce_mean(tf.squared_difference(y, y_hat)).eval()

compute_mse = lambda vector1, vector2: mse(vector1,vector2)

我的测试循环

for n in [1,5,10,10**3]:

    elems = [np.arange(n),np.arange(n,0,-1), np.zeros(n),
             np.ones(n),np.random.random(n),np.random.randint(100,size=n)]

    for el in elems:
        for el_2 in elems:
            true_mse = np.array(mean_squared_error(el,el_2))
            my_mse = compute_mse(el,el_2)
            if not np.allclose(true_mse,my_mse):
                print('Wrong result:')

print("All tests passed")    

但是我的tf函数总是返回0或1。 你能指出我错了吗?

UPD

感谢@apnorton指出类型问题。

def mse(y,y_hat):
    y_ = tf.Variable(y, tf.float64)
    y_hat_ = tf.Variable(y_hat, tf.float64)
    return tf.reduce_mean(tf.squared_difference(y_, y_hat_).eval()

1 个答案:

答案 0 :(得分:3)

如果打印tf函数的所有输出,您会看到它不只返回1和0,但它只返回整数。这是因为<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="48" android:pivotX="115%" android:pivotY="95%" android:toDegrees="48"> <shape android:shape="rectangle"> <stroke android:width="10dp" android:color="#c6802a" /> <solid android:color="#c6802a" /> </shape> </rotate> 的值都是类型elemsnumpy.int32函数在执行均值步骤时似乎将它们转换为浮点数,而Tensor Flow方法则不然。

要查看固定的变体,请考虑将sklearn行更改为:

compute_mse

编辑:针对评论中的问题,我避免仅出于强制转换的目的创建变量。相反,我建议使用tf.to_float方法:

my_mse = compute_mse(el.astype(float),el_2.astype(float))