Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python keras zca_美白-无错误,无输出_Python_Python 2.7_Image Processing_Keras - Fatal编程技术网

Python keras zca_美白-无错误,无输出

Python keras zca_美白-无错误,无输出,python,python-2.7,image-processing,keras,Python,Python 2.7,Image Processing,Keras,当使用zca_美白时,我的代码被卡在某个地方,既没有显示任何错误,也没有显示输出。当我跳过zca_白化并应用其他转换时,代码运行得非常完美。我在这里附上代码片段。如果我在这里做错了什么,请帮助我: datagen = ImageDataGenerator(zca_whitening=True) datagen.fit(x_train) 其中>>x_train是一组训练图像(dim=50 x 64 x 64 x 3)。运行datagen.fit后,代码不会显示进一步的输出或错误,进程似乎会无限期

当使用
zca_美白时
,我的代码被卡在某个地方,既没有显示任何错误,也没有显示输出。当我跳过
zca_白化
并应用其他转换时,代码运行得非常完美。我在这里附上代码片段。如果我在这里做错了什么,请帮助我:

datagen = ImageDataGenerator(zca_whitening=True)
datagen.fit(x_train)
其中>>
x_train
是一组训练图像(dim=50 x 64 x 64 x 3)。运行
datagen.fit
后,代码不会显示进一步的输出或错误,进程似乎会无限期地运行

另一方面,这些转换非常有效:

datagen = ImageDataGenerator(rotation_range=0.90,
    width_shift_range=0.2,
    height_shift_range=0.2,
    fill_mode='nearest',
    horizontal_flip=True,
    vertical_flip=True)
datagen.fit(x_train)

这里有我遗漏的东西吗?

修改
x\u train
使其具有形状
(3,64,64)。

您可以使用以下代码来实现这一点:
x\u train=x\u train.transpose((2,1,0))


这主要是由于theano和tensorflow后端之间的切换。检查Keras文档中的
dim\u order

我不同意@Avjiit的观点,即问题是由于错误的形状造成的。这个问题很常见,正如keras的主要贡献者一样,问题是zca计算需要非常长的时间,因为它
numpy.linalg.svd()
,即使在矩阵(n*m*3),n~m~100上,计算量也很大

有一些方法可以计算svd的快速近似值,如随机化svd by、截断svd by、Lanczos方法svd,但它们在数值上并不总是稳定的

我想我找到了另一种非常简单的方法,它非常快速,并且给出了与标准方法完全相同的结果!如果您有一个形状为(m x n)的数据矩阵,其中m比n小得多-例如,您的图像(m~1000)比像素数(n~100 x 100 x 3=30000像素)少得多,则这会有所帮助。在这种情况下,keras将使用
sigma.shape=(300003000)
计算
linalg.svd(sigma)
,这在计算上太费劲了,需要花费很长时间。但是在一个很好的近似中,你可以在(m x m)矩阵上计算奇异值分解,而不是在(n x n)矩阵上计算奇异值分解,只需旋转输入数据x或翻转
sigma
计算的顺序,使其看起来像
sigma=np.dot(flat_x,flat_x.T)/flat_x.shape[0]
。采用这种方法,如果m~1000和n~30000,计算只需约10秒。好的是,
linalg.svd(sigma)
的特征向量在两种情况下都是相同的,直到一个因子,见幻灯片30。您可以在您的数据集上或使用keras中的
在内置cifer集上进行测试。数据集导入cifar10

可以找到数学上的理由并加以说明。为了视觉效果,我分享以下图片:

下面是用于创建zca计算的修改keras代码。您可以使用它修改keras zca代码,位于。我所做的修改是在需要时加入if子句来转置数据矩阵:

from keras.datasets import cifar10
import numpy as np
from scipy import linalg

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
X = X_train[:1000]
flat_x = np.reshape(x, (x.shape[0], x.shape[1] * x.shape[2] * x.shape[3]))

# normalize x:
flat_x = flat_x / 255.
flat_x = flat_x - flat_x.mean(axis=0)

# CHANGES HAPPEN BELOW.
# if m>n execute the svd as usual
if flat_x.shape[0] => flat_x.shape[1]:
    sigma = np.dot(flat_x.T, flat_x) / flat_x.shape[0]
    u, s, _ = linalg.svd(sigma)
# and if m<n do the trnaspose trick
if flat_x.shape[0] < flat_x.shape[1]:
    sigma = np.dot(flat_x, flat_x.T) / flat_x.shape[0]
    u, s, _ = linalg.svd(sigma)
    u = np.dot(flat_x.T, u) / np.sqrt(s*flat_x.shape[0])

s_inv = 1. / np.sqrt(s[np.newaxis] + 0.1) # the 0.1 is the epsilon value for zca
principal_components = (u * s_inv).dot(u.T)
whitex = np.dot(flat_x, principal_components)
从keras.dataset导入cifar10
将numpy作为np导入
来自scipy进口公司
(X_列,y_列),(X_测试,y_测试)=cifar10.负载数据()
X=X_列车[:1000]
平面x=np.重塑(x,(x.形状[0],x.形状[1]*x.形状[2]*x.形状[3]))
#标准化x:
平展x=平展x/255。
平面x=平面x-平面x平均值(轴=0)
#变化发生在下面。
#如果m>n,则像往常一样执行svd
如果平面形状[0]=>平面形状[1]:
sigma=np.dot(平面x.T,平面x)/平面x.shape[0]
u、 s,u=线性奇异值(西格玛)

#如果你能修改x_序列的形状为(3,64,64),然后应用zca_美白?是的,成功了!谢谢@AvijitDasgupta。我想知道为什么只有在zca_美白的情况下它才不同。那么我写这个作为一个答案,你可能会接受它。我有同样的问题,但到2020年这不起作用。通过形状为
(3,64,64)
x_列车
,会导致keras发出警告,警告应为4个尺寸。制作形状
(1,3,64,64)
会导致警告,不应该有64个颜色通道。你能再提一个建议吗?试着提出(1,64,64,3)