首页 > 解决方案 > Tensorflow:InvalidArgumentError 输入和过滤器必须具有相同的深度:8 vs 1

问题描述

我正在努力使 EEGNet 的使用适应 3D 数据应用程序。由于 DepthwiseConv3D 和 SeparableConv3D 尚未实现,我正在尝试使用 Conv3D 层来实现它们。我的模型代码如下:

AVERAGE_POOLING_SIZE1 = (1, 1, 4)

AVERAGE_POOLING_SIZE2 = (1, 1, 8)

def EEGNet3D(X, Y, T, F1, F2, D, N): 
    input1 = Input(shape = (X, Y, T, 1)) 
    block1 = Conv3D(F1, (1, 1, 64), padding='same', activation='linear', use_bias=False, name="Conv3D")(input1)
    
    block1 = BatchNormalization()(block1)
    # Implementation of DepthwiseConv3D Using Conv3D class --- Investigate use of other params
    block1 = Conv3D(D*F1, (X, Y, 1), groups=F1, padding='valid', activation='linear', use_bias=False, name="DepthwiseConv3D")(block1)
    block1 = BatchNormalization()(block1)
    block1 = Activation('elu')(block1)
    block1 = AveragePooling3D(AVERAGE_POOLING_SIZE1)(block1)
    block1 = Dropout(0.25)(block1)
    
    # Implementation of SeperableConv3D using Conv3D class
    block2 = Conv3D(F2, (1, 1, 16), groups=F2, padding='same', activation='linear', use_bias=False, name="DepthwiseConv3D-Separable")(block1)
    block2 = Conv3D(F2, (1, 1, 1), padding='valid', activation='linear', use_bias=False, name="PointwiseConv3D-Separable")(block2)
    block2 = BatchNormalization()(block2)
    block2 = Activation('elu')(block2)
    block2 = AveragePooling3D(AVERAGE_POOLING_SIZE2)(block2)
    block2 = Dropout(0.25)(block2)
    flatten = Flatten(name = 'flatten')(block2)
    dense = Dense(N, activation='softmax', name = 'dense')(flatten)
    return Model(inputs=input1, outputs=dense)

我正在使用以下脚本运行此代码:

def load_data(data_dir, num, file_type):
    x = np.load(data_dir + "A0" + str(num) + file_type + "D_cropped.npy").astype(np.float64)
    y = np.load(data_dir + "A0" + str(num) + file_type + "K_cropped.npy").astype(np.float64)
    return x, y

model = EEGNet3D(X, Y, T, F1, F2, D, N)

loss_functions = ('sparse_categorical_crossentropy', 'mean_absolute_error')

opt = Adam(0.001)

print("Model compiling")

model.compile(loss=loss_functions[0], optimizer=opt, metrics=['accuracy'])

print("Model compiled")

model.summary()

X_data, Y_data = load_data(DATA_DIR, 1, "T")

print("Input Shape:\n", X_data.shape)
print("Output Shape:\n", Y_data.shape)

model.fit(X_data, Y_data, epochs=10)

_, acc = model.evaluate(X_data, Y_data)

print("Accuracy: %.2f" % (acc*100))

我试图改变一些涉及的值,但是没有运气避免这个错误。我很想就如何解决这个问题提出任何建议。对于上下文,这是程序中的标准错误:

2021-04-13 19:42:42.767168: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2021-04-13 19:42:42.768495: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE4.1 SSE4.2 AVX AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-04-13 19:42:42.770411: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 16. Tune using inter_op_parallelism_threads for best performance.
2021-04-13 19:42:45.935353: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
2021-04-13 19:42:45.935972: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 1800000000 Hz
Traceback (most recent call last):
  File "run3d.py", line 54, in <module>
    model.fit(X_data, Y_data, epochs=10)
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1100, in fit
    tmp_logs = self.train_function(iterator)
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 828, in __call__
    result = self._call(*args, **kwds)
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 888, in _call
    return self._stateless_fn(*args, **kwds)
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2942, in __call__
    return graph_function._call_flat(
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1918, in _call_flat
    return self._build_call_outputs(self._inference_function.call(
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 555, in call
    outputs = execute.execute(
  File "/usr/local/usrapps/multibranch/username/env_tensorflow/lib/python3.8/site-packages/tensorflow/python/eager/execute.py", line 59, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError:  input and filter must have the same depth: 8 vs 1
     [[node model/DepthwiseConv3D/Conv3D (defined at run3d.py:54) ]] [Op:__inference_train_function_1464]

Function call stack:
train_function

以及模型结构等细节:

channels_last
X:   7   
Y:   6   
T:   240 
F1:  8
F2:  16  
D:   2   
D:   4   
Model compiling
Model compiled
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 7, 6, 240, 1)]    0    
_________________________________________________________________
Conv3D (Conv3D)              (None, 7, 6, 240, 8)      512    
_________________________________________________________________
batch_normalization (BatchNo (None, 7, 6, 240, 8)      32    
_________________________________________________________________
DepthwiseConv3D (Conv3D)     (None, 1, 1, 240, 16)     672    
_________________________________________________________________
batch_normalization_1 (Batch (None, 1, 1, 240, 16)     64    
_________________________________________________________________
activation (Activation)      (None, 1, 1, 240, 16)     0    
_________________________________________________________________
average_pooling3d (AveragePo (None, 1, 1, 60, 16)      0    
_________________________________________________________________
dropout (Dropout)            (None, 1, 1, 60, 16)      0    
_________________________________________________________________
DepthwiseConv3D-Separable (C (None, 1, 1, 60, 16)      256    
_________________________________________________________________
PointwiseConv3D-Separable (C (None, 1, 1, 60, 16)      256    
_________________________________________________________________
batch_normalization_2 (Batch (None, 1, 1, 60, 16)      64    
_________________________________________________________________
activation_1 (Activation)    (None, 1, 1, 60, 16)      0    
_________________________________________________________________
average_pooling3d_1 (Average (None, 1, 1, 7, 16)       0    
_________________________________________________________________
dropout_1 (Dropout)          (None, 1, 1, 7, 16)       0    
_________________________________________________________________
flatten (Flatten)            (None, 112)               0    
_________________________________________________________________
dense (Dense)                (None, 4)                 452    
=================================================================
Total params: 2,308
Trainable params: 2,228
Non-trainable params: 80
_________________________________________________________________
Input Shape:
 (21312, 7, 6, 240)
Output Shape:
 (21312,)

我们可以看到 DepthwiseConv3D 层之前的层的输出具有以下形状,(None, 7, 6, 240, 8),所以我相信这就是 8 的来源,但我没有运气改变参数以增加过滤器的深度。我可以在网上找到的任何文档或问题似乎与我的问题没有很好的联系。非常感谢任何建议,如果我可以提供任何其他信息,请告诉我!

标签: python-3.xtensorflowmachine-learningkeras

解决方案


推荐阅读