概要
ニューラルネットワークでデータを訓練させたり検証したりする際に、データを(データ群,ラベル)の形に整形する必要がありますよね。
MNISTやCIFAR10だと事前にこの形になっているんですが、手持ちのデータを使うときには自分でこの形にする必要があります。が、理解するまで時間がかかったのでこちらにしたためておきます。
尚、基本的な方法については英語でどんぴしゃ回答してる方々がいたため、英語が行ける方は以下の一連のやりとりをご覧ください。
Convert Pandas dataframe to PyTorch tensor?
このQiitaでは文脈を補って少し詳しく解説しているので、適宜必要なところだけサク読みして下さい。
##データとラベルに手持ちのデータを分ける
###DataFrameからラベルを引っ張って来る(ラベルのコラム名:target)
train_label = torch.tensor(train['target'].values)
引用:Convert Pandas dataframe to PyTorch tensor?
###ラベル入りのDataFrameからデータ群を引っ張ってくる
train_data = torch.tensor(X.drop('target', axis = 1).values)
引用:Convert Pandas dataframe to PyTorch tensor?
ただしこれは、以下のようなエラーになることがあります。
TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, int64, int32, int16, int8, uint8, and bool.
上に書いてある通り、np.ndarrayのタイプがobjectだと、torch.tensorに変換できません。
objectとは複数のデータタイプが混ざっているデータ型のことです。
そのためデータを、tensorの対応する上記のデータ型のいずれかに変換する必要があります。
例えば、float32の型に統一してみます。以下のように書き換えるとうまく作動します。
train_data = torch.tensor(X.drop('target', axis = 1).values.astype(np.float32))
引用:Convert Pandas dataframe to PyTorch tensor?
このデータ型は自分のデータに適したものを使って下さい。
データ型についてはNumPyのデータ型dtype一覧とastypeによる変換(キャスト)が詳しいです。
###データ群のみのデータフレームをtensorに変換
あるいは最初からラベルの入っていないDataFrame(X_train)があれば,それをnp.arrayに変換してからtensorに変換します。
train_data = torch.tensor(np.array(X_train.astype('f')))
##データを(データ群、ラベル)の形に整形
from torch.utils import data
train_tensor = data.TensorDataset(train_data, train_label)
torch.utils.data.TensorDatasetのクラスはtensorsを引数として、最初の次元に合わせてtensorsにindexをつけることによって、データをまとめてくれます。
そのため、当然ですがトレーニングさせるデータとラベルの数があっていないとエラーになります。
参考:pytorch公式チュートリアル
以上です。