En lisant "Deep Learning from scratch" (écrit par Yasuki Saito, publié par O'Reilly Japan), je noterai les sites auxquels j'ai fait référence. Partie 13 ←
J'ai utilisé Google Colaboratory pour exécuter le programme dans le livre.
Je le fais avec une telle structure de dossiers.
content/
└ Nom du lecteur/
└My Drive/
└Colab Notebooks/
└deep_learning/
├common/
| ├functions.py
| └two_layer_net.py
├dataset/
| ├mnist.py
| ├mnist.pkl
| └lena.png
├ch04
| ├train_neuralnet.ipynb
| └test_neuralne.ipynb
|
Modifiez la partie import de two_layer_net.py dans le chapitre 4 et placez-la dans le dossier commun.
deux placés dans le dossier commun_layer_net.py
import sys, os
sys.path.append(os.pardir)
from functions import *
from gradient import numerical_gradient
import numpy as np
class TwoLayerNet:
def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
#Initialisation du poids
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
self.params['b1'] = np.zeros(hidden_size)
self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
self.params['b2'] = np.zeros(output_size)
def predict(self, x):
W1, W2 = self.params['W1'], self.params['W2']
b1, b2 = self.params['b1'], self.params['b2']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
y = softmax(a2)
return y
# x:Des données d'entrée, t:Données des enseignants
def loss(self, x, t):
y = self.predict(x)
return cross_entropy_error(y, t)
def accuracy(self, x, t):
y = self.predict(x)
y = np.argmax(y, axis=1)
t = np.argmax(t, axis=1)
accuracy = np.sum(y == t) / float(x.shape[0])
return accuracy
# x:Des données d'entrée, t:Données des enseignants
def numerical_gradient(self, x, t):
loss_W = lambda W: self.loss(x, t)
grads = {}
grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
grads['b2'] = numerical_gradient(loss_W, self.params['b2'])
return grads
def gradient(self, x, t):
W1, W2 = self.params['W1'], self.params['W2']
b1, b2 = self.params['b1'], self.params['b2']
grads = {}
batch_num = x.shape[0]
# forward
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
y = softmax(a2)
# backward
dy = (y - t) / batch_num
grads['W2'] = np.dot(z1.T, dy)
grads['b2'] = np.sum(dy, axis=0)
dz1 = np.dot(dy, W2.T)
da1 = sigmoid_grad(a1) * dz1
grads['W1'] = np.dot(x.T, da1)
grads['b1'] = np.sum(da1, axis=0)
return grads
J'ai divisé le code de train_neuralnet.py en plusieurs parties et les ai exécutées en mode interactif.
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
import sys, os
sys.path
['', '/env/python', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', '/usr/local/lib/python3.6/dist-packages/IPython/extensions', '/root/.ipython']
sys.path.append(os.pardir) #Paramètres d'importation des fichiers dans le répertoire parent
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/common')
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/dataset')
sys.path
['', '/env/python', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', '/usr/local/lib/python3.6/dist-packages/IPython/extensions', '/root/.ipython', '..', '/content/drive/My Drive/Colab Notebooks/deep_learning/common', '/content/drive/My Drive/Colab Notebooks/deep_learning/dataset']
import numpy as np
import matplotlib.pyplot as plt
from mnist import load_mnist
from two_layer_net import TwoLayerNet
Si vous exécutez un autre script avant d'exécuter ce script et que le contenu du fichier ou du dossier est différent, vous obtiendrez une ModuleNotFoundError ici. Si cela se produit, vous ne pourrez pas continuer même si le script est correct. Runtime> Gérer les sessions> Terminez une session en cours et essayez de la réexécuter après un certain temps et cela semble fonctionner.
#Lire les données
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
iters_num = 10000 #Définissez le nombre de répétitions comme il convient
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1
train_loss_list = []
train_acc_list = []
test_acc_list = []
iter_per_epoch = max(train_size / batch_size, 1)
for i in range(iters_num):
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
#Calcul du gradient
#grad = network.numerical_gradient(x_batch, t_batch)
grad = network.gradient(x_batch, t_batch)
#Mise à jour des paramètres
for key in ('W1', 'b1', 'W2', 'b2'):
network.params[key] -= learning_rate * grad[key]
loss = network.loss(x_batch, t_batch)
train_loss_list.append(loss)
if i % iter_per_epoch == 0:
train_acc = network.accuracy(x_train, t_train)
test_acc = network.accuracy(x_test, t_test)
train_acc_list.append(train_acc)
test_acc_list.append(test_acc)
print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))
#Dessiner un graphique
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()
De plus, le résultat d'apprentissage est enregistré dans le fichier pkl.
#Enregistrez l'objet réseau avec pickle.
import pickle
save_file = '/content/drive/My Drive/Colab Notebooks/deep_learning/dataset/TwoLayerNet_weight.pkl'
with open(save_file, 'wb') as f:
pickle.dump(network, f, -1)
Jugons les données de test en utilisant le résultat enregistré.
import sys, os
sys.path.append(os.pardir)
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/common')
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/dataset')
import numpy as np
import matplotlib.pyplot as plt
from mnist import load_mnist
from two_layer_net import TwoLayerNet
#Lire les données
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=False)
#network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
import pickle
weight_file = '/content/drive/My Drive/Colab Notebooks/deep_learning/dataset/TwoLayerNet_weight.pkl'
with open(weight_file, 'rb') as f:
network = pickle.load(f)
#Vérifiez le contenu du résultat d'identification
import matplotlib.pyplot as plt
def showImg(x):
example = x.reshape((28, 28))
plt.figure()
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(example)
plt.show()
return
test_size = 10
test_mask = np.random.choice(10000, test_size)
x = x_test[test_mask]
t = t_test[test_mask]
for i in range(10):
y = network.predict(x[i])
p= np.argmax(y)
print("Bonne réponse" + str(t[i]))
print("Jugement[ " + str(p) + " ]")
count = 0
for v in y:
print("["+str(count)+"] {:.2%}".format(v))
count += 1
showImg(x[i])
Parfois, j'obtiens une ModuleNotFoundError, mais j'ai confirmé que le programme de lecture fonctionne.
Les ajustements suivants ont été nécessaires pour exécuter train_convnet.py dans le chapitre 7 en mode interactif:
Modifiez l'instruction d'importation de simple_convnet.py dans le dossier ch07 et placez-la dans le dossier common.
simple_convnet.py
from common.layers import *
from common.gradient import numerical_gradient
#Modifiez l'instruction d'importation comme suit et définissez-la sur commun
from layers import *
from gradient import numerical_gradient
Modifiez la déclaration d'importation des modules suivants en commun de la même manière layers.py trainer.py
Créez un nouveau notebook, montez le lecteur et définissez le chemin.
from google.colab import drive
drive.mount('/content/drive')
import sys, os
sys.path.append(os.pardir) #Paramètres d'importation des fichiers dans le répertoire parent
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/common')
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/dataset')
Exécutez le script train_convnet.py dans l'ordre. Cependant, modifiez l'instruction d'importation avant de l'exécuter.
from mnist import load_mnist
from simple_convnet import SimpleConvNet
from trainer import Trainer
J'ai pu l'exécuter dans la même procédure que le programme du chapitre 4.
Partie 13 ← Cliquez ici pour la liste des mémos, etc. Glossaire illisible
Recommended Posts