@katsuki5080

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python CNN学習時のエラー改善方法を教えていただきたいです。

3次元のCNNを用いて、動画像データに与えられた2種類の数値を予測する回帰問題に取り組んでいます。
動画をフレームに切り分け(時間軸、高さ、幅、チャネル)の4次元の配列にしたものを動画分集めて一つにした5次元の配列をデータセットにしています。
各動画には2種類のラベルを与え、それぞれを配列に格納しています。

これらを訓練とテストに分けて学習させようとしているのですが、以下のエラーが出ます。

Traceback (most recent call last):
  File "main2.py", line 198, in <module>
    'output2': Y_test2})
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\keras\engine\training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1063, in fit
    steps_per_execution=self._steps_per_execution)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1117, in __init__
    model=model)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 265, in __init__
    x, y, sample_weights = _process_tensorlike((x, y, sample_weights))
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1021, in _process_tensorlike
    inputs = nest.map_structure(_convert_numpy_and_scipy, inputs)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\util\nest.py", line 635, in map_structure
    structure[0], [func(*x) for x in entries],
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\util\nest.py", line 635, in <listcomp>
    structure[0], [func(*x) for x in entries],
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1016, in _convert_numpy_and_scipy
    return ops.convert_to_tensor(x, dtype=dtype)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\framework\ops.py", line 1499, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\framework\tensor_conversion_registry.py", line 52, in _default_conversion_function
    return constant_op.constant(value, dtype, name=name)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\framework\constant_op.py", line 264, in constant
    allow_broadcast=True)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\framework\constant_op.py", line 275, in _constant_impl
    return _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\framework\constant_op.py", line 300, in _constant_eager_impl
    t = convert_to_eager_tensor(value, ctx, dtype)
  File "C:\Users\k773412\AppData\Local\Continuum\anaconda3\envs\STGCN\lib\site-packages\tensorflow\python\framework\constant_op.py", line 98, in convert_to_eager_tensor
    return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).

どう改善すればいいのでしょうか?調べてもわからないので、回答していただけると幸いです。

問題のコードは以下の物です。

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import keras
import cupy
import os
from PIL import Image
from sklearn.model_selection import train_test_split
from keras.utils import np_utils
from tensorflow.keras.models import Model, load_model
from keras.layers.core import Dense
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Input
from tensorflow.keras.layers import Dense, Flatten, Conv3D, MaxPooling3D, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.optimizers import Adam, RMSprop, SGD
#from keras.utils.np_utils import to_categorical
import copy
import glob
from tensorflow.keras.preprocessing.image import load_img,img_to_array
from tensorflow.keras import layers, models
from keras.utils import np_utils
from sklearn.metrics import mean_absolute_error

aInput = Input(shape = (160,120,120,3))

z = Conv3D(32, (20, 20, 20), padding='same', activation='relu')(aInput)
z = MaxPooling3D(pool_size=(10,10,10))(z)
z = Conv3D(64, (20, 20, 20), padding='same', activation='relu')(aInput)
z = MaxPooling3D(pool_size=(10,10,10))(z)
#z = Dropout(0.5)(z)
#z = Conv3D(64, (10, 10, 10), padding='same', activation='relu')(z)
#z = MaxPooling3D(pool_size=(2,2,2))(z)
#z = Dropout(0.5)(z)
z = Conv3D(128, (20, 20, 20), padding='same', activation='relu')(z)
z = MaxPooling3D(pool_size=(2,2,2))(z)
z = Conv3D(128, (20, 20, 20), padding='same', activation='relu')(z)
z = MaxPooling3D(pool_size=(2,2,2))(z)
z = Dropout(0.5)(z)
#z = Conv3D(128, (3, 3, 3), padding='same', activation='relu')(z)
#z = MaxPooling3D(pool_size=(2,2,2))(z)
z = Flatten()(z)
#z = Dropout(0.5)(z)
z = Dense(128, activation='relu')(z)

output1 = Dense(1, activation='sigmoid', name='output1')(z)
output2 = Dense(1, activation='sigmoid', name='output2')(z)

multiModel = Model(aInput, [output1, output2])

opt = tf.keras.optimizers.Adam(learning_rate = 0.01, decay = 1e-6)

multiModel.compile(loss = {'output1': 'mean_squared_error',
                           'output2': 'mean_squared_error'},
                   optimizer = opt,
                   metrics = ['mean_absolute_error'])

chkpt = os.path.join('./', 'MultiCifar10_.{epoch:02d}-{val_loss:.2f}-{val_output1_loss:.2f}-{val_output2_loss:.2f}-{val_output3_loss:.2f}-{val_output4_loss:.2f}.hdf5')
cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss', verbose=1, save_best_only=True, mode='auto')

X_train, X_test, Y_train1, Y_test1, Y_train2, Y_test2 = np.load('./dataset4.npy', allow_pickle = True)

print(X_train)
print(X_test)
print(Y_train1.shape)
print(Y_test1.shape)
print(Y_train2.shape)
print(Y_test2.shape)



model = multiModel.fit(X_train,
                  {'output1': Y_train1,
                   'output2': Y_train2},
                  epochs=50,
                  batch_size=32,
                  validation_data=(X_test,
                                   {'output1': Y_test1,
                                    'output2': Y_test2})
                  #callbacks = [es_cb, cp_cb])
                  )

CNNの構成は適当です。
動画データは480個あり、ラベルはどちらも数値です。
訓練データ(384,160,120,120,3)※
テストデータ(96,160,120,120,3)※
ラベル1(384,)と(96,)
ラベル2(384,)と(96,)
の配列のはずです。

ちなみにミスで生成した、画像配列の値がすべて0のデータセットでは学習まで進めることができ、配列のprintも※のように表示できましたが、なぜか今回はprint.shapeで見ると画像データの配列は(384,)と(96,)しか表示されませんが…それも何か関係あるのでしょうか?printで配列を見ると一応ちゃんと中身はあるっぽいです。

回答お願いします。

0 likes

1Answer

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).

こちらが今回のエラー内容ですね。
そして類似のエラーが https://github.com/keras-team/keras/issues/13940 となります。

Y_test2 を np.asarray~なんちゃらで変換してから利用する感じではないでしょうか?

もしくは以下はあまり関係ないかもしれませんが、

aInput = Input(shape = (160,120,120,3))

CNNで学習するときの画像のサイズをもう少し小さくしてみてはいかがでしょうか。

kerasでハマったら以下で類似の問題を検索してみるとよいですよ
https://github.com/keras-team/keras/issues

0Like

Comments

  1. @katsuki5080

    Questioner

    回答ありがとうございます!どちらも試してみたのですがだめでした…
  2. @katsuki5080

    Questioner

    再度別の投稿として質問させていただいたのですが、原因は動画データをうまく配列に出来てないことによりそうな気がします。動画数が少ないと配列のshapeはうまく表示されますが、多いと次元のはずが1次元になってしまいます。。。
    この投稿でも書いた通り配列がすべて0のような軽いデータならうまく格納できるみたいで、容量とかあるんでしょうか…?

Your answer might help someone💌