En tant que pratique de Chainer, j'ai essayé un simple problème de séparation linéaire.
Je veux apprendre une fonction qui détermine si je suis obèse ou non en saisissant la taille (cm), le poids (kg) et le tour de poitrine (cm). Cependant, l'obésité est définie ici comme ayant un IMC (poids divisé par la taille au carré) de 25 ou plus. Par conséquent, les informations sur le poids et la taille sont suffisantes pour déterminer si le patient est obèse ou non, et les informations sur le tour de poitrine ne sont pas nécessaires. Ensuite, le dispositif d'apprentissage réalisé cette fois pourra-t-il déterminer s'il est obèse ou non en se concentrant uniquement sur la taille et le poids sans être dérouté par les informations sur le tour de poitrine?
J'ai créé des données factices dans Excel. Les indicateurs de taille, de poids, de tour de poitrine et d'obésité sont disposés sur une ligne séparée par des espaces. La taille, le poids et le tour de poitrine ont chacun été générés en ajoutant un nombre aléatoire normal avec une variance appropriée à la valeur moyenne des hommes. L'indicateur d'obésité était mis à 1 si l'IMC calculé à partir de la taille et du poids était de 25 ou plus. Nous en avons fait 1000 indépendamment, dont 900 pour l'apprentissage et 100 pour l'évaluation.
Hauteur Poids Tour de poitrine Drapeau d'obésité
152.5110992 70.64096855 76.24909648 1
176.5483602 72.54812988 79.99468908 0
171.9815877 78.13768514 80.87788608 1
180.013773 77.60660479 79.71464192 0
171.9685041 81.20240554 84.93720091 1
186.3999693 77.03393024 82.25099179 0
175.1117213 81.23388203 86.89111757 1
Comme vous pouvez le voir, c'est presque linéaire.
Après avoir pratiqué Chainer, j'ai essayé de construire un perceptron multicouche. Il a une structure à trois couches avec trois dimensions pour l'entrée, quatre dimensions pour les éléments cachés et deux dimensions pour la sortie. (Comme il s'agit d'une tâche de séparation linéaire, elle peut être effectuée avec un perceptron monocouche.) Les autres paramètres sont les suivants.
--Fonction d'activation: ReLu
class MLP(Chain):
def __init__(self):
super(MLP, self).__init__(
Réseau dimensionnel # 3-4-2
l1=L.Linear(3, 4),
l2=L.Linear(4, 2),
)
def forward(self, x, t, train):
h1 = F.dropout(F.relu(self.l1(x)), train=train)
y = self.l2(h1)
return F.softmax_cross_entropy(y, t), F.accuracy(y, t)
# Instanciation
model = MLP()
# Adam est adopté comme algorithme d'optimisation
optimizer = optimizers.Adam()
optimizer.setup(model)
N = 900 # Nombre de données d'entraînement
N_test = 100 # Nombre de données d'évaluation
n_epoch = 100 # nombre d'itérations
batchsize = 5 # mini lot
# Omis ci-dessous
La fonction d'erreur et le taux de précision ont été tracés par le nombre d'époques.
C'était un peu moins de 80% de performances. subtil?
Nous avons également examiné le type de sortie des données d'évaluation après l'apprentissage.
Taille Poids Système de circonférence thoracique Indicateur d'obésité estimé Indicateur d'obésité correct
[ 179.30055237 69.73477936 84.73832703] 0 0
[ 176.89619446 84.05502319 85.10128021] 1 1
[ 172.04129028 77.36618805 87.89541626] 1 1
[ 168.48660278 73.91072845 84.5171814 ] 1 1
[ 166.53656006 71.42696381 83.17546844] 0 1
[ 163.44270325 77.11021423 90.57539368] 1 1
[ 180.63993835 77.33372498 85.33548737] 0 0
[ 165.73175049 71.87976837 80.57328033] 0 1
Les deuxième et quatrième à partir du bas, qui étaient à l'origine obèses, ont été jugés normaux. Tous sont faibles en ne regardant que le poids. N'avez-vous pas saisi la relation avec votre taille?
overflow encountered in subtract
Lors de l'utilisation de softmax_cross_entropy, j'ai eu une erreur telle que overflow rencontré dans soustract
, et la fonction d'erreur était souvent nan. Cette erreur semble être causée par la saisie de 0 dans le journal lors du calcul de la fonction d'erreur d'entropie croisée. En fait, au début, j'ai utilisé une fonction linéaire comme fonction d'activation, mais il semble que cela n'a pas fonctionné.
Tombez dans une solution locale Il y a eu des moments où je suis tombé dans une solution locale et l'apprentissage n'a pas eu lieu. J'ai réduit le nombre de mini-lots, réaffecté la valeur initiale du poids, essayé plusieurs fois et réessayé jusqu'à ce qu'il soit bien appris.
Les performances de cette tâche sont inférieures à 80%. Je souhaite effectuer divers ajustements tels que le taux d'apprentissage, la taille du mini-lot, le taux d'abandon et la normalisation des données pour en avoir une idée.
Recommended Posts