学習用データの作成
ニューラルネットワーク を 試験運用 するための簡単な 学習用データ を作成しておきます。入力データは $xy$ 平面の座標とします。正解値(目標変数)は、放物線 $y=x^2-4$ の上側にある点と下側にある点を、それぞれ 1 と 0 で表した 1 of K 表記のデータです。
# In[7]
# ★★★ 座標データを作成 ★★★
x = np.linspace(-6, 6, 17)
y = np.linspace(-6, 6, 17)
xx, yy = np.meshgrid(x, y)
XX, YY = np.meshgrid(x, y)
# ★★★ 入力データの作成 ★★★
# 格子データを1次元配列に変換
x_in = xx.reshape(-1)
y_in = yy.reshape(-1)
# x_inとy_inを結合
data_in = np.vstack([x_in, y_in]).T
# ★★★ クラスデータの作成 ★★★
# 条件を設定
condition = YY >= XX**2 - 4
# クラスデータの1列目
# 条件を満たすデータを1に、満たさないデータを0に書き換える
XX[condition] = 1
XX[~condition] = 0
# クラスデータの2列目
# 条件を満たすデータを0に、満たさないデータを1に書き換える
YY[condition] = 0
YY[~condition] = 1
# 格子データを1次元配列に変換
X = XX.reshape(-1)
Y = YY.reshape(-1)
# one_of_Kのクラスデータ
data_c = np.vstack([X, Y]).T
In[7] について簡単に解説しておきます。numpy.meshgrid() で 2 セットの格子データを生成します。xx と yy は形状を 1 次元配列に変換した後で、numpy.vstack() で縦軸 (axis = 0) 方向に結合して入力データ data_in とします。放物線 $y=x^2-4$ の(境界線も含めて)上側にある条件は
\[y\geq x^2-4\]
と表せます。格子点データ XX と YY について、
condition = XX**2 + YY**2 <= 16
という条件式 condition を定義して、
XX[condition] = 1
で条件を満たすデータをすべて 1 に書き換えます。Python でブール値 (True または False) を反転させる演算子は「 ~ 」です。すなわち、~conditon は条件を満たさない(放物線の下側にある)ことを意味します。したがって、
XX[~condition] = 0
と記述すると、条件を満たさないデータは 0 に書き換えられます。これで、XX はクラスデータの 1 列目となりました。同様に YY を使ってクラスデータの 2 列目を作成します (YY は XX の 0 と 1 を反転させた配列です) 。XX と YY を 1 次元配列に変換して、numpy.vstack() で結合させると、正解値データの完成です。
XX[condition] = 1 で XX が書き換えられているのに、XX を含んだ condition を使って YY のデータを作成していいのかと不安になるかもしれません(私も少し不安になりました)が、condition には、この変数を定義したときの XX の状態が保存されているので問題ありません。念のために、データを平面にプロットして確認しておきましょう。
# In[8]
import matplotlib.pyplot as plt
# 放物線の上側にある座標
# クラスデータの1列目が1となっているデータを抽出
x1 = data_in[data_c[:,0] == 1][:, 0]
y1 = data_in[data_c[:,0] == 1][:, 1]
# 放物線の下側にある座標
# クラスデータの1列目が0となっているデータを抽出
x2 = data_in[data_c[:,0] == 0][:, 0]
y2 = data_in[data_c[:,0] == 0][:, 1]
# 正解データをプロット
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(111)
ax.set_xlabel("x", size = 15, labelpad = 10)
ax.set_ylabel("y", size = 15, labelpad = 10)
ax.set_xlim([-6, 6])
ax.set_ylim([-6, 6])
ax.scatter(x1, y1, marker = "D", color = "darkorange")
ax.scatter(x2, y2, marker = "+", color = "darkblue"
次回記事のニューラルネットワーク試験運用では、このデータを使います。
ニューラルネットワークの学習用データの準備の仕方をChatGPTに尋ねました
[Q] ニューラルネットワークを試験運用するための学習用データをどのように準備すればいいか、教えてください。
[A] ニューラルネットワークを試験運用するための学習用データを準備する方法について、以下に説明します。
1.目的に合わせたデータセットの収集
ニューラルネットワークによる学習のためには、適切なデータセットを収集する必要があります。例えば、画像認識の場合は、膨大な数の画像を集めてデータセットを作成します。また、自然言語処理の場合は、大量の文章を収集し、データセットを作成します。
2.データセットの前処理
収集したデータセットを、ニューラルネットワークに適した形式に変換する必要があります。例えば、画像認識の場合は、画像をリサイズし、正規化し、RGBからグレースケールに変換します。また、自然言語処理の場合は、文章をトークン化し、ベクトル化することが一般的です。
3.データセットの分割
収集したデータセットを学習用と検証用に分割します。学習用データは、ニューラルネットワークの重みを更新するために使用されます。一方、検証用データは、学習の進捗を監視するために使用されます。データセットの分割方法は、交差検証法やホールドアウト法があります。
4.データの水増し
データセットに含まれるデータ数が少ない場合は、データの水増しを行うことが有効です。水増しには、画像の回転、反転、クロップ、ノイズの付加、明暗の変化などの手法があります。また、自然言語処理の場合は、文章を意図的に変換することでデータを水増しする方法があります。以上が、ニューラルネットワークを試験運用するための学習用データを準備する方法になります。データセットの収集や前処理、分割、水増しには、専門的な知識が必要な場合があるため、適切な手順を踏んで準備することが重要です。