学習用のデータを読み込む際、ラベルごとにフォルダ分けしてデータを保存していることが多かったんで、
ラベルを別途csvファイルで用意されているパターンに遭遇して詰まりました笑
今回は画像ファイルとラベルファイル(csv)が分かれている場合の読み込み方法についてまとめてみます。
参考にしたのはこちらのコンペです
for文を使って、画像のパスとcsvに表記されている画像のパスが
同じ場合cv2.imreadで読み込む、みたいな感じらしいです。
データ読み込み部分だけでなく、全体のコードを載せておきます。
#必要なライブラリの読み込み import cv2 import pandas as pd import numpy as np import matplotlib.pyplot as plt import json import os from tqdm import tqdm, tqdm_notebook from keras.models import Sequential from keras.layers import Activation, Dropout, Flatten, Dense from keras.applications import VGG16 from keras.optimizers import Adam #トレーニングデータ、テストデータ、ラベルデータのパス読み込み train_dir = "../input/train/train/" test_dir = "../input/test/test/" train_df = pd.read_csv('../input/train.csv') train_df.head() #試しに1枚プロットしてみる im = cv2.imread("../input/train/train/01e30c0ba6e91343a12d2126fcafc0dd.jpg") plt.imshow(im) #vgg16の読み込み vgg16_net = VGG16(weights='imagenet', include_top=False, input_shape=(32, 32, 3)) vgg16_net.trainable = False #モデルの概要を表示 vgg16_net.summary() #モデル作成 model = Sequential() model.add(vgg16_net) model.add(Flatten()) model.add(Dense(256)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer=Adam(lr=1e-5), metrics=['accuracy']) #データの読み込み X_tr = [] Y_tr = [] images = train_df["id"].values for img_id in tqdm_notebook(images): X_tr.append(cv2.imread(train_dir+img_id)) Y_tr.append(train_df[train_df["id"]==img_id]["has_cactus"].values[0]) X_tr = np.asarray(X_tr) X_tr = X_tr.astype('float32') X_tr /= 255 Y_tr = np.asarray(Y_tr) with open('history.json', 'w') as f: json.dump(history.history, f) history_df = pd.DataFrame(history.history) history_df[['loss', 'val_loss']].plot() history_df[['acc', 'val_acc']].plot() #学習の実行 batch_size = 32 nb_epoch = 1000 # Train model history = model.fit(X_tr, Y_tr, batch_size=batch_size, epochs=nb_epoch, validation_split=0.1, shuffle=True, verbose=2) #テストファイルの読み込み X_tst = [] Test_imgs = [] for img_id in tqdm_notebook(os.listdir(test_dir)): X_tst.append(cv2.imread(test_dir + img_id)) Test_imgs.append(img_id) X_tst = np.asarray(X_tst) X_tst = X_tst.astype('float32') #テストデータ予測 test_predictions = model.predict(X_tst) sub_df = pd.DataFrame(test_predictions, columns=['has_cactus']) sub_df['has_cactus'] = sub_df['has_cactus'].apply(lambda x: 1 if x > 0.75 else 0) sub_df['id'] = '' cols = sub_df.columns.tolist() cols = cols[-1:] + cols[:-1] sub_df=sub_df[cols] for i, img in enumerate(Test_imgs): sub_df.set_value(i,'id',img) X_tst /= 255 sub_df.head()