Правильно ли реализован вход для нейронной сети (обратное распространение)? - PullRequest
1 голос
/ 20 апреля 2020

В настоящее время я пытаюсь заставить Сеть учиться предсказывать единичный круг (длина вектора до точки <1, например <a href="https://i.stack.imgur.com/utjKd.png" rel="nofollow noreferrer"> белый круг ). Я не уверен, что вход правильный (даже если «ожидаемый» график правильный), потому что я получаю странные выводы , когда закончил с обучением.

Сеть: 2 входа (х , y) 4 скрытых 1 выхода (значение серого)

См. код ниже, например, для keras:

import math
import matplotlib.pyplot as plt
import numpy
from keras.models import Sequential
from keras.layers import Dense

#init values
a = 100 #diagramsize/2
X = numpy.zeros(((2*a+1)**2,2))
y = numpy.zeros(((2*a+1)**2))

########################################creation of circle data
n=0
for i in range(-a,a+1):
    for j in range(-a,a+1):

        X[n] = [2*i/a,2*j/a]
        out = ((((2*i/a)**2)+((2*j/a)**2))**0.5)
        if out < 1:
            y[n] = 1
        else:
            y[n] = 0
        n += 1
###################################################

#creating plotable data            
test_img = [[0 for col in range(2*a+1)] for row in range(2*a+1)] 
for i in range(len(X)):
    test_img[int((X[i][0]*a/2+a))][int((X[i][1]*a/2+a))] = y[i]

#plot data 
#creates "white circle"     
plt.imshow(test_img, cmap='gray')
plt.show(block = False)
plt.pause(0.001) #show true values

# define the keras model
model = Sequential()
model.add(Dense(4, input_dim=2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))

# compile the keras model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# fit the keras model on the dataset
model.fit(X, y, epochs=100, batch_size=2000) #batch big, else error occurs

#predict values
tested = model.predict(X)

#for contrast
tested[0][0] = 1
tested[1][0] = 0

#create new image from data
for i in range(len(X)):
    test_img[int((X[i][0]*a/2+a))][int((X[i][1]*+a))] = tested[i][0]

#plot new image        
plt.imshow(test_img, cmap='gray')
plt.show(block = False)
plt.pause(0.001) #show true values
...