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

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

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

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

深層学習

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

受付中

[CNN-LSTM]動画分類における時系列データの読み込み方法がわからない

MyuW
MyuW

総合スコア0

Keras

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

深層学習

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0回答

0評価

0クリップ

602閲覧

投稿2020/12/18 09:38

編集2022/01/12 10:55

やりたいこと

自前で撮影したグレースケールの手指動作の映像データに対して、fine-tuningとLSTMによる動画分類を行いたいのですが、画像の読み込み方法がわからず困っています。

データセットのディレクトリ構造は以下のようになっています。
データセット
building,clothes等の35個のディレクトリには、1フレームごとに撮影された画像(100×100)が100枚ずつ入っており、これらを時系列データとして扱いたいです。

モデル構造については、以下のサイトを参考にさせていただきました。
リンク内容

実行環境
・Google Colab TPU
・TensorFlow2.0.0のKerasライブラリ

ソースコード(predict_camera.py)

Python

import os, sys from PIL import Image import glob import numpy as np from tensorflow.keras.utils import to_categorical from sklearn.model_selection import train_test_split import tensorflow as tf import tensorflow.keras.callbacks from tensorflow.keras.applications.vgg16 import VGG16 from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, Input, GlobalAveragePooling2D, LSTM, TimeDistributed from tensorflow.keras.optimizers import Nadam # tpu用 # 詳細 https://www.tensorflow.org/guide/distributed_training#tpustrategy tpu_grpc_url = "grpc://" + os.environ["COLAB_TPU_ADDR"] tpu_cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu_grpc_url) tf.config.experimental_connect_to_cluster(tpu_cluster_resolver) CATEGORIES = 35 frames = 100 channels = 1 rows = 100 columns = 100 folder = ["00", "01", "02"]#, "03", "04", "05", "06", "07", "08", "09", #"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", #"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", #"30", "31", "32", "33", "34", "35", "36", "37", "38", "39"] classes = ["building", "clothes", "cooking", "do", "eat", "go", "gohome", "here", "house", "how", "left", "money", "no", "now", "old", "place", "purpose", "rainy", "right", "signlanguage", "study", "sunny", "sushi", "time", "toilet", "tomorrow", "understand", "want", "weather", "what", "when", "which", "who", "why", "you"] X = [] Y = [] for i, number in enumerate(folder): DIR = "./image/" + number for index, name in enumerate(classes): dir = DIR + "/" + name files = sorted(glob.glob(dir + "/*.png")) F = [] Y.append(index) for i, file in enumerate(files): image = Image.open(file) #image = image.convert("RGB") data = np.asarray(image) F.append(data) F = np.array(F).astype(np.float32) F = F / 255.0 X.append(F) X = np.array(X) Y = np.array(Y) Y = to_categorical(Y, 35) x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.20) def build_model(): video = Input(shape=(frames, channels, rows, columns)) cnn_base = VGG16(input_shape=(channels, rows, columns), weights="imagenet", include_top=False) cnn_out = GlobalAveragePooling2D()(cnn_base.output) cnn = Model(input=cnn_base.input, output=cnn_out) cnn.trainable = False encoded_frames = TimeDistributed(cnn)(video) encoded_sequence = LSTM(256)(encoded_frames) hidden_layer = Dense(output_dim=1024, activation="relu")(encoded_sequence) outputs = Dense(output_dim=CATEGORIES, activation="softmax")(hidden_layer) model = Model([video], outputs) optimizer = Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004) model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["categorical_accuracy"]) return model model = build_model() model.summary() early_stopping = EarlyStopping(patience=2) model.fit(x_train,y_train, batch_size=32, epochs=100, verbose=1, validation_split=0.2, shuffle=True, callbacks=[early_stopping]) evaluation=model.evaluate(x_test, y_test, batch_size=batch, verbose=1) model.save('camera.hdf5')

そもそもとして正しく入力ができていないのかもしれません。。
また、メモリが不足してしまうことから、読み込みの時点で前処理を施す必要があると思います。。

問題点が非常に多い状態での質問になってしまい申し訳ないのですが、何かご指摘いただけると幸いです。

追記

jbpb0様にいただいたご指摘をもとに、現状以下のエラーメッセージが返されています。

