Python 在keras训练中,当a的形状和重量不同时,必须指定轴
我试图训练一个网络,我使用两个生成器,一个用于训练,一个用于验证。这些都是简单的函数产生的样本无法确定 在验证的最后,我得到以下错误:Python 在keras训练中,当a的形状和重量不同时,必须指定轴,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我试图训练一个网络,我使用两个生成器,一个用于训练,一个用于验证。这些都是简单的函数产生的样本无法确定 在验证的最后,我得到以下错误: File "/home/ubuntu/tensorflow/lib/python3.5/site-packages/numpy/lib/function_base.py", line 1142, in average "Axis must be specified when shapes of a and weights " 我查看了代码,keras.eng
File "/home/ubuntu/tensorflow/lib/python3.5/site-packages/numpy/lib/function_base.py",
line 1142, in average "Axis must be specified when shapes of a and weights "
我查看了代码,keras.engine
中的函数training\u generator
包含以下行
averages.append(np.average([out[i] for out in outs_per_batch], weights=batch_sizes))
查看np.average
的定义,当权重和数组长度不相同时,该函数需要轴
。我调试了代码,通过将axis=0
或np。挤压到out[I]
上,它“工作”,只在收集验证的摘要统计信息后停止几行。我无法停止思考我的代码中的其他地方有错误
这是我的发电机
def batch_generator(batch_size, folder):
files = listdir(folder)
print("Folder " + folder + " with " + str(len(files)) + " files.")
np.random.shuffle(files)
while True:
np.random.shuffle(files)
for i in range(batch_size, len(files), batch_size):
batch = files[(i-batch_size):(i)]
batch = tensor_generator(folder, files=batch)
yield (batch, batch)
def tensor_generator(folder, files=None):
if files is None:
files = listdir(folder)
verbose = len(files)>100
if verbose:
pbar = tqdm(total=len(files), unit='img')
tensor = []
for f in files:
f = SimpleITK.ReadImage(join(folder, f))
f = SimpleITK.GetArrayFromImage(f)
f = (f + 1000)/4000
tensor.append(f)
if verbose: pbar.update(1)
if verbose: pbar.close()
return np.stack(tensor, axis=0)
这就是拟合函数
self.autoencoder.fit_generator(
generator=x_train,
steps_per_epoch=iters,
epochs=epochs,
callbacks=[log, rop],
validation_data=x_test,
validation_steps=10)
知道怎么回事吗?您需要在图像空间维度中指定None
,例如,RGB图像的shape=(None,None,3)
顺便说一句,使用预训练模型预测不同大小的测试图像并不总是可行的,例如,包含密集
层的预训练模型。但是,您应该始终可以首先将测试图像调整为用于训练的大小,然后在调整大小的版本图像上进行预测。我遇到了同样的问题。尽管我不知道这个问题的原因,但我已经解决了这个奇怪的问题
您只需将代码validation\u data=x\u test
更改为validation\u data=next(x\u test)
。这意味着您只需在验证数据生成器上添加next()
。是否有大小为0的批次?您的keras版本和tensorflow版本是什么?测试生成器是否真的返回10个批次?@DanielMöller否,生成器始终返回参数指定的批次大小。Keras 2.2和tf 1.9我们预计会这样,但对于范围内的i(3*iters),可能a:打印(下一个(x_序列)[0]。形状)
,对于范围内的i(3*10)]:打印(下一个(x_测试)[0]。形状)
可能会揭示一些奇怪的事情?@DanielMöller BATCHSIZE x D1 x通道对于所有批次,我没有使用预训练网络。就那一层。