質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

python:畳み込みニューラルネットワークでエラーが出ます。

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 81

python_2019

score 36

畳み込みニューラルネットワークで、エラーが発生します。

ValueError: Negative dimension size caused by subtracting 3 from 1 for 'conv2d_37/convolution' (op: 'Conv2D') with input shapes: [?,1,784,1], [3,3,1,32].)

conv2dのパラメータの設定が悪いのでしょうか?
どなたか、お詳しい方、ご指導頂ければ助かります。

x_train = x_train.reshape(x_train.shape[0], 28, 28,1)
x_test = x_test.reshape(x_test.shape[0], 28, 28,1)

input_shape=(28,28,1)))

これを、以下のように修正しただけなのですが、エラーとなります。(上記のコードでは正常に動作)

x_train = x_train.reshape(x_train.shape[0], 1, 784,1)
x_test = x_test.reshape(x_test.shape[0], 1, 784,1)

input_shape=(1, 784,1)))

以下は、エラーが発生した全コードです。

# データを高速かつ効率的に使えるPandasをインポート
import pandas as pd

# 数値計算を効率的に行うNumpyをインポート
import numpy as np

# グラフが簡単に描写できるMatplotlibをインポート
import matplotlib
import matplotlib.pyplot as plt

# 28x28x1のサイズへ変換
#x_train = x_train.reshape(x_train.shape[0], 28, 28,1)
x_train = x_train.reshape(x_train.shape[0], 1, 784,1)
#x_test = x_test.reshape(x_test.shape[0], 28, 28,1)
x_test = x_test.reshape(x_test.shape[0], 1, 784,1)

# モデルの宣言
model = Sequential()

# 先に作成したmodelへレイヤーを追加
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                input_shape=(1, 784,1)))
                 #input_shape=(28,28,1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))

# Learnig Processの設定
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])


以下、エラーメッセージです。

---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1863   try:
-> 1864     c_op = c_api.TF_FinishOperation(op_desc)
   1865   except errors.InvalidArgumentError as e:

InvalidArgumentError: Negative dimension size caused by subtracting 3 from 1 for 'conv2d_37/convolution' (op: 'Conv2D') with input shapes: [?,1,784,1], [3,3,1,32].

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-244-f0598274ae13> in <module>
     22 #model.add(Conv2D(32, kernel_size=(3, 3),
     23                  activation='relu',
---> 24                 input_shape=(1, 784,1)))
     25                  #input_shape=(28,28,1)))
     26 model.add(MaxPooling2D(pool_size=(2, 2)))

C:\python\anaconda\pgm\lib\site-packages\keras\engine\sequential.py in add(self, layer)
    163                     # and create the node connecting the current layer
    164                     # to the input layer we just created.
--> 165                     layer(x)
    166                     set_inputs = True
    167             else:

C:\python\anaconda\pgm\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)
    455             # Actually call the layer,
    456             # collecting output(s), mask(s), and shape(s).
--> 457             output = self.call(inputs, **kwargs)
    458             output_mask = self.compute_mask(inputs, previous_mask)
    459 

C:\python\anaconda\pgm\lib\site-packages\keras\layers\convolutional.py in call(self, inputs)
    169                 padding=self.padding,
    170                 data_format=self.data_format,
--> 171                 dilation_rate=self.dilation_rate)
    172         if self.rank == 3:
    173             outputs = K.conv3d(

C:\python\anaconda\pgm\lib\site-packages\keras\backend\tensorflow_backend.py in conv2d(x, kernel, strides, padding, data_format, dilation_rate)
   3648         strides=strides,
   3649         padding=padding,
-> 3650         data_format=tf_data_format)
   3651 
   3652     if data_format == 'channels_first' and tf_data_format == 'NHWC':

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\ops\nn_ops.py in convolution(input, filter, padding, strides, dilation_rate, name, data_format, filters, dilations)
    892       data_format=data_format,
    893       dilations=dilation_rate,
--> 894       name=name)
    895 
    896 

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\ops\nn_ops.py in convolution_internal(input, filters, strides, padding, data_format, dilations, name)
    969           data_format=data_format,
    970           dilations=dilations,
--> 971           name=name)
    972     else:
    973       if channel_index == 1:

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\ops\gen_nn_ops.py in conv2d(input, filter, strides, padding, use_cudnn_on_gpu, explicit_paddings, data_format, dilations, name)
   1159                   padding=padding, use_cudnn_on_gpu=use_cudnn_on_gpu,
   1160                   explicit_paddings=explicit_paddings,
-> 1161                   data_format=data_format, dilations=dilations, name=name)
   1162   _result = _op.outputs[:]
   1163   _inputs_flat = _op.inputs

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\framework\op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
    786         op = g.create_op(op_type_name, inputs, dtypes=None, name=scope,
    787                          input_types=input_types, attrs=attr_protos,
--> 788                          op_def=op_def)
    789       return output_structure, op_def.is_stateful, op
    790 

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\util\deprecation.py in new_func(*args, **kwargs)
    505                 'in a future version' if date is None else ('after %s' % date),
    506                 instructions)
--> 507       return func(*args, **kwargs)
    508 
    509     doc = _add_deprecated_arg_notice_to_docstring(

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\framework\ops.py in create_op(***failed resolving arguments***)
   3614           input_types=input_types,
   3615           original_op=self._default_original_op,
-> 3616           op_def=op_def)
   3617       self._create_op_helper(ret, compute_device=compute_device)
   3618     return ret

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\framework\ops.py in __init__(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def)
   2025           op_def, inputs, node_def.attr)
   2026       self._c_op = _create_c_op(self._graph, node_def, grouped_inputs,
-> 2027                                 control_input_ops)
   2028 
   2029     # Initialize self._outputs.

C:\python\anaconda\pgm\lib\site-packages\tensorflow\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1865   except errors.InvalidArgumentError as e:
   1866     # Convert to ValueError for backwards compatibility.
-> 1867     raise ValueError(str(e))
   1868 
   1869   return c_op

ValueError: Negative dimension size caused by subtracting 3 from 1 for 'conv2d_37/convolution' (op: 'Conv2D') with input shapes: [?,1,784,1], [3,3,1,32].
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

conv2Dのkernel_sizeは畳み込む領域のことのはずです。
それが今(3,3)になっているのに、入力の形状が(1,784)なので、エラーなのでは?

例えば(4,196)ならうまくいくのではないですかね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/20 18:23

    隣同士のピクセルを考慮しないならconv2Dをなくさないとだめだと思いますが。。。

    CNN自体が隣同士のピクセルの関係を取り込むものなので、やっていることが矛盾しているように思います。
    そこまで理解されての検討でしょうか。

    キャンセル

  • 2019/11/20 18:33

    なお、kernel_size(3,3)の場合、3x3の領域を1つの領域に畳み込みます。

    今回input shapeを(1, 784)とすると、3x3の領域を1つの領域に畳み込むことは不可能となります。
    そのためエラーがでているはずです。
    こう考えると少なくともinput shapeは3x3以上の必要があります。
    (4, 196)ならエラーがでないのは、上記条件を満たすからです。

    キャンセル

  • 2019/11/21 12:17

    なるほど。
    理解できました。

    ご指導ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる