क्यू सीखने के लिए तंत्रिका नेटवर्क का उपयोग करने में विफल रहने के बाद, मैंने मूल बातें पर वापस जाने का फैसला किया और यह देखने के लिए कि क्या सब कुछ सही ढंग से काम कर रहा था और देखें कि कुछ मापदंडों ने सीखने की प्रक्रिया को कैसे प्रभावित किया। यहाँ वह कोड है जिसके साथ मैं आया था

from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import random
import numpy
from sklearn.preprocessing import MinMaxScaler

regressor = Sequential()
regressor.add(Dense(units=20, activation='sigmoid', kernel_initializer='uniform', input_dim=1))
regressor.add(Dense(units=20, activation='sigmoid', kernel_initializer='uniform'))
regressor.add(Dense(units=20, activation='sigmoid', kernel_initializer='uniform'))
regressor.add(Dense(units=1))
regressor.compile(loss='mean_squared_error', optimizer='sgd')
#regressor = ExtraTreesRegressor()

N = 5000
X = numpy.empty((N,))
Y = numpy.empty((N,))

for i in range(N):
    X[i] = random.uniform(-10, 10)
X = numpy.sort(X).reshape(-1, 1)

for i in range(N):
    Y[i] = numpy.sin(X[i])
Y = Y.reshape(-1, 1)

X_scaler = MinMaxScaler()
Y_scaler = MinMaxScaler()
X = X_scaler.fit_transform(X)
Y = Y_scaler.fit_transform(Y)

regressor.fit(X, Y, epochs=2, verbose=1, batch_size=32)
#regressor.fit(X, Y.reshape(5000,))

x = numpy.mgrid[-10:10:100*1j]
x = x.reshape(-1, 1)
y = numpy.mgrid[-10:10:100*1j]
y = y.reshape(-1, 1)
x = X_scaler.fit_transform(x)

for i in range(len(x)):
    y[i] = regressor.predict(numpy.array([x[i]]))

plt.figure()
plt.plot(X_scaler.inverse_transform(x), Y_scaler.inverse_transform(y))
plt.plot(X_scaler.inverse_transform(X), Y_scaler.inverse_transform(Y))

समस्या यह है कि मेरी सभी भविष्यवाणियों का मूल्य लगभग 0 है। जैसा कि आप देख सकते हैं कि प्रोटोकॉल वास्तव में सही है या नहीं, यह जांचने के लिए मैंने स्केलेर (टिप्पणी की गई पंक्तियों) से एक एक्स्ट्राट्रीज रेग्रेसर का उपयोग किया। तो मेरे तंत्रिका नेटवर्क में क्या खराबी है? यह काम क्यों नहीं कर रहा है?

(वास्तविक समस्या जिसे मैं हल करने का प्रयास कर रहा हूं वह तंत्रिका नेटवर्क का उपयोग करके माउंटेन कार समस्या के लिए क्यू फ़ंक्शन की गणना करना है। यह इस फ़ंक्शन अनुमानित से अलग कैसे है?)

1
user3548298 31 मार्च 2018, 04:57

2 जवाब

मैं निम्नलिखित कोड के अनुसार वास्तुकला और प्रशिक्षण को बदलकर एक अच्छा सन्निकटन प्राप्त करने में कामयाब रहा। यह थोड़ा अधिक है लेकिन कम से कम मुझे पता है कि समस्या कहां से आ रही थी।

from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import random
import numpy
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import ExtraTreesRegressor
from keras import optimizers

regressor = Sequential()
regressor.add(Dense(units=500, activation='sigmoid', kernel_initializer='uniform', input_dim=1))
regressor.add(Dense(units=500, activation='sigmoid', kernel_initializer='uniform'))
regressor.add(Dense(units=1, activation='sigmoid'))
regressor.compile(loss='mean_squared_error', optimizer='adam')
#regressor = ExtraTreesRegressor()

N = 5000

X = numpy.empty((N,))
Y = numpy.empty((N,))

for i in range(N):
    X[i] = random.uniform(-10, 10)

X = numpy.sort(X).reshape(-1, 1)

for i in range(N):
    Y[i] = numpy.sin(X[i])

Y = Y.reshape(-1, 1)

X_scaler = MinMaxScaler()
Y_scaler = MinMaxScaler()
X = X_scaler.fit_transform(X)
Y = Y_scaler.fit_transform(Y)

regressor.fit(X, Y, epochs=50, verbose=1, batch_size=2)
#regressor.fit(X, Y.reshape(5000,))

x = numpy.mgrid[-10:10:100*1j]
x = x.reshape(-1, 1)
y = numpy.mgrid[-10:10:100*1j]
y = y.reshape(-1, 1)
x = X_scaler.fit_transform(x)
for i in range(len(x)):
    y[i] = regressor.predict(numpy.array([x[i]]))


plt.figure()
plt.plot(X_scaler.inverse_transform(x), Y_scaler.inverse_transform(y))
plt.plot(X_scaler.inverse_transform(X), Y_scaler.inverse_transform(Y))

हालाँकि मैं अभी भी चकित हूँ कि मुझे यह कहते हुए कागजात मिले कि वे पाँच न्यूरॉन्स की केवल दो छिपी हुई परतों का उपयोग कर रहे थे जो कि माउंटेन कार समस्या के क्यू फ़ंक्शन का अनुमान लगा रहे थे और अपने नेटवर्क को केवल कुछ मिनटों के लिए प्रशिक्षित कर रहे थे और अच्छे परिणाम प्राप्त कर रहे थे। मैं अपनी मूल समस्या में अपने बैच के आकार को बदलने की कोशिश करूंगा कि मुझे क्या परिणाम मिल सकते हैं लेकिन मैं बहुत आशावादी नहीं हूं

0
user3548298 31 मार्च 2018, 12:06

आपके कोड का एक और संक्षिप्त संस्करण जो काम करता है:

def data_gen():
    while True:
        x = (np.random.random([1024])-0.5) * 10 
        y = np.sin(x)
        yield (x,y)

regressor = Sequential()
regressor.add(Dense(units=20, activation='tanh', input_dim=1))
regressor.add(Dense(units=20, activation='tanh'))
regressor.add(Dense(units=20, activation='tanh'))
regressor.add(Dense(units=1, activation='linear'))
regressor.compile(loss='mse', optimizer='adam')

regressor.fit_generator(data_gen(), epochs=3, steps_per_epoch=128)

x = (np.random.random([1024])-0.5)*10
x = np.sort(x)
y = np.sin(x)

plt.plot(x, y)
plt.plot(x, regressor.predict(x))
plt.show()

परिवर्तन किए गए: हाइपरबोलिक स्पर्शरेखा के साथ निम्न परत सक्रियण को बदलना, स्थिर डेटासेट को यादृच्छिक जनरेटर से बदलना, sgd को एडम के साथ बदलना। उस ने कहा, आपके कोड के अन्य हिस्सों में अभी भी समस्याएं हैं जिन्हें मैं अभी तक नहीं ढूंढ पाया (सबसे अधिक संभावना है कि आपका स्केलर और यादृच्छिक प्रक्रिया)।

1
KonstantinosKokos 31 मार्च 2018, 11:45