这是在学习《tensorflow:实战谷歌深度学习框架》的第四章正则化的代码时,遇到的问题。
如图:
为了方便大家可以搜索到,再粘个文字版的错误:
rgba = _colors_full_map.cache[c, alpha]
TypeError: unhashable type: 'numpy.ndarray'
首先得搞清楚自己面对的是什么样的问题,自己也纠结了很长时间,上网搜索,说什么的都有。
其实,这就是一个参数类型的问题。
引起问题的原因scatter的c参数
一个比较好的scatter函数介绍
第一,c的参数不可以直接是数字,第二点,c不可以是多维数组。
# 正则化,解决过拟合问题
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
data = []
label = []
np.random.seed(0)
# 以原点为圆心,半径为1的圆把散点划分成红蓝两部分,并加入随机噪音。
for i in range(150):
x1 = np.random.uniform(-1, 1)
x2 = np.random.uniform(0, 2)
if x1 ** 2 + x2 ** 2 <= 1:
data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
label.append(0)
#第一处错误,不可以直接是数字
else:
data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
label.append(1)
data = np.hstack(data).reshape(-1, 2)
label = np.hstack(label).reshape(-1,1)
#第二处,不可以使用reshape将label处理为多维数组
plt.scatter(data[:, 0], data[:, 1], c=label,
cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white")
plt.show()
scatter的c可以接受三类型的变量
1.直接的颜色
import matplotlib.pyplot as plt
x_coords = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y_coords = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
plt.scatter(x_coords, y_coords,c='red')
plt.show()
2.颜色组(list格式)
import matplotlib.pyplot as plt
x_coords = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y_coords = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
z = ['red','blue','red','blue','red','blue','red']
plt.scatter(x_coords, y_coords,c=z)
plt.show()
3.颜色组(numpy中的ndarray)
import matplotlib.pyplot as plt
import numpy as np
x_coords = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y_coords = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
z = ['red','blue','red','blue','red','blue','red']
z=np.hstack(z)
plt.scatter(x_coords, y_coords,c=z)
plt.show()
因此,作如下修改即可:
# 正则化,解决过拟合问题
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
data = []
label = []
np.random.seed(0)
# 以原点为圆心,半径为1的圆把散点划分成红蓝两部分,并加入随机噪音。
for i in range(150):
x1 = np.random.uniform(-1, 1)
x2 = np.random.uniform(0, 2)
if x1 ** 2 + x2 ** 2 <= 1:
data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
label.append('red')
#第一
else:
data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
label.append('blue')
data = np.hstack(data).reshape(-1, 2)
#label = np.hstack(label).reshape(-1,1) #第二
plt.scatter(data[:, 0], data[:, 1], c=label,
cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white")
plt.show()
最后说明一下几个问题:
1.np.hstack是一个将列表、元组、ndarray(numpy数组)转化为ndarray的函数
2.ndarray.shape是一个将ndarray转化为指定形状的函数
例如:ndarray.shape(2,3),即转化为两行三列的数组;也可以缺省,比如ndarray.shape(-1,2),即转化为三列的数组,能转多少行就转多少行。
附上出问题的代码链接:代码
这个问题纠结了我两天……