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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

Q&A

解決済

1回答

5439閲覧

kerasのCNNのエラー「ValueError: None values not supported.」を解決したい。

yolloy

総合スコア5

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

0グッド

0クリップ

投稿2019/12/09 12:44

編集2019/12/09 12:57

質問内容

https://teratail.com/questions/227845?modal=q-comp の続きです。

Kerasを用いてCNNを実装しようとしています。
RGBAのような4チャンネルの画像データを読み込ませて学習させることを検討しています。最終的にResNetのネットワーク構造で利用したいので、kerasのfunctional APIで実装しています。

入力データ:(バッチサイズ,画像の幅,画像の高さ,チャンネル数)の4次元
出力データ:(バッチサイズ,画像の幅*画像の高さ)の2次元

指摘していただいたコードを微調整し、「expected dense_10 to have 4 dimensions, but got array with shape (7, 8, 8)」のエラーは消えました。しかし、新たに以下のようなエラーが出るようになりました。
###エラー表示

python

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-46-d0e4061eaadd> in <module>() 4 34 epochs=20, 5 35 validation_data=(x_test, y_test), 6---> 36 verbose=0, 7 37 ) 8 38 ''' 9 10~\AppData\Roaming\Python\Python37\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 11 1211 else: 12 1212 fit_inputs = x + y + sample_weights 13-> 1213 self._make_train_function() 14 1214 fit_function = self.train_function 15 1215 16 17~\AppData\Roaming\Python\Python37\site-packages\keras\engine\training.py in _make_train_function(self) 18 314 training_updates = self.optimizer.get_updates( 19 315 params=self._collected_trainable_weights, 20--> 316 loss=self.total_loss) 21 317 updates = self.updates + training_updates 22 318 23 24~\AppData\Roaming\Python\Python37\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs) 25 89 warnings.warn('Update your `' + object_name + '` call to the ' + 26 90 'Keras 2 API: ' + signature, stacklevel=2) 27---> 91 return func(*args, **kwargs) 28 92 wrapper._original_function = func 29 93 return wrapper 30 31~\AppData\Roaming\Python\Python37\site-packages\keras\backend\tensorflow_backend.py in symbolic_fn_wrapper(*args, **kwargs) 32 73 if _SYMBOLIC_SCOPE.value: 33 74 with get_graph().as_default(): 34---> 75 return func(*args, **kwargs) 35 76 else: 36 77 return func(*args, **kwargs) 37 38~\AppData\Roaming\Python\Python37\site-packages\keras\optimizers.py in get_updates(self, loss, params) 39 541 self.updates.append(K.update(vhat, vhat_t)) 40 542 else: 41--> 543 p_t = p - lr_t * m_t / (K.sqrt(v_t) + self.epsilon) 42 544 43 545 self.updates.append(K.update(m, m_t)) 44 45~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\ops\math_ops.py in binary_op_wrapper(x, y) 46 901 try: 47 902 y = ops.convert_to_tensor_v2( 48--> 903 y, dtype_hint=x.dtype.base_dtype, name="y") 49 904 except TypeError: 50 905 # If the RHS is not a tensor, it might be a tensor aware object 51 52~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\ops.py in convert_to_tensor_v2(value, dtype, dtype_hint, name) 53 1240 name=name, 54 1241 preferred_dtype=dtype_hint, 55-> 1242 as_ref=False) 56 1243 57 1244 58 59~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\ops.py in internal_convert_to_tensor(value, dtype, name, as_ref, preferred_dtype, ctx, accept_composite_tensors) 60 1294 61 1295 if ret is None: 62-> 1296 ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 63 1297 64 1298 if ret is NotImplemented: 65 66~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\constant_op.py in _constant_tensor_conversion_function(v, dtype, name, as_ref) 67 284 as_ref=False): 68 285 _ = as_ref 69--> 286 return constant(v, dtype=dtype, name=name) 70 287 71 288 72 73~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\constant_op.py in constant(value, dtype, shape, name) 74 225 """ 75 226 return _constant_impl(value, dtype, shape, name, verify_shape=False, 76--> 227 allow_broadcast=True) 77 228 78 229 79 80~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\constant_op.py in _constant_impl(value, dtype, shape, name, verify_shape, allow_broadcast) 81 263 tensor_util.make_tensor_proto( 82 264 value, dtype=dtype, shape=shape, verify_shape=verify_shape, 83--> 265 allow_broadcast=allow_broadcast)) 84 266 dtype_value = attr_value_pb2.AttrValue(type=tensor_value.tensor.dtype) 85 267 const_tensor = g.create_op( 86 87~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\tensor_util.py in make_tensor_proto(values, dtype, shape, verify_shape, allow_broadcast) 88 435 else: 89 436 if values is None: 90--> 437 raise ValueError("None values not supported.") 91 438 # if dtype is provided, forces numpy array to be the type 92 439 # provided if possible. 93 94ValueError: None values not supported.

修正したコード

python

1import numpy as np 2from sklearn.model_selection import train_test_split 3data_n = 10 4img_rows = 8 5img_cols = 8 6img_channels = 4 7#img_channels_out = 64 # 今、ネットワークを途中で切っているので出力のチャネルが4でないのに注意 8img_channels_out = 1 9 10# 形状を指定してランダムなデータを生成 11x_train = np.random.randint(0,2,(data_n, img_rows, img_cols, img_channels)) 12#y_train = np.random.randint(0,2,(data_n, img_rows, img_cols, img_channels_out)) 13y_train = np.random.randint(0,2,(data_n, img_rows*img_cols)) 14x_train = x_train.astype("float32") 15y_train = y_train.astype("float32") 16print(y_train) 17# ここから下は同じ 18x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.30) 19model = ResNet(img_rows, img_cols, img_channels, x_train) 20model.summary() #ネットワーク構造の表示 21history = model.fit( 22 x_train, 23 y_train, 24 batch_size=2, 25 epochs=20, 26 validation_data=(x_test, y_test), 27 verbose=0, 28)

変更した点

・学習データのラベルは、(バッチサイズ, 画像行数画像列数)です。ここを質問の際に説明し忘れていました。失礼いたしました。y_trainの形状を上記形状になるように書き換えました。画像行数画像列数では、one-hotと呼ばれる「1つの要素だけ'1'で、他は'0'」という行列にしています。画像の中で、この'1'がある位置が正解の位置というような使い方になります。

新たに試したこと

・修正したy_trainの形状が間違っている可能性を考え、CNNの形状でグレースケールのような1チャンネルの画像を読み込むときによく忘れられるチャンネル数の次元を追加してみました。以下のように変更しました。

python

1y_train = np.random.randint(0,2,(data_n, img_rows*img_cols, img_channels_out))

すると、以下のような次元が違うというエラーが再び出るようになってしまいます。

python

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-47-a5759540bb7c> in <module>() 4 34 epochs=20, 5 35 validation_data=(x_test, y_test), 6---> 36 verbose=0, 7 37 ) 8 38 ''' 9 10~\AppData\Roaming\Python\Python37\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 11 1152 sample_weight=sample_weight, 12 1153 class_weight=class_weight, 13-> 1154 batch_size=batch_size) 14 1155 15 1156 # Prepare validation data. 16 17~\AppData\Roaming\Python\Python37\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 18 619 feed_output_shapes, 19 620 check_batch_axis=False, # Don't enforce the batch size. 20--> 621 exception_prefix='target') 21 622 22 623 # Generate sample-wise weight values given the `sample_weight` and 23 24~\AppData\Roaming\Python\Python37\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 25 133 ': expected ' + names[i] + ' to have ' + 26 134 str(len(shape)) + ' dimensions, but got array ' 27--> 135 'with shape ' + str(data_shape)) 28 136 if not check_batch_axis: 29 137 data_shape = data_shape[1:] 30 31ValueError: Error when checking target: expected dense_33 to have 2 dimensions, but got array with shape (7, 64, 1)

というのが現状です。これを新たに解決したいです。ValueError: None values not supported.について調べたところ、データ形状が異なることが原因のようですが、形状を上記のようにいじくりまわしても解決しませんでした。

よろしくお願いいたします。

追記:ネットワーク部分のコードは文字数制限で記載できませんでした。前回の質問に記載してあります。URL:https://teratail.com/questions/227845?modal=q-comp

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました!
原因はデータ形状ではなく、最適化アルゴリズムのAdamにありました。Adamの引数のepsilonがNoneだったのがよくないみたいです。kerasのドキュメント(https://keras.io/ja/optimizers/)を参考にしたのですが、

python

1keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

となっています。これを

python

1keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07, decay=0.0, amsgrad=False)

というように、epsilonに値を指定してやると大丈夫なようです。同様のエラーが出る方は、sgdなどの別の最適化アルゴリズムを試してみるといいかもしれません!
お騒がせしました。

投稿2019/12/09 13:36

yolloy

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問