Нейронная сеть для добавления двух целых чисел - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в NeuralNets. Я хочу создать нейронную сеть, которая может добавить два целых числа. Я разработал это следующим образом: вопрос У меня действительно низкая точность 0,002%. что я могу сделать, чтобы увеличить его? 1) Для создания данных:

import numpy as np
import random 
a=[]
b=[]
c=[]

for i in range(1, 1001):
    a.append(random.randint(1,999))
    b.append(random.randint(1,999))
    c.append(a[i-1] + b[i-1])

X = np.array([a,b]).transpose()
y = np.array(c).transpose().reshape(-1, 1)

2) масштабирование моих данных:

from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
minmax2 = MinMaxScaler()
X = minmax.fit_transform(X)
y = minmax2.fit_transform(y)

3) Сеть:


from keras import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

clfa = Sequential()
clfa.add(Dense(input_dim=2, output_dim=2, activation='sigmoid', kernel_initializer='he_uniform'))
clfa.add(Dense(output_dim=2, activation='sigmoid', kernel_initializer='uniform'))
clfa.add(Dense(output_dim=2, activation='sigmoid', kernel_initializer='uniform'))
clfa.add(Dense(output_dim=2, activation='sigmoid', kernel_initializer='uniform'))
clfa.add(Dense(output_dim=1, activation='relu'))

opt = SGD(lr=0.01)
clfa.compile(opt, loss='mean_squared_error', metrics=['acc'])
clfa.fit(X, y, epochs=140)

выходы:

Epoch 133/140
1000/1000 [==============================] - 0s 39us/step - loss: 0.0012 - acc: 0.0020
Epoch 134/140
1000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020   
Epoch 135/140
1000/1000 [==============================] - 0s 41us/step - loss: 0.0012 - acc: 0.0020
Epoch 136/140
1000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020
Epoch 137/140
1000/1000 [==============================] - 0s 41us/step - loss: 0.0012 - acc: 0.0020
Epoch 138/140
1000/1000 [==============================] - 0s 42us/step - loss: 0.0012 - acc: 0.0020   
Epoch 139/140
1000/1000 [==============================] - 0s 40us/step - loss: 0.0012 - acc: 0.0020   
Epoch 140/140
1000/1000 [==============================] - 0s 42us/step - loss: 0.0012 - acc: 0.0020 

Это мой код с консольными выходами.

Я испробовал различные комбинации оптимизаторов, потерь и активаций, плюс эти данные идеально подходят для линейной регрессии.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Две ошибки, несколько проблем.

Ошибки:

  • Это проблема регрессии, поэтому активация последнего слоя должна быть linear, а не relu (оставляя это без указания чего-либо, будет работать, так как linear является активацией по умолчанию в слое Keras).
  • Точность не имеет смысла в регрессии ; удалите metrics=['acc'] из вашей модели компиляции - вы должны оценивать производительность вашей модели только с вашей потерей.

Проблемы:

  • Мы не используем sigmoid активации для промежуточных слоев; измените их все на relu.
  • Удалите аргумент kernel_initializer, оставив, таким образом, значение по умолчанию glorot_uniform, которое является рекомендуемым.
  • Число из плотных слоев каждый с двумя узлами не очень хорошая идея; попробуйте уменьшить количество слоев и увеличить количество узлов. См. здесь для простого примера сети для данных радужной оболочки.
0 голосов
/ 29 апреля 2020

Вы пытаетесь подогнать линейную функцию, но внутренне используете сигмовидные узлы, которые отображают значения в диапазон (0,1). Сигмоид очень полезен для классификации, но не для регрессии, если значения находятся за пределами (0,1). Это МОЖЕТ работать, если вы ограничите свое случайное число плавающей точкой в ​​интервале [0,1]. ИЛИ вводите в свои узлы все биты отдельно и попросите его выучить сумматор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...