【问题标题】:Layer "3dcnn" expects 1 input(s), but it received 16 > input tensors层 \"3dcnn\" 需要 1 个输入,但它接收到 16 个 > 输入张量
【发布时间】:2022-09-28 15:43:52
【问题描述】:

我有一个关于使用 keras 进行深度学习的问题。我编写了一个自定义数据生成器,因为我的内存不足,我需要加载 x x x x 样本进行训练,因为我使用的是大尺寸的漂亮图像。我尝试了这个论坛的几个解决方案,但由于它们是 3d 图像,它们不能在我的模型中使用。问题出现在引发错误的训练命令 (fit) 中:

ValueError: Layer \"3dcnn\" 需要 1 个输入,但它收到了 16 输入张量。收到的输入:[<tf.Tensor \'IteratorGetNext:0\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:1\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:2\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:3\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:4\' shape=(无, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:5\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:6\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:7\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:8\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:9\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:10\' shape=(无, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:11\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:12\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:13\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:14\' shape=(None, 208, 150, 10) dtype=float32>, <tf.Tensor \'IteratorGetNext:15\' shape=(None, 208, 150, 10) dtype=float32>]

代码如下:

def get_model(width=208, height=150, depth=50):
\"\"\"Build a 3D convolutional neural network model.\"\"\"

inputs = keras.Input((width, height, depth, 1))

x = layers.Conv3D(filters=64, kernel_size=3, activation=\"relu\")(inputs)
x = layers.MaxPool3D(pool_size=2)(x)
x = tf.keras.layers.BatchNormalization()(x)

x = layers.Conv3D(filters=64, kernel_size=3, activation=\"relu\")(x)
x = layers.MaxPool3D(pool_size=2)(x)
x = tf.keras.layers.BatchNormalization()(x)

x = layers.Conv3D(filters=128, kernel_size=3, activation=\"relu\")(x)
x = layers.MaxPool3D(pool_size=2)(x)
x = tf.keras.layers.BatchNormalization()(x)

x = layers.Conv3D(filters=256, kernel_size=3, activation=\"relu\")(x)
x = layers.MaxPool3D(pool_size=2)(x)
x = tf.keras.layers.BatchNormalization()(x)

x = layers.GlobalAveragePooling3D()(x)
x = tf.keras.layers.Dense(units=512, activation=\"relu\")(x)
x = layers.Dropout(0.3)(x)

outputs = tf.keras.layers.Dense(units=3, activation=\"softmax\")(x)

# Define the model.
model = keras.Model(inputs, outputs, name=\"3dcnn\")
return model



#Get ALL the training images to batch/split/iterate from batch size to batch size 
train_data_generator = CustomDataGenerator(
    batch_size = 16, 
    #dataset_directory = \"E:\\\\NIFTI_train_codegenerator\"
    dataset_directory = \"NIFTI_train_codegenerator\"
)
 
# get a batch of images
train_images,labels = next(iter(train_data_generator))

#validation_split=0.2,
epochs = 100
model.fit(
    train_images,
    labels,
    batch_size=16,
    epochs=epochs,
    shuffle=True,
    verbose=2,
    callbacks=[checkpoint_cb, early_stopping_cb],
)

先感谢您

  • 为什么不将train_data_generator 直接输入model.fit 方法?
  • 您正在传递一组 16 个张量。 fit() 方法在使用张量时只能接受单个张量,或者在使用多输入时只能接受张量列表。由于train_data_generator 的批量大小为 16,因此每次迭代将返回 16 个张量。要么使用单个张量,要么正如 AndrzejO 所说,只需将 train_data_generator 传递给 fit() 而不是 train_images, labels
  • 你好,谢谢你的回答,如果我用 train_data_generator 喂它,我会得到另一个错误。 ValueError: Layer \"3dcnn\" 需要 1 个输入,但它接收到 16 个输入张量。收到的输入:[<tf.Tensor \'IteratorGetNext:0\' shape=(None, None, None, None)
  • 数据集中是否有任何实际数据?

标签: tensorflow keras deep-learning


【解决方案1】:

谢谢你的回答。如果我直接用 train_data_generator 喂它,我会得到同样的错误,甚至更糟。

#For each file in the batch size
for id in batch_IDs:
  path = os.path.join(self.directory, id,"la_4ch.nii.gz")
  #read the file nifty
  image = process_scan(path)
  image = np.expand_dims(image, axis = 0)
  #append the image and label
  images.append(np.array(image))


 model.fit(
     train_data_generator,
     batch_size=16,
     epochs=epochs,
     shuffle=True,
     verbose=2,
     callbacks=[checkpoint_cb, early_stopping_cb], )

ValueError:层“3dcnn”需要 1 个输入,但它收到 16 个输入 张量。收到的输入:[<tf.Tensor 'IteratorGetNext:0' shape=(None, 无,无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:1' 形状=(无,无,无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:2' 形状=(无,无,无,无)dtype=float32>, <tf.Tensor 'IteratorGetNext:3' 形状=(无,无,无,无) dtype=float32>, <tf.Tensor 'IteratorGetNext:4' shape=(None, None, 无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:5' 形状=(无,无,无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:6' 形状=(无,无,无,无)dtype=float32>, <tf.Tensor 'IteratorGetNext:7' 形状=(无,无,无,无) dtype=float32>, <tf.Tensor 'IteratorGetNext:8' shape=(None, None, 无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:9' 形状=(无,无,无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:10' 形状=(无,无,无,无)dtype=float32>, <tf.Tensor 'IteratorGetNext:11' 形状=(无,无,无,无) dtype=float32>, <tf.Tensor 'IteratorGetNext:12' shape=(无, 无, 无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:13' 形状=(无,无,无,无)dtype=float32>,<tf.Tensor 'IteratorGetNext:14' 形状=(无,无,无,无)dtype=float32>, <tf.Tensor 'IteratorGetNext:15' 形状=(无,无,无,无) dtype=float32>

【讨论】:

  • 使用数据集时,不应在model.fit 中设置batch_size 参数
  • 谢谢,我用一堆图像替换了图像,它可以工作。感谢所有的帮助
  • 感谢与社区分享解决方案。请关闭问题。欢迎!
【解决方案2】:

解决方案是这样的:

#images must be returned as a single tensor otherwise error
#stack makes many inputs in a single one
return np.stack(images,axis=0),labels

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2020-07-15
    • 1970-01-01
    • 2021-09-02
    • 2021-07-14
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多