我是机器学习的新手,正在尝试解决一个问题。我得到了N
个向量作为输入,每个向量的长度为10
。我还得到了N
个标签,这些标签是0/1。我需要在这个数据上训练一个CNN,它应该按以下顺序包含:
- 卷积层
- 最大池化
- 全连接层
- 用于获得二进制输出的Softmax激活函数
我做了以下尝试:
def get_model(inputShape, filters = 32, kernel_size = 3, pool_size = 4, strides = 1): model = models.Sequential() model.add(layers.Conv1D(filters, kernel_size)) model.add(layers.MaxPooling1D(pool_size, strides)) model.add(layers.Dense(1)) model.add(layers.Activation(activation='softmax')) model.build(inputShape) print(model.summary()) return modelmodel = get_model((None, None, 10))
然后,为了测试我的模型是否构建正确,我做了以下操作(未进行训练):
x = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])x = x.reshape(1, x.shape[0], x.shape[1])print(model.predict(x))
我得到了以下输出/错误:
_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv1d_1 (Conv1D) (None, None, 32) 992 _________________________________________________________________max_pooling1d_1 (MaxPooling1 (None, None, 32) 0 _________________________________________________________________dense_1 (Dense) (None, None, 1) 33 _________________________________________________________________activation_1 (Activation) (None, None, 1) 0 =================================================================Total params: 1,025Trainable params: 1,025Non-trainable params: 0_________________________________________________________________None2020-06-30 19:44:01.763782: W tensorflow/core/framework/op_kernel.cc:1753] OP_REQUIRES failed at pooling_ops_common.cc:91 : Invalid argument: Computed output size would be negative: -3 [input_size: 0, effective_filter_size: 4, stride: 1]Traceback (most recent call last): File "model_predict.py", line 41, in <module> model.predict(x) File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 1458, in predict return training_arrays.predict_loop(self, f, ins, File "/usr/local/lib/python3.8/dist-packages/keras/engine/training_arrays.py", line 324, in predict_loop batch_outs = f(ins_batch) File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/backend.py", line 3792, in __call__ outputs = self._graph_fn(*converted_inputs) File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py", line 1605, in __call__ return self._call_impl(args, kwargs) File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py", line 1645, in _call_impl return self._call_flat(args, self.captured_inputs, cancellation_manager) File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py", line 1745, in _call_flat return self._build_call_outputs(self._inference_function.call( File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/function.py", line 593, in call outputs = execute.execute( File "/usr/local/lib/python3.8/dist-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: Computed output size would be negative: -3 [input_size: 0, effective_filter_size: 4, stride: 1] [[node max_pooling1d_1/MaxPool (defined at /usr/local/lib/python3.8/dist-packages/keras/backend/tensorflow_backend.py:3007) ]] [Op:__inference_keras_scratch_graph_136]Function call stack:keras_scratch_graph
请建议我如何修正这个问题。
回答:
问题出在x
的维度上。对于Conv1D(kernel_size=3)
和MaxPooling1D(pool_size=4)
来说,它太小了。
我给x
增加了一个维度,并减少了kernel_size
和pool_size
:
x = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=np.float32)x = x.reshape(1, x.shape[0], x.shape[1])model = Sequential()model.add(layers.Conv1D(filters=10, kernel_size=2)) model.add(layers.MaxPooling1D(pool_size=2, strides=1))model.add(layers.Dense(1))model.add(layers.Activation(activation='softmax'))model.build((None, None, 10))model.predict(x)
如果需要,我可以分享Google Colab文件的链接。