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通道对于所有批次,我没有使用预训练网络。就那一层。