Traceback (most recent call last): File "predict_camera.py", line 112, in <module> model = build_model() File "predict_camera.py", line 82, in build_model include_top=False) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/applications/__init__.py", line 49, in wrapper return base_fun(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/applications/vgg16.py", line 32, in VGG16 return vgg16.VGG16(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/keras_applications/vgg16.py", line 112, in VGG16 name='block1_conv1')(img_input) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer.py", line 817, in __call__ self._maybe_build(inputs) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer.py", line 2141, in _maybe_build self.build(input_shapes) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/layers/convolutional.py", line 165, in build dtype=self.dtype) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer.py", line 522, in add_weight aggregation=aggregation) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/tracking/base.py", line 744, in _add_variable_with_custom_getter **kwargs_for_getter) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer_utils.py", line 139, in make_variable shape=variable_shape if variable_shape else None) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/variables.py", line 258, in __call__ return cls._variable_v1_call(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/variables.py", line 219, in _variable_v1_call shape=shape) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/variables.py", line 197, in <lambda> previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/variable_scope.py", line 2507, in default_variable_creator shape=shape) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/variables.py", line 262, in __call__ return super(VariableMetaclass, cls).__call__(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py", line 1406, in __init__ distribute_strategy=distribute_strategy) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py", line 1537, in _init_from_args initial_value() if init_from_fn else initial_value, File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer_utils.py", line 119, in <lambda> init_val = lambda: initializer(shape, dtype=dtype) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/init_ops_v2.py", line 437, in __call__ return self._random_generator.random_uniform(shape, -limit, limit, dtype) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/init_ops_v2.py", line 800, in random_uniform shape=shape, minval=minval, maxval=maxval, dtype=dtype, seed=self.seed) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/random_ops.py", line 238, in random_uniform minval = ops.convert_to_tensor(minval, dtype=dtype, name="min") File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py", line 1184, in convert_to_tensor return convert_to_tensor_v2(value, dtype, preferred_dtype, name) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py", line 1242, in convert_to_tensor_v2 as_ref=False) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py", line 1296, in internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/tensor_conversion_registry.py", line 52, in _default_conversion_function return constant_op.constant(value, dtype, name=name) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/constant_op.py", line 227, in constant allow_broadcast=True) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/constant_op.py", line 235, in _constant_impl t = convert_to_eager_tensor(value, ctx, dtype) File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/constant_op.py", line 96, in convert_to_eager_tensor return ops.EagerTensor(value, ctx.device_name, dtype) RuntimeError: Additional GRPC error information: {"created":"@1608290676.637613791","description":"Error received from peer","file":"external/grpc/src/core/lib/surface/call.cc","file_line":1039,"grpc_message":"","grpc_status":12}

現状これについて自分の方でも調べを進めている段階です。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

jbpb0
jbpb0

2020/12/18 10:08

VGG16はカラー画像用だから入力が3チャンネル必要なのに、input_shapeでは1チャンネルしかない、というエラーでは??
MyuW
MyuW

2020/12/18 10:22

channelsを1から3に変更し、image = image.convert("RGB")のコメントアウトを外して実行したところ、上記のエラー文と同様に、 ValueError: The input must have 3 channels; got `input_shape=(3, 100, 100)` が返されてしまいます。
MyuW
MyuW

2020/12/18 10:54

weights=Noneとして実行したところ、 ValueError: Input size must be at least 32x32; got `input_shape=(1, 100, 100)` というエラー文が新たに返ってきました。 エラーについて調べてみたのですが、VGG16やVGG19において、特定のサイズ(今回の場合は32×32?)より入力された画像が小さい場合に返されるようなのですが、、
jbpb0
jbpb0

2020/12/18 11:12

たしか、tensorflowをバックエンドにする場合は、チャンネルを次元の最後にしないといけなくて、お書きのコードはチャンネルが最初なので、1でも3でもどちらも32よりも小さいのでひっかかる、のではないですかね
MyuW
MyuW

2020/12/18 11:50

勉強不足でした。ご指摘ありがとうございます! 自分としてはVGG16のImageNetで事前学習した重みを利用したいと考えているため、入力画像をRGBとしてチャネルを3に設定し、 video = Input(shape=(frames, rows, columns, channels)) cnn_base = VGG16(input_shape=(rows, columns, channels),weights="imagenet",include_top=False) と変更して実行しています。 この際新たに RuntimeError: Additional GRPC error information: {"created":"@1608290676.637613791","description":"Error received from peer","file":"external/grpc/src/core/lib/surface/call.cc","file_line":1039,"grpc_message":"","grpc_status":12} というエラーが返されました。これについて後ほど調べてみます。エラー文の全体については編集の方へ追記させていただきます。 またメモリ不足の件についてですが、現状のmodel.fitからmodel.fit_generatorに変更することを考えています。そこでfit_generatorで使用するgeneratorを自作する必要があると思われるため、また後ほどご質問させていただくかもしれないです。
jbpb0
jbpb0

2020/12/18 13:25 編集

動かそうと思ってコード触ってるのですが、build_model()の中のDense()にunitsが定義されてないとか、いろいろあってすんなりと動きません 私が使ってるのがtf 1.xなためかもしれませんが、tf 2.xのドキュメント読んでもDense()のunitsは必須のようで、よく分かりません 参考にされているWebサイトのコードは、ちゃんと動くものなんでしょうか? 【追記】Dense()のoutput_dim=をunits=に書き換えたら、model.summary()までは行きました (GPU無しPCで)
jbpb0
jbpb0

2020/12/18 13:23 編集

参考にされてるコードはtf 1.x時代のだと思うので、tf 2.xで動かす場合は、下記を追加した方がいいかもです tf.compat.v1.disable_v2_behavior() tf.compat.v1.disable_eager_execution()
jbpb0
jbpb0

2020/12/18 13:46

質問者さんの環境でコードを実行してから、 print(x_train.shape) print(y_train.shape) を実行すると、どのように表示されるのでしょうか? こちらでは、ニューラルネットの入力の次元と合わないため、model.fit() ができません
MyuW
MyuW

2020/12/18 17:35 編集

上記のコードを現状のものへ更新させていただきました。 以前のコードから以下の変更をしています。 ・忘れていたEarlyStoppingのimport ・TensorFlow2.xの挙動を1.xに変更する2行 ・Denseの引数であったoutput_dimをunitsに書き換え またディレクトリ00,01,02内の画像を読み込んだ場合、私の環境では、 print(x_train.shape) # (84, 100, 100, 100, 3) print(y_train.shape) # (84, 35) print(x_test.shape) # (21, 100, 100, 100, 3) print(y_test.shape) # (21, 35) と出力されています。
MyuW
MyuW

2020/12/18 17:48

ディレクトリ00〜04の5つを読み込んだ場合では、 print(x_train.shape) # (140, 100, 100, 100, 3) print(y_train.shape) # (140, 35) print(x_test.shape) # (35, 100, 100, 100, 3) print(y_test.shape) # (35, 35) と出力され、summary後の出力が Train on 112 samples, validate on 28 samples となってしまっています。
jbpb0
jbpb0

2020/12/18 23:30

データの次元は合ってますね こちらで合わないのは、画像を置いてるフォルダ構成が再現できてないからかもしれません 失礼しました
jbpb0
jbpb0

2020/12/18 23:54

model.fit()のbatch_size=32を減らしたら、メモリー使用量が減るかもしれません
MyuW
MyuW

2020/12/19 09:01

返答が遅れてしまい申し訳ないです。 batch_sizeを2や4まで下げてみたところ、00〜09までの画像を読み込むことができるようになりました。 また、00〜39の全画像を読み込むために画像サイズを50×50まで小さくして読み込んでみたのですが、 print(x_train.shape) #(1120,) print(y_train.shape) #(1120, 35) print(x_test.shape) #(280,) print(y_test.shape) #(280, 35) となってしまい、 ValueError: Error when checking input: expected input_1 to have 5 dimensions, but got array with shape (1120, 1) が返されます。00〜09のみを読み込んだ場合については正常なshapeの型が返ってきてくれるのですが、、 また、50×50のサイズでは解像度が非常に低くなってしまうので、できれば100×100で学習させたいです。
jbpb0
jbpb0

2020/12/19 09:22

batch_size=1 では、動きませんか? あとは、100フレームを1枚飛ばしにして半分にするとか

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Keras

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

深層学習

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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