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

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

ただいまの
回答率

88.05%

[python]kerasでの画像認識の処理が進まない.

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 805

score 4

前提・実現したいこと

kerasを用いて2入力のCNNを実装したいと考えています.

発生している問題

エラーなどは表示されないのですが,Epoch数が表示されてから一向に処理が進みません.(https://teratail.com/questions/91452 で取り扱われている問題とほぼ同じ状況ですが,こちらは1エポック目すら始まらず,下の四角内の表示から一切動きません.)エラーメッセージも出ないのでどこを調べたらよいかもわからず詰まってしまいました.考えられる問題はどのようなものがあるでしょうか?

Epoch 1/100

該当のソースコード

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import pathlib
from keras.models import Sequential, load_model, Model
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dense, Dropout
from keras.layers import concatenate
from keras.optimizers import Adam, Adagrad, RMSprop, SGD
from keras.utils.np_utils import to_categorical
from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau, TensorBoard
from keras.datasets import cifar10

class ImageDataGenerator(object):
    def __init__(self):
        self.reset()

    def reset(self):
        self.images1 = []
        self.images2 = []
        self.labels = []

    def flow_from_directory(self, directory_pcm ,directory_paf, classes, batch_size=32):
        classes = {v: i for i, v in enumerate(sorted(classes))}
        while True:
            for path_pcm in pathlib.Path(directory_pcm).iterdir():
                self.images1 = (np.load(path_pcm))
                self.images2 = (np.load(os.path.join(directory_paf,os.path.basename(path_pcm))))                
                _, y = path_pcm.stem.split('_')
                self.labels.append(to_categorical(classes[y], len(classes)))
 
                if len(self.images1) == batch_size:
                    inputs1 = np.asarray(self.images1)
                    inputs2 = np.asarray(self.images2)
                    inputs1 = inputs1.reshape(1,64,64,19).astype("float32")
                    inputs2 = inputs2.reshape(1,64,64,38).astype("float32")
                    targets = np.asarray(self.labels)
                    self.reset()
                    yield [inputs1, inputs2], targets

batch_size=10
epochs=100

model1 = Sequential()
model2 = Sequential()

model1.add(Conv2D(64,kernel_size=5,padding='same',activation='relu',input_shape=(64,64,19)))
model2.add(Conv2D(64,kernel_size=5,padding='same',activation='relu',input_shape=(64,64,38)))

model1.add(Conv2D(64,kernel_size=5,activation='relu'))
model2.add(Conv2D(64,kernel_size=5,activation='relu'))

model1.add(MaxPooling2D(pool_size=(2,2)))
model2.add(MaxPooling2D(pool_size=(2,2)))

model1.add(Dropout(0.2))
model2.add(Dropout(0.2))

model1.add(Flatten())
model2.add(Flatten())

model1.add(Dense(256,activation='relu'))
model2.add(Dense(256,activation='relu'))

merged = concatenate([model1.output,model2.output])
output = Dense(1,activation='sigmoid')(merged)

model = Model([model1.input,model2.input],output)

optimizer = Adam(lr = 0.001)
model.compile(
    optimizer = optimizer,
    loss = "binary_crossentropy",
    metrics = ["accuracy"]
)

early_stopping = EarlyStopping(
    monitor='val_loss',
    patience=10,
    verbose=1
)

weights_dir = './weights/'
if os.path.exists(weights_dir) == False:os.mkdir(weights_dir)
model_checkpoint = ModelCheckpoint(
    weights_dir + "val_loss{val_loss:.3f}.hdf5",
    monitor = 'val_loss',
    verbose = 1,
    save_best_only = True,
    save_weights_only = True,
    period = 3
)

reduce_lr = ReduceLROnPlateau(
    monitor = 'val_loss',
    factor = 0.1,
    patience = 3,
    verbose = 1
)

logging = TensorBoard(log_dir = "log/")

pcm_train = pathlib.Path('dataset/pcm_train2/')
paf_train = pathlib.Path('dataset/paf_train2/')
train_datagen = ImageDataGenerator()
classes = ['0', '1']

model.fit_generator(
    generator=train_datagen.flow_from_directory(pcm_train, paf_train, classes),
    steps_per_epoch=int(np.ceil(len(list(pcm_train.iterdir()))/ batch_size)),
    epochs=epochs,
    verbose=1)

試したこと

・トレーニングデータの正規化
・fit_generatorに与える引数のうちsteps_per_epochが(トレーニングデータの長さ)//(バッチサイズ)になっているかの確認

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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