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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

950閲覧

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

python_2019

総合スコア68

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/11/20 08:07

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

(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].

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

投稿2019/11/20 08:25

surphy

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python_2019

2019/11/20 08:35

ご連絡ありがとうございます。 ご指摘のとおり、(4,196)として実行したのですが、同じエラーが発生しました。。 ちなみに、このkernel_sizeは、入力形状(1,784)から、どのように算出すればよいのでしょうか? もし、ご存じでしたら、ご指導願います。
surphy

2019/11/20 09:06 編集

私も深層学習初心者です。 こちらも勉強しながら回答させていただきます。 まったく同じエラーですか? できれば、載せていただけるた助かります。 kernel_sizeを(8,98)に変更しても同じでしょうか?←ここは間違え input shapeを変更しないとだめ。kernel sizeは(3,3)のままで。(追記)
python_2019

2019/11/20 08:58

ご連絡ありがとうございます。 (8,98)に変更しても同じでした...。 ValueError: Negative dimension size caused by subtracting 8 from 1 for 'conv2d_52/convolution' (op: 'Conv2D') with input shapes: [?,1,784,1], [8,98,1,32].
surphy

2019/11/20 08:59

隣り合うピクセル同士の関連を捉えるために畳み込みという手法が存在しています。 どの程度、隣のピクセルまで相関をとるかということから、kernel sizeを決めるべきだと思います。
surphy

2019/11/20 09:11 編集

あ、伝え間違えました。 kernel_sizeは(3,3)のままで、入力形状を(4,196)に変えてください。
python_2019

2019/11/20 09:11

ご連絡ありがとうございます。 入力形状を(4,196)に変えると、エラーがなくなりました。 実は、今、敢えて、隣同士のピクセルを考慮しない1次元形状の入力形状(1,784)でCNNができないか検討しております。 もし、この辺でご経験があれば、お願いいたします。
surphy

2019/11/20 09:23

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

2019/11/20 09:33

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

2019/11/21 03:17

なるほど。 理解できました。 ご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問