pythonによるニューラルネットワーク
2クラス分類タスク
4行3列のマス目に白黒でデザインした画像を判定します。
判定の文字は0、1とします。
Class 0
![](https://backyard.enginfo.jp/wp-content/uploads/2024/11/image-9.png)
Class 1
![](https://backyard.enginfo.jp/wp-content/uploads/2024/11/image-10.png)
import numpy as np
import json
# シグモイド関数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# シグモイド関数の微分
def sigmoid_derivative(x):
return x * (1 - x)
# ニューロン情報付きモデルの保存関数
def save_model_text(file_name, weights_input_hidden, weights_hidden_output, bias_hidden, bias_output):
model_data = {
"hidden_layer": {
f"neuron_{i}": {
"weights": weights_input_hidden[:, i].tolist(),
"bias": bias_hidden[0][i]
}
for i in range(weights_input_hidden.shape[1])
},
"output_layer": {
f"neuron_{i}": {
"weights": weights_hidden_output[:, i].tolist(),
"bias": bias_output[0][i]
}
for i in range(weights_hidden_output.shape[1])
}
}
with open(file_name, "w") as f:
json.dump(model_data, f, indent=4)
print(f"Model with neuron details saved to {file_name}")
# モデルの読み込み関数
def load_model_text(file_name):
with open(file_name, "r") as f:
model_data = json.load(f)
print(f"Model loaded from {file_name}")
hidden_layer_weights = np.array([neuron["weights"] for neuron in model_data["hidden_layer"].values()]).T
hidden_layer_bias = np.array([[neuron["bias"] for neuron in model_data["hidden_layer"].values()]])
output_layer_weights = np.array([neuron["weights"] for neuron in model_data["output_layer"].values()]).T
output_layer_bias = np.array([[neuron["bias"] for neuron in model_data["output_layer"].values()]])
return hidden_layer_weights, output_layer_weights, hidden_layer_bias, output_layer_bias
# ファイルからトレーニングデータを読み込む関数
def load_training_data(file_name, label):
data = []
with open(file_name, "r") as f:
for line in f:
line = line.strip()
if line:
# 行をリストに変換
pattern = eval(line)
data.append((pattern, label))
return data
# トレーニングデータの準備
def prepare_training_data(data_0_file, data_1_file):
data_0 = load_training_data(data_0_file, 0)
data_1 = load_training_data(data_1_file, 1)
all_data = data_0 + data_1
np.random.shuffle(all_data) # データをランダムにシャッフル
inputs = np.array([item[0] for item in all_data])
outputs = np.array([[item[1]] for item in all_data])
return inputs, outputs
# ニューラルネットワークのトレーニング関数
def train_neural_network(training_inputs, training_outputs, input_size, hidden_size, output_size, learning_rate, epochs, model_file):
# 重みとバイアスの初期化
np.random.seed(42)
weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))
weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))
bias_hidden = np.random.uniform(-1, 1, (1, hidden_size))
bias_output = np.random.uniform(-1, 1, (1, output_size))
# トレーニングループ
for epoch in range(epochs):
# フォワードパス
hidden_layer_input = np.dot(training_inputs, weights_input_hidden) + bias_hidden
hidden_layer_output = sigmoid(hidden_layer_input)
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output
predicted_output = sigmoid(output_layer_input)
# 誤差計算
error = training_outputs - predicted_output
# バックプロパゲーション
d_predicted_output = error * sigmoid_derivative(predicted_output)
error_hidden_layer = d_predicted_output.dot(weights_hidden_output.T)
d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output)
# 重みとバイアスの更新
weights_hidden_output += hidden_layer_output.T.dot(d_predicted_output) * learning_rate
weights_input_hidden += training_inputs.T.dot(d_hidden_layer) * learning_rate
bias_output += np.sum(d_predicted_output, axis=0, keepdims=True) * learning_rate
bias_hidden += np.sum(d_hidden_layer, axis=0, keepdims=True) * learning_rate
if epoch % 1000 == 0:
print(f"Epoch {epoch}, Error: {np.mean(np.abs(error))}")
# モデルを保存
save_model_text(model_file, weights_input_hidden, weights_hidden_output, bias_hidden, bias_output)
# ファイル名
data_0_file = "data_0.txt"
data_1_file = "data_1.txt"
model_file = "trained_model.json"
# トレーニングデータの準備
training_inputs, training_outputs = prepare_training_data(data_0_file, data_1_file)
# ニューラルネットワークの設定
input_size = 12
hidden_size = 8
output_size = 1
learning_rate = 0.1
epochs = 10000
# トレーニングの実行
train_neural_network(training_inputs, training_outputs, input_size, hidden_size, output_size, learning_rate, epochs, model_file)
Epoch 0, Error: 0.47867989429233043
Epoch 1000, Error: 0.01260526046523876
Epoch 2000, Error: 0.00833659500790282
Epoch 3000, Error: 0.006571055761071707
Epoch 4000, Error: 0.005560155387058668
Epoch 5000, Error: 0.004889503995158114
Epoch 6000, Error: 0.004404990660234827
Epoch 7000, Error: 0.004034858680098056
Epoch 8000, Error: 0.0037407283642331662
Epoch 9000, Error: 0.0035000254215633696
Model with neuron details saved to trained_model.json
import numpy as np
import json
import matplotlib.pyplot as plt
# シグモイド関数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# モデルの読み込み関数
def load_model_text(file_name):
with open(file_name, "r") as f:
model_data = json.load(f)
print(f"Model loaded from {file_name}")
hidden_layer_weights = np.array([neuron["weights"] for neuron in model_data["hidden_layer"].values()]).T
hidden_layer_bias = np.array([[neuron["bias"] for neuron in model_data["hidden_layer"].values()]])
output_layer_weights = np.array([neuron["weights"] for neuron in model_data["output_layer"].values()]).T
output_layer_bias = np.array([[neuron["bias"] for neuron in model_data["output_layer"].values()]])
return hidden_layer_weights, output_layer_weights, hidden_layer_bias, output_layer_bias
# パターン表示関数
def display_pattern(pattern, title=""):
pattern_reshaped = np.array(pattern).reshape(4, 3)
plt.imshow(pattern_reshaped, cmap="Greys", interpolation="nearest")
plt.title(title)
plt.axis("off")
plt.show()
# 画像データ
pattern_0 = [0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0]
# pattern_0 = [0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]
# 保存モデルの読み込み
weights_input_hidden, weights_hidden_output, bias_hidden, bias_output = load_model_text("trained_model.json")
# テスト入力
test_input = pattern_0
# フォワードパス
hidden_layer_input = np.dot(test_input, weights_input_hidden) + bias_hidden
hidden_layer_output = sigmoid(hidden_layer_input)
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output
predicted_output = sigmoid(output_layer_input)
# 結果表示
display_pattern(test_input, title="Test Input")
print("Predicted Output:", predicted_output)
Model loaded from trained_model.json
![](https://backyard.enginfo.jp/wp-content/uploads/2024/11/image-8.png)
Predicted Output: [[0.00240578]]
githubデータ
GitHub - WOCae/E111
Contribute to WOCae/E111 development by creating an account on GitHub.
コメント