【发布时间】: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