python-3.x - 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 的来源,但我没有运气改变参数以增加过滤器的深度。我可以在网上找到的任何文档或问题似乎与我的问题没有很好的联系。非常感谢任何建议,如果我可以提供任何其他信息,请告诉我!
解决方案
推荐阅读
- xml - XSL for SharePoint 列表无输出
- javascript - Javascript将数组值加在一起
- ruby-on-rails - Rails 5.2 使用 Axios 请求返回 406
- excel - 如何阅读 vba 中的 Collections 元素?
- amazon-web-services - 使用 CloudFormation 更新现有日志组
- python - 使用 2 列匹配多列的值
- markdown - 使用 pandoc 和 xelatex 将 markdown 文件编译为 pdf 时出现“未定义的控制序列。\file_get:nnN”错误
- c++ - 用 constexpr 对象的函数指针成员函数初始化 std::array
- android - 如何对 GridLayoutManager 中的项目进行固定高度?
- java - 检查 Java 库与 GraalVM 的兼容性