Professional Documents
Culture Documents
Mu
Mu
Mašinsko učenje
— Kroz programski jezik Python —
Predgovor iii
5 Neuronske mreže 29
5.1 Neuronske mreže sa propagacijom unapred . . . . . . . . . . . . . . . . . 30
5.2 Implementacija neuronske mreže sa propagacijom unapred . . . . . . . 35
5.3 Konvolutivne neuronske mreže . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.4 Različiti načini optimizacije neuronskih mreža . . . . . . . . . . . . . . . 44
5.5 Rekurentne neuronske mreže . . . . . . . . . . . . . . . . . . . . . . . . . 47
6 Učenje potkrepljivanjem 55
Literatura 63
i
Predgovor
Ovaj tekst je u ranoj fazi formiranja. Ukoliko ste pažljivi čitalac ove skripte,
i ukoliko uočite bilo kakvu grešku ili propust, možete se javiti autoru na adresu
mi13050@alas.matf.bg.ac.rs. Svi komentari, sugestije, kritike, ali i pohvale ve-
zane za ovaj materijal su dobrodošli.
Autor
iii
Glava 1
In [1]:
import numpy as np
import pandas as pd
1
GLAVA 1. UVOD U ZADATAK REGRESIJE 2
In [5]:
model = linear_model.LinearRegression(fit_intercept=True)
model.fit(x_train.reshape(-1, 1), y_train)
beta_0 = model.intercept_
beta_1 = model.coef_[0]
plt.plot(x, y, 'o')
plt.plot(x, f(x, beta_0, beta_1), '-')
plt.show()
Zadatak 1.2. Neka je dat skup podataka kao u zadatku 1.1. Rešiti matričnu jed-
načinu XT Xβ = XT Y, u kojoj je X matrica podataka, a Y matrica (vektor-kolona)
vrednosti ciljne promenljive.
In [8]:
train_size = x_train.shape[0]
M = np.vstack([np.ones(train_size), x_train.ravel()]).transpose()
coef_pseudo = np.linalg.pinv(M).dot(y_train)
num_of_coef = len(coef_pseudo)
coef_pseudo = coef_pseudo.reshape((2,))
plt.plot(x, y, 'o')
plt.plot(x, f(x, beta_0, beta_1), color='orange', linestyle ='--')
plt.show()
x_old = x
for i in range(1, max_iterations+1):
x_new = x_old - alpha*grad(x_old)
if np.abs(f(x_new)-f(x_old))<eps:
break
x_old = x_new
result['converge'] = i != max_iterations
result['number_of_iterations'] = i
result['x_min'] = x_new
result['f_min'] = f(x_new)
return result
def grad(x):
x1 = x[0]
x2 = x[1]
return np.array([x1, 10*x2])
x0 = (3, 5)
alpha = 0.1
eps = 0.01
max_iterations = 1000
In [13]:
def error_function(beta, x, y):
beta0 = beta[0]
beta1 = beta[1]
beta0_old = beta[0]
beta1_old = beta[1]
error_old = error_function(beta, x, y)
errors = np.empty(0)
errors = np.append(errors, error_old)
beta0_old = beta0_new
beta1_old = beta1_new
error_old = error_new
errors = np.append(errors, error_old)
result['converge'] = i != max_iterations
result['number_of_iterations'] = i
result['b_min'] = (beta0_old, beta1_old)
if plot is True:
plt.plot(np.arange(0, i), errors)
return result
In [14]:
beta = (3, 1)
alpha = 0.1
eps = 1e-4
max_iterations = 1000
Zadatak 1.5. Iz paketa sklearn.datasets učitati skup podataka o ceni kuća u Bosto-
nu. Vrednosti atributa i vrednosti ciljne promenljive smestiti u zasebne promenljive
tipa pandas.DataFrame i postaviti odgovarajuće vrednosti za imena kolona.
In [15]:
data = datasets.load_boston()
x = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=["MEDV"])
scaler = preprocessing.StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
model = linear_model.LinearRegression()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
metrics.mean_squared_error(y_test, y_pred)
final_model = linear_model.LinearRegression()
final_model.fit(x, y)
Glava 2
In [20]:
import os
import numpy as np
import pandas as pd
x = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
7
GLAVA 2. UVOD U ZADATAK KLASIFIKACIJE 8
In [23]:
x_train, x_test, y_train, y_test = model_selection.train_test_split( \
x, y, test_size = 0.33, random_state = 7, stratify = y \
)
scaler = preprocessing.StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
y_train_predicted = model.predict(x_train)
train_score = metrics.accuracy_score(y_train, y_train_predicted)
x_new = np.random.randn(30)
y_new = model.predict(x_new.reshape(1, -1))
print('Benign' if y_new == 1 else 'Malignant')
uzeti funkciju šarke, a za parametar C vrednost 1.0. Evaluirati dobijen klasi kator
nad skupom za obučavanje i skupom za treniranje u smislu metrike tačnosti.
In [28]:
model = svm.LinearSVC(loss='hinge', C=1.0)
model.fit(x_train, y_train)
y_pred_train = model.predict(x_train)
print()metrics.accuracy_score(y_train, y_pred_train))
y_pred_test = model.predict(x_test)
print(metrics.accuracy_score(y_test, y_pred_test))
−5 −4 4
• parametar C birati iz skupa {10 , 10 , . . . , 10 }
Zatim, za svaku kon guraciju, ponoviti postupak treniranja nad skupovima za obu-
čavanje i testiranje i evaluacije, i pri tome pamtiti dobijene ocene.
In [29]:
Cs = [10**i for i in range(-5, 5)]
losses = ['hinge']
train_scores = np.empty(0)
test_scores = np.empty(0)
y_pred_train = model.predict(x_train)
y_train_score = metrics.accuracy_score(y_train, y_pred_train)
y_pred_test = model.predict(x_test)
y_test_score = metrics.accuracy_score(y_test, y_pred_test)
Iscrtati dijagram zavisnosti ocena od kon guracija. Imenovati svaki nacrt i pri-
kazati legendu na najpogodnijoj poziciji.
In [30]:
num_of_configs = len(configs)
y_pred_train = best_model.predict(x_train)
print(metrics.accuracy_score(y_train, y_pred_train))
y_pred_test = best_model.predict(x_test)
print(metrics.accuracy_score(y_test, y_pred_test))
Zadatak 2.3. Neka je dat skup podataka iz zadatka 2.1. Koristeći mrežu hiper-
parametara iz zadatka 2.2, metodom pretrage mreže unakrsnom validacijom pro-
naći najbolju kon guraciju za linearni model zasnovan na potpornim vektorima.
Pretragu vršiti nad skupom za obučavanje. Za metriku izabrati tačnost, a osta-
le parametre pretrage ostaviti na podrazumevane. Najbolju kon guraciju sačuva-
ti u promenljivu linear_svc_best_params, a najbolji model sačuvati u promenljivu
linear_svc_best_model.
In [32]:
estimator = svm.LinearSVC()
param_grid = { \
'C': Cs, \
'loss': losses \
}
grid_linear_svc = model_selection.GridSearchCV( \
estimator=estimator, param_grid=param_grid, scoring='accuracy' \
)
grid_linear_svc.fit(x_train, y_train)
linear_svc_best_params = grid_linear_svc.best_params_
linear_svc_best_model = grid_linear_svc.best_estimator_
1 Napomenimo da ovakav pristup, iako prividno tačan, ipak ne predstavlja korektan postupak odre-
đivanja optimalne vrednosti hiperparametara. U zadatku 4.2 vratićemo se na ovaj problem i prikazati
ispravan postupak.
GLAVA 2. UVOD U ZADATAK KLASIFIKACIJE 11
vectorizer = feature_extraction.text.CountVectorizer()
vectorizer.fit(x)
x_bag_of_words = vectorizer.transform(x)
# Cuvanje recnika
vocabulary = vectorizer.vocabulary_
Zadatak 2.5. Neka je dat tekst iz zadatka 2.4. Transformisati dati tekst u TF-IDF
format.
In [34]:
tf_idf_vectorizer = feature_extraction.text.TfidfVectorizer()
tf_idf_vectorizer.fit(x)
x_tf_idf = tf_idf_vectorizer.transform(x)
bow_vectorizer = feature_extraction.text.CountVectorizer()
bow_vectorizer.fit(text)
x_train = bow_vectorizer.transform(x_train)
x_test = bow_vectorizer.transform(x_test)
GLAVA 2. UVOD U ZADATAK KLASIFIKACIJE 12
log_regr_model = linear_model.LogisticRegression()
log_regr_model.fit(x_train, y_train)
scores = np.append(scores, log_regr_model.score(x_test, y_test))
models = np.append(models, log_regr_model)
svc_model = svm.LinearSVC()
svc_model.fit(x_train, y_train)
scores = np.append(scores, svc_model.score(x_test, y_test))
models = np.append(models, svc_model)
best_index = np.argmin(scores)
print(models[best_index])
coefs = classifier.coef_.ravel()
sorted_coefs_indices = np.argsort(coefs)
positive_coefficients = sorted_coefs_indices[-n_top_features:]
negative_coefficients = sorted_coefs_indices[:n_top_features]
interesting_coefficients = np.hstack( \
[negative_coefficients, positive_coefficients] \
)
plt.figure(figsize=(15, 5))
GLAVA 2. UVOD U ZADATAK KLASIFIKACIJE 13
plt.title(title)
colors = ['orange' if c < 0 else 'cadetblue' \
for c in coefs[interesting_coefficients]]
plt.bar(np.arange(2 * n_top_features), \
coefs[interesting_coefficients], color=colors)
plt.xticks(np.arange(0, 2 * n_top_features), \
feature_names[interesting_coefficients], rotation=60, ha="right")
Glava 3
Modeli zasnovani na
instancama
In [39]:
import numpy as np
import pandas as pd
15
GLAVA 3. MODELI ZASNOVANI NA INSTANCAMA 16
y_pred = kernel_model.predict(x_test)
metrics.accuracy_score(y_test, y_pred)
y = f(x1, x2)
Evaluirati oba modela i oceniti koji model ima bolju moć predviđanja na datom
skupu podataka. Uz vizualizaciju iz zadatka 3.2 prikazati (na primer, crvenom bo-
jom) instance koji čine potporne vektore.
In [42]:
linear_svm = svm.LinearSVC(loss='hinge', C=1.0)
linear_svm.fit(x_train, y_train)
y_pred = linear_svm.predict(x_test)
linear_acc = metrics.accuracy_score(y_test, y_pred)
print("Linear SVM: {0}".format(linear_acc))
x = np.random.uniform(-1, 1, 100)
y = (x+1)**2 + np.random.randn(x.size)
In [45]:
bandwidths = np.array([0.01, 0.1, 0.5, 1, 5, 10, 100])
errors = []
errors.append(error)
errors = np.array(errors)
best_bandwidth = bandwidths[np.argmin(errors)]
y_predictions = []
test_errors = []
test_errors = np.array(test_errors)
test_error = np.mean(test_errors**2)
latlong = np.vstack( \
[data.train['dd lat'], \
data.train['dd long']]).transpose()
species = np.array([ \
d.decode('ascii').startswith('micro') \
for d in data.train['species']], dtype=np.int16)
m.drawmapboundary(fill_color='#DDEEFF')
GLAVA 3. MODELI ZASNOVANI NA INSTANCAMA 19
m.fillcontinents(color='#FFEEDD')
m.drawcoastlines(color='gray', zorder=2)
m.drawcountries(color='gray', zorder=2)
fig, ax = plt.subplots(1, 2)
fig.subplots_adjust(left=0.05, right=0.95, wspace=0.05)
species_names = ['Bradypus Variegatus', 'Microryzomys Minutus']
cmaps = ['Oranges', 'Purples']
m = Basemap(projection='cyl', llcrnrlat=Y.min(), \
urcrnrlat=Y.max(), llcrnrlon=X.min(), \
urcrnrlon=X.max(), resolution='c', ax=axi)
m.drawmapboundary(fill_color='#DDEEFF')
m.drawcoastlines()
m.drawcountries()
Z = np.full(land_mask.shape[0], -9999.0)
Z[land_mask] = np.exp(kde.score_samples(xy))
Z = Z.reshape(X.shape)
In [49]:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
scaler_tr_val = preprocessing.StandardScaler()
scaler_tr_val.fit(x_train_val)
x_train_val = scaler_tr_val.transform(x_train_val)
x_test = scaler_tr_val.transform(x_test)
scaler_train = preprocessing.StandardScaler()
scaler_train.fit(x_train)
x_train = scaler_train.transform(x_train)
x_val = scaler_train.transform(x_val)
21
GLAVA 4. EVALUACIJA I IZBOR MODELA 22
Zadatak 4.2. Neka je data podela skupa podataka kao u zadatku 4.1. Potrebno
je odrediti optimalnu kon guraciju za kernelizovani model zasnovan na potpornim
vektorima. Za tehniku evaluacije izabrati evaluaciju pomoću skupova za validaciju
i testiranje. Prilikom izbora modela i evaluacije za metriku koristiti meru tačnosti.
Mreža hiperparametara je data sa:
−5 −4 4
• parametar C birati iz skupa {10 , 10 , . . . , 10 }
−3 −2 2
• parametar gamma birati iz skupa {10 , 10 , . . . , 10 }
In [51]:
Cs = [10**i for i in range(-5, 5)]
gammas = [10**i for i in range(-3, 3)]
best_score = 0
best_params = { 'C': None, 'gamma': None }
# Izbor modela
for C in Cs:
for gamma in gammas:
model = svm.SVC(C=C, gamma=gamma)
model.fit(x_train, y_train)
y_pred = model.predict(x_val)
score = metrics.accuracy_score(y_val, y_pred)
accuracy_scores = model_selection.cross_val_score( \
best_model, x, y, scoring='accuracy', cv=10)
print(accuracy_scores)
Zadatak 4.4. Izvršiti izbor modela i evaluaciju kao u zadatku 4.2. Za tehniku eva-
luacije izabrati unakrsnu validaciju na 10 slojeva.
GLAVA 4. EVALUACIJA I IZBOR MODELA 23
In [53]:
Cs = [10**i for i in range(-5, 5)]
gammas = [10**i for i in range(-3, 3)]
best_score = 0
best_params = { 'C': None, 'gamma': None }
for C in Cs:
for gamma in gammas:
model = svm.SVC(C=C, gamma=gamma)
accuracy_scores = model_selection.cross_val_score( \
model, x_train_val, y_train_val, scoring='accuracy', cv=10)
score = np.mean(accuracy_scores)
y_pred = best_model.predict(x_test)
print(metrics.accuracy_score(y_test, y_pred))
grid_svc = model_selection.GridSearchCV( \
estimator, param_grid, scoring='accuracy', cv=10, \
return_train_score=True)
grid_svc.fit(x_train_val, y_train_val)
y_pred = grid_svc.predict(x_test)
print(metrics.accuracy_score(y_test, y_pred))
number_of_Cs = len(Cs)
number_of_gammas = len(gammas)
mean_test_scores = cv_results['mean_test_score'] \
.values.reshape((number_of_gammas, number_of_Cs))
plt.figure(figsize=(10, 6))
plt.xticks(range(number_of_Cs), Cs)
GLAVA 4. EVALUACIJA I IZBOR MODELA 24
plt.yticks(range(number_of_gammas), gammas)
plt.xlabel('C')
plt.ylabel('gamma')
plt.imshow(mean_test_scores)
plt.colorbar()
plt.show()
Zadatak 4.6. Izvršiti izbor modela i evaluaciju kao u zadatku 4.2. Za tehniku eva-
luacije izabrati ugnežđenu unakrsnu validaciju na 5 unutrašnjih i 10 spoljašnjih
slojeva.
In [56]:
estimator = svm.SVC()
scores = model_selection.cross_val_score( \
model_selection.GridSearchCV( \
estimator, param_grid, scoring='accuracy', cv=5 \
), x, y, scoring='accuracy', cv=10 \
)
print(scores)
x_train = x[:N, :]
y_train = y[:N]
x_test = x[N:, :]
y_test = y[N:]
Zadatak 4.8. Napisati funkciju koja trenira zadati model na trening skupu, a potom
evaluira i vraća vrednost funkcije greške na test skupu. Funkcija treba da objedini
funkcionalnosti fit, predict i score metoda.
In [58]:
def train_test_eval(model, x_train, y_train, x_test, y_test, \
error_function):
model.fit(x_train, y_train)
y_predicted = model.predict(x_test)
errors = []
for c in configs:
model = configure_model(c)
error = train_test_eval(model, x_train, y_train, x_validation, \
y_validation, error_function)
errors.append(error)
errors = np.array(errors)
c_best = configs[np.argmin(errors)]
model = configure_model(c_best)
model.fit(x, y)
return model
Zadatak 4.10. Napisati funkciju koja deli skupove na trening, test i validacione
skupove u zadatim razmerama, zatim određuje najbolji model korišćenjem funkcije
iz zadatke 4.9 i vraća ocenu njegove greške koriscenjem funkcije iz zadatka 4.8.
In [60]:
def train_valid_test_eval(x, y, ratios, error_function, configure_model, \
configs):
x_train_validation, x_test, y_train_validation, y_test = \
data_split(x, y, ratios[0] + ratios[1])
r = ratios[0]/(ratios[0] + ratios[1])
y_predicted = model.predict(x_test)
Zadatak 4.11. Napisati funkciju omotač kojom se može kon gurisati model logi-
stičke regresije. Zatim napisati funkciju koja se može koristiti za ocenu greške
−5 −4 4
klasi kacije. Neka je dat skup {10 , 10 , . . . , 10 } kon guracija za parametar C
logističke regresije.
In [61]:
def configure_logistic_model(c):
return linear_model.LogisticRegression(C=c)
Učitati skup podataka iz zadatka 2.1 i odrediti najbolji model logističke regresije
na skupovima za treniranje i validaciju korišćenjem funkcije iz zadatka 4.9. Podelu
skupa izvršiti u razmeri 4 : 1.
In [62]:
model = train_valid_select(x, y, 0.8, \
classification_error, configure_logistic_model, configurations)
Zadatak 4.12. Napisati funkciju koja korišćenjem unakrsne validacije evaluira za-
dati model. Funkcija treba da vrati vrednost greške modela.
In [64]:
def cross_validation_evaluation(model, x, y, number_of_folds, \
error_function):
y_predicted = np.empty(y.size)
y_train = y[inds != i]
y_test = y[inds == i]
model.fit(x_train, y_train)
y_predicted[inds == i] = model.predict(x_test)
Zadatak 4.13. Napisati funkciju koja korišćenjem unakrsne validacije bira najbolju
kon guraciju za zadati model. Funkcija vraća najbolji model.
In [65]:
def cross_validation_selection(x, y, number_of_folds, error_function, configure_model, configs):
errors = []
for c in configs:
model = configure_model(c)
error = cross_validation_evaluation( \
model, x, y, number_of_folds, error_function)
errors.append(error)
errors = np.array(errors)
c_best = configs[np.argmin(errors)]
model = configure_model(c_best)
model.fit(x, y)
return model
GLAVA 4. EVALUACIJA I IZBOR MODELA 27
x_test = x [ inds == i]
y_test = y [ inds == i]
model = cross_validation_selection( \
x_train_validation, y_train_validation, number_of_folds, \
error_function, configure_model, configs)
Zadatak 4.15. Korišćenjem funkcije iz zadatka 4.14, oceniti model logističke re-
gresije korišćenjem ugnežđene unakrsne validacije sa 5 slojeva. Mrežu parametra
podesiti kao u zadatku 4.11.
In [67]:
nested_cross_validation_evaluation( \
x, y, 5, classification_error, configure_logistic_model, \
configurations)
Glava 5
Neuronske mreže
In [68]:
import numpy as np
import scipy.io
import pandas as pd
import h5py
29
GLAVA 5. NEURONSKE MREŽE 30
scaler = preprocessing.StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
model = Sequential()
model.add(Dense(units=100, input_dim=number_of_features, activation='relu'))
model.add(Dense(units=output_size))
model.compile(optimizer='adam', loss='mse')
model.summary()
epochs = history.epoch
losses = history.history['loss']
plt.xlabel('epoch')
plt.ylabel('loss)
plt.plot(epochs, losses)
In [72]:
print(model.evaluate(x_test, y_test))
Za svaki sloj ispisati dimenzije matrica koe cijenata (težina koji karakterišu mre-
žu). Sačuvati težine u datoteku boston_housing_weights.hdf5. Prikazati i čuvanje
modela u datoteku boston_housing.hdf5, a zatim učitati sačuvani model.
In [73]:
weights = model.weights
for i in range(len(weights)):
print(weights[i].shape)
model.save_weights('boston_housing_weights.hdf5')
model.save('boston_housing.hdf5')
model = load_model('boston_housing.hdf5')
Zadatak 5.2. Učitati skup podataka iz zadatka 2.1 i izvršiti podelu na skupove za
2
obučavanje i testiranje u razmeri 2 : 1 i izvršiti standardizaciju .
In [74]:
np.random.seed(7)
data = datasets.load_breast_cancer()
x = data.data
y = data.target
scaler = preprocessing.StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
model = Sequential()
model.add(Dense(units=100, input_dim=number_of_features, activation='relu'))
model.add(Dense(units=40, activation='relu'))
model.add(Dense(units=number_of_outputs, activation='sigmoid'))
2
Probati zadatak uz vršenje strati kacije podataka pri podeli i bez nje.
GLAVA 5. NEURONSKE MREŽE 32
model.compile(optimizer='adam', loss=binary_crossentropy, \
metrics=['accuracy'])
model.summary()
Obučiti model na 30 epoha i veličinom batch skupa od 16. Iskoristiti 30% skupa
za obučavanje za validaciju. Prikazati gra k funkcije greške na skupu za obučavanje
i validacionom skupu u zavisnosti od broja epohe. Da li se model pretprilagođava
podacima? Ukoliko se model pretprilagođava, do koje epohe treba vršiti proces
obučavanja da li se sprečilo pretprilagođavanje?
In [76]:
history = model.fit(x_train, y_train, epochs=30, batch_size=16, \
validation_split=0.3, verbose=0)
epochs = history.epoch
train_loss = history.history['loss']
val_loss = history.history['val_loss']
plt.xlabel('Epochs')
plt.ylabel('Loss function')
plt.plot(epochs, train_loss, color='red', label='Train loss')
plt.plot(epochs, val_loss, color='orange', label='Val loss')
plt.legend(loc='best')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.plot(epochs, train_acc, color='green', label='Train accuracy')
plt.plot(epochs, val_acc, color='blue', label='Val accuracy')
plt.legend(loc='best')
Zadatak 5.3. Skup podataka ,,Pima Indians Diabetes'' se sastoji iz 768 instanci,
od kojih svaka predstavlja vrednosti dobijene od pacijenata. Svi atributi su nu-
merički i opseg vrednosti varira od atributa do atributa. Svakoj instanci je pri-
družena klasa u zavisnosti od toga da li je pacijentu dijagnosti kovan dijabetes u
poslednjih 5 godina (vrednost 1) ili ne (vrednost 0). Ucitati podatke iz datoteke
prima-indians-diabetes.csv, izvršiti podelu podataka u razmeri 4 : 1 i izvršiti neop-
hodna pretprocesiranja.
GLAVA 5. NEURONSKE MREŽE 33
In [79]:
data = pd.read_csv('pima-indians-diabetes.csv')
attribute_names = data.columns.drop(['Target'])
x = data[attribute_names]
y = data['Target']
scaler = preprocessing.StandardScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
model = Sequential()
model.add(Dense(units=15, input_dim=number_of_features, activation='relu'))
model.add(Dense(units=8, activation='relu'))
model.add(Dense(units=output_size, activation='sigmoid'))
model.compile(optimizer='adam', loss=binary_crossentropy, \
metrics=['accuracy'])
loss = history.history['loss']
validation_loss = history.history['val_loss']
acc = history.history['acc']
validation_acc = history.history['val_acc']
plt.figure(figsize=(10, 8))
plt.plot(epochs, loss, c='red')
plt.plot(epochs, validation_loss, c='orange')
plt.show()
plt.figure(figsize=(10, 8))
plt.plot(epochs, acc, c='red')
GLAVA 5. NEURONSKE MREŽE 34
pixel_max = 255
x_train = x_train/pixel_max
x_test = x_test/pixel_max
number_of_classes = 10
y_train = to_categorical(y_train, number_of_classes)
y_test = to_categorical(y_test, number_of_classes)
• Sloj 3: gusti sloj sa onoliko čvorova koliko ima klasa i funkcijom mekog mak-
simuma kao aktivacionom funkcijom
In [84]:
y_pred = model.predict(x_test[:20, :])
columns = 5
rows = 4
orig_img_size = int(np.sqrt(image_size))
for r in range(rows):
for c in range(columns):
img = x_test[r+c].reshape((orig_img_size, orig_img_size))
ax = axes[r][c]
ax.figure.set_size_inches(15, 15)
ax.set_title('True class: {0},\nPredicted class: {1}'. \
format(np.argmax(y_test[r+c]), np.argmax(y_pred[r+c])))
ax.imshow(img, cmap='gray')
def sigmoid_prime(z):
s = sigmoid(z)
return s*(1-s)
sigmoid(0)
sigmoid_prime(0)
GLAVA 5. NEURONSKE MREŽE 36
class Network():
# ulazna aktivacija je x
def feedforward(self, network_input):
for b, w in zip(self.biases, self.weights):
# racunamo aktivacije za svaki sloj
network_input = sigmoid(np.dot(w, network_input) + b)
mini_batches = [
(training_inputs[k:k+mini_batch_size], training_results[k:k+mini_batch_size]) \
for k in range(0, n, mini_batch_size)
]
if test_data:
print('Epoch {0}: {1}/{2}'.format(
epoch, self.evaluate(test_data[0], test_data[1]), m
))
else:
GLAVA 5. NEURONSKE MREŽE 37
# za pojedinacno x i y
def backpropagation(self, x, y):
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
activations = [x]
activation = x
zs = []
# forward pass
for b, w in zip(self.biases, self.weights):
z = np.dot(w, activation) + b
zs.append(z)
activation = sigmoid(z)
activations.append(activation)
return activation-y
network.number_of_layers
network.sizes
network.feedforward(network_input)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train = x_train/255
x_test = x_test/255
def vectorize(digit):
v = np.zeros((10, 1))
v[digit] = 1
return v
training_results[1]
train_x = np.array(train_dataset['train_set_x'])
train_y = np.array(train_dataset['train_set_y'])
classes = np.array(train_dataset['list_classes'])
for i in np.arange(preview):
ind = np.random.randint(train_x.shape[0])
plt.figure()
plt.suptitle(train_y[ind])
plt.imshow(train_x[ind])
return y_one_hot
test_x = np.array(test_dataset['test_set_x'])
test_y = np.array(test_dataset['test_set_y'])
tix = tix/255
test_x = test_x/255
tiy = one_hot(tiy, C)
test_y = one_hot(test_y, C)
Napisati funkciju koja na osnovu dimenzija slike i broja klasa konstruiše konvo-
lutivnu neuronsku mrežu zadatu narednom speci kacijom:
• Sloj 9: gusti sloj sa onoliko neurona koliko ima klasa i funkcijom mekog mak-
simuma kao aktivacionom funkcijom
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 64, 3) 0
_________________________________________________________________
zero_padding2d_1 (ZeroPaddin (None, 66, 66, 3) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 64, 64, 32) 896
_________________________________________________________________
batch_normalization_1 (Batch (None, 64, 64, 32) 128
_________________________________________________________________
activation_1 (Activation) (None, 64, 64, 32) 0
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 32, 32, 32) 0
GLAVA 5. NEURONSKE MREŽE 41
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 34, 34, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 32, 32, 64) 18496
_________________________________________________________________
batch_normalization_2 (Batch (None, 32, 32, 64) 256
_________________________________________________________________
activation_2 (Activation) (None, 32, 32, 64) 0
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 16, 16, 64) 0
_________________________________________________________________
zero_padding2d_3 (ZeroPaddin (None, 18, 18, 64) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 16, 16, 16) 9232
_________________________________________________________________
batch_normalization_3 (Batch (None, 16, 16, 16) 64
_________________________________________________________________
activation_3 (Activation) (None, 16, 16, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 4096) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_1 (Dense) (None, 1024) 4195328
_________________________________________________________________
dense_2 (Dense) (None, 6) 6150
=================================================================
Total params: 4,230,550
Trainable params: 4,230,326
Non-trainable params: 224
_________________________________________________________________
Takođe, prikazati i graphviz dijagram date mreže.
In [89]:
def build_model(image_shape, C):
x_input = Input(image_shape)
# broj filtera/matrica
# dimenzija matrica
#strides - pomeraji horizontalno, vertikalno
x = Conv2D(32, (3, 3), strides=(1,1))(x)
# aktivacioni sloj
GLAVA 5. NEURONSKE MREŽE 42
x = Activation('relu')(x)
# agregacioni sloj
# max pooling ili average pooling
# kazemo dimenzije blokova iz kojih izvlacimo max
x = MaxPool2D((2,2))(x)
x = MaxPool2D((2,2))(x)
# dropout sloj
# kazemo koji je procenat neurona
# cije cemo aktivacione funkcije postaviti na 0, tj.
# koje cemo izbaciti iz mreze
# vid regularizacije
x = Dropout(rate=0.1)(x)
# gusti sloj
x = Dense(units=1024, activation='relu')(x)
# poslednji gusti sloj za izlaz
x = Dense(units=C, activation='softmax')(x)
sign_cnn = build_model(tix[0].shape, C)
sign_cnn.summary()
display(SVG(model_to_dot(sign_cnn).create(prog='dot', format='svg')))
Zadatak 5.8. Iz paketa keras.datasets učitati skup podataka cifar10. Zbog velike
dimenzionalnosti skupa, izdvojiti 200 slika za obučavanje i 50 slika za evaluaciju.
GLAVA 5. NEURONSKE MREŽE 43
Prikazati jednu nasumičnu sliku i u naslovu staviti koje je klase. Takođe, ispisati i
dimenzije jednog podatka za obučavanje i proveriti broj raspoloživih klasa. Stan-
dardizovati ulazne podatke, a ciljne promenljive transformisati u one-hot reprezen-
taciju.
In [91]:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
plt.title('Klasa {0}'.format(y_train[0]))
plt.imshow(x_train[0])
print(x_train[0].shape)
num_of_classes = len(np.unique(y_train))
print('Broj klasa je {0}'.format(num_of_classes))
x_train = x_train/255
x_test = x_test/255
y_train = to_categorical(y_train, num_of_classes)
y_test = to_categorical(y_test, num_of_classes)
In [92]:
def build_model(input_size, num_of_classes):
model = Sequential()
model.add(Convolution2D(input_shape=input_size, filters=16, \
kernel_size=(3, 3), padding='same', activation='relu'))
model.add(Convolution2D(filters=64, kernel_size=(3, 3), padding='same', \
activation='relu'))
model.add(MaxPooling2D())
model.add(Convolution2D(filters=64, kernel_size=(3, 3), padding='same', \
activation='relu'))
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dense(units=512, activation='relu'))
model.add(Dense(units=num_of_classes, activation='softmax'))
return model
train_X = np.array(data['X']).T
train_Y = data['y'].T
test_X = data['Xval'].T
test_Y = data['yval'].T
GLAVA 5. NEURONSKE MREŽE 45
• Metrika: tačnost
• Batch size: 16
num_of_features = x_train.shape[1]
output_size = 1
model = Sequential()
model.add(Dense(input_dim=num_of_features, units=50, activation='relu'))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(units=output_size, activation='sigmoid'))
model.compile(optimizer='sgd', loss=mse, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3000, batch_size=16, verbose=False)
In [96]:
K.clear_session()
model = Sequential()
model.add(Dense(input_dim=num_of_features, units=50, activation='relu'))
model.add(Dropout(rate=0.1))
model.add(Dense(units=25, activation='relu'))
model.add(Dropout(rate=0.7))
model.add(Dense(units=output_size, activation='sigmoid'))
model.add(Dropout(rate=0.3))
model.compile(optimizer='sgd', loss=mse, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3000, batch_size=16, verbose=False)
model = Sequential()
model.add(Dense(input_dim=num_of_features, units=50, activation='relu'))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(units=output_size, activation='sigmoid'))
model.compile(optimizer='sgd', loss=mse, metrics=['accuracy'])
model.fit( \
x_train, y_train, \
epochs=3000, \
batch_size=16, \
verbose=False, \
callbacks=[EarlyStopping(monitor='loss', patience=5)])
In [98]:
K.clear_session()
model = Sequential()
model.add(Dense(input_dim=num_of_features, units=50, activation='relu'))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(units=output_size, activation='sigmoid'))
model.compile(optimizer=SGD(clipvalue=0.2), loss=mse, metrics=['accuracy'])
model.fit( \
x_train, y_train, \
epochs=3000, \
batch_size=16, \
verbose=False, \
callbacks=[EarlyStopping(monitor='loss', patience=5)])
maxlen = 500
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
Napisati funkciju koja kreira model rekurentne neuronske mreže koja zadovo-
ljava naredni prikaz
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_2 (Embedding) (None, None, 32) 320000
_________________________________________________________________
simple_rnn_2 (SimpleRNN) (None, 32) 2080
_________________________________________________________________
dense_2 (Dense) (None, 1) 33
=================================================================
Total params: 322,113
GLAVA 5. NEURONSKE MREŽE 48
model.add(Embedding(input_dim=input_dim, output_dim=32))
model.add(SimpleRNN(units=32, activation='tanh'))
model.add(Dense(units=1, activation='softmax'))
return model
model = build_model(max_features, 1)
model.compile(optimizer='rmsprop', loss=binary_crossentropy, \
metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=5, batch_size=128, \
validation_split=0.2)
print(model.evaluate(x_test, y_test))
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.plot(epochs, loss, label='training_loss', c='blue')
plt.plot(epochs, val_loss, label='validation_loss', c='red')
plt.legend(loc='best')
plt.show()
acc = history.history['acc']
val_acc = history.history['val_acc']
plt.plot(epochs, acc, label='training_acc', c='blue')
plt.plot(epochs, val_acc, label='validation_acc', c='red')
plt.legend(loc='best')
plt.show()
Zadatak 5.14. Uraditi zadatak 5.13, ali koristiti jedinicu duge kratkoročne memo-
rije, i sigmoidnu funkciju kao aktivacionu funkciju poslednjeg sloja.
In [102]:
K.clear_session()
model = Sequential()
model.add(Embedding(input_dim=max_features, output_dim=32))
model.add(LSTM(32))
GLAVA 5. NEURONSKE MREŽE 49
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', \
metrics=['accuracy'])
epochs = history.epoch
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.plot(epochs, loss, label='training_loss', c='blue')
plt.plot(epochs, val_loss, label='validation_loss', c='red')
plt.legend(loc='best')
plt.show()
acc = history.history['acc']
val_acc = history.history['val_acc']
plt.plot(epochs, acc, label='training_acc', c='blue')
plt.plot(epochs, val_acc, label='validation_acc', c='red')
plt.legend(loc='best')
plt.show()
all_lines = data.split('\n')
header = all_lines[0]
headers = header.split(',')
lines = all_lines[1:]
num_of_rows = len(lines)
num_of_columns = len(headers)-1
temp = float_data[:, 1]
plt.plot(range(len(lines)), temp)
GLAVA 5. NEURONSKE MREŽE 50
In [104]:
def generator(data, min_index, max_index, lookback, delay, step=6, \
shuffle=True, batch_size=128):
# Moramo da se postaramo da je najveci indeks za podatke
# dovoljno udaljen od kraja, da bismo mogli da
# obucavamo model i za poslednjih delay merenja
if max_index is None:
max_index = len(data)-delay-1
while True:
# Biramo...
if shuffle:
# ... ili nasumicnih batch_size merenja
rows = np.random.randint(low=i, high=max_index, size=batch_size)
else:
# ... ili prvih batch_size merenja
# (osim ako ih nema nedovoljno), pa vrsimo odsecanje
rows = range(i, np.min(i+batch_size, max_index))
i += rows
test_steps = len(float_data)-300001-lookback
val_steps = 300000-200001-lookback
model.summary()
3
Napomenimo da je proces obučavanja značajno duži nego svi prethodni primeri — za jednu epo-
hu obučavanje može da traje i do 20 minuta! Naravno, u poređenju sa nekim primerima iz prakse, i
ovaj vremenski period može delovati kao niska vrednost, ali svakako treba dati na njegovom značaju u
kontekstu ove skripte.
GLAVA 5. NEURONSKE MREŽE 52
def combine_date_and_hour(row):
date = pd.to_datetime(row['Date'])
hour = pd.Timedelta('{0} hours'.format(row['Hour']))
return date+hour
plt.plot(train_data)
plt.plot(test_data)
plt.show()
offset = 10000
scale = 5000
train_data = (train_data-offset)/scale
test_data = (test_data-offset)/scale
plt.plot(train_data)
plt.plot(test_data)
plt.show()
_________________________________________________________________
GLAVA 5. NEURONSKE MREŽE 53
num_of_features = 1
output_size = 1
model = Sequential()
model.add(Dense(input_dim=num_of_features, units=24, activation='relu'))
model.add(Dense(units=12, activation='relu'))
model.add(Dense(units=6, activation='relu'))
model.add(Dense(units=output_size))
model.summary()
model.compile(optimizer='adam', loss=mse)
history = model.fit(train_data, y_train, batch_size=512, epochs=200, \
verbose=False)
y_pred = model.predict(test_data)
print(metrics.mean_squared_error(y_test, y_pred))
print(metrics.r2_score(y_test, y_pred))
Ispitati kako se ponaša rekurentna neuronska mreža koja koristi SimpleRNN ne-
urone u prvom sloju (ukupno njih 6), a zatim jedan gusti sloj. Funkcija koja se
minimizuje je srednjekvadratna greška, a kao optimizator se može koristiti ADAM
sa korakom učenja 0.0005. Voditi računa o tome da ulaz u SimpleRNN čvor mora biti
tenzor oblika ,,3D tensor with shape (batch_size, timesteps, input_dim)''. Za broj
GLAVA 5. NEURONSKE MREŽE 54
model2 = Sequential()
model2.add(SimpleRNN(batch_input_shape=(1,1,1), units=6, \
kernel_initializer='ones', stateful=True))
model2.add(Dense(units=output_size, activation='relu'))
model2.compile(optimizer=Adam(lr=0.0005), loss=mse)
model2.summary()
y_train_t = y_train[:]
y_test_t = y_test[:]
print(metrics.mean_squared_error(y_test_t, y_pred))
print(metrics.r2_score(y_test_t, y_pred))
model3 = Sequential()
model3.add(LSTM(batch_input_shape=(1,1,1), units=6, \
kernel_initializer='ones', stateful=True))
model3.add(Dense(units=output_size))
model3.compile(optimizer=Adam(lr=0.0005), loss=mse)
model3.summary()
print(metrics.mean_squared_error(y_test_t, y_pred))
print(metrics.r2_score(y_test_t, y_pred))
Glava 6
Učenje potkrepljivanjem
In [112]:
import numpy as np
from matplotlib import pyplot as plt
import gym
Zadatak 6.1. Jedno od okruženja koje postoji u OpenIA Gym biblioteci je 'NChain-v0'
okruženje u kojem se agent kreće kroz linearni lanac stanja. Dostupne su dve akci-
je: 0, tj. akcija pomeraja unapred za nagradom nula i 1, tj. akcija pomeraja nazad
na početno stanje koje ima malu nagradu. Na kraju lanca se nalazi velika nagra-
da i prelaskom u to stanje se može osvojiti ta nagrada. Takođe, pri svakom stanju
postoji mala verovatnoća da se agent ,,oklizne'' i da preduzme suprotnu akciju.
Učitati opisano okruženje, a zatim napisati funkciju koja koristeći naivni pohlep-
ni pristup pronalazi optimalnu politiku, odnosno, preslikavanje stanja u akcije koje
vodi maksimalnoj (ili, u praksi, dovoljno visokoj) dugoročnoj nagradi. Broj epizoda
postaviti na 100.
In [113]:
env = gym.make('NChain-v0')
55
GLAVA 6. UČENJE POTKREPLJIVANJEM 56
else:
# Inace, biramo akciju sa najvecom dobiti
a = np.argmax(r_table[s, :])
return r_table
naive_result = naive_sum_reward_table(env)
print(naive_result)
s = s_new
return q_table
GLAVA 6. UČENJE POTKREPLJIVANJEM 57
q_result = q_learning(env)
print(q_result)
s = s_new
return eps_q_table
eps_q_table = eps_q_learning(env)
print(eps_q_table)
Zadatak 6.4. Učitati okruženje iz zadatka 6.1. Korišćenjem dubokog Q-learning al-
goritma, uz mogućnost eksperimentisanja (prelaska u nasumično stanje) od strane
agenta, u toku od 100 epizoda naučiti optimalnu politiku. Kon gurisati neuronsku
mrežu sa propagacijom unapred na osnovu narednog prikaza
GLAVA 6. UČENJE POTKREPLJIVANJEM 58
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (1, 10) 60
_________________________________________________________________
dense_2 (Dense) (1, 2) 22
=================================================================
Total params: 82
Trainable params: 82
Non-trainable params: 0
_________________________________________________________________
if verbose_summary:
model.summary()
return model
if plot_learning:
# U ovu listu smestamo prosecne vrednosti nagrade
# na nivou jedne epizode
r_avg_list = []
for i in range(number_of_episodes):
s = env.reset()
done = False
eps *= decay_factor
GLAVA 6. UČENJE POTKREPLJIVANJEM 59
if plot_learning:
r_sum = 0
target = r + gamma*np.max(s_new_prediction)
s_prediction[0][a] = target
s = s_new
if plot_learning:
r_sum += r
if plot_learning:
r_avg_list.append(r_sum / 1000)
plt.plot(range(number_of_episodes), r_avg_list)
for i in range(number_of_states):
state = to_categorical(i, num_classes=number_of_states). \
reshape(batch_input_shape)
nn_qi = model.predict(state)
nn_table[i, :] = nn_qi
return nn_table
Zadatak 6.5. Učitati okruženje iz zadatka 6.1. Napisati funkciju koja na osno-
vu okruženja i tabele koja predstavlja optimalnu politiku računa ukupnu nagradu
ostvarenu ukoliko se prati tabela tokom prelaska između stanja.
In [118]:
def run_game(env, table):
s = env.reset()
total_reward = 0
GLAVA 6. UČENJE POTKREPLJIVANJEM 60
done = False
return total_reward
Napisati funkciju koja testira funkcije iz zadataka 6.1 — 6.4, tako što pokreće
svaku strategiju number_of_iterations puta, računa ukupne nagrade i izračunava
koja je strategija najviše puta pobedila. Strategiju koja koristi neuronsku mrežu
obučiti samo u prvoj iteraciji i zatim je nadalje koristiti. Koristeći napisanu funkciju,
testirati strategije na 10 epizoda i 40 iteracija. Da li se rezultati opisanog ,,turnira''
menjaju ukoliko se postavi broj epizoda na 100?
In [119]:
def test_methods(env, number_of_episodes=100, number_of_iterations=100):
winners = np.zeros(4)
for i in range(number_of_iterations):
naive_table = naive_sum_reward_table(env, number_of_episodes)
q_table = q_learning(env, number_of_episodes)
eps_q_table = eps_q_learning(env, number_of_episodes)
if i == 0:
nn_table = deep_q_learning(env, number_of_episodes)
winners[w] += 1
return winners
Zadatak 6.6. Jedno od okruženja koje postoji u OpenIA Gym biblioteci je 'Taxi-v2'
okruženje u kojem je cilj maksimizovati nagradu koja se dobija preuzimanjem put-
nika i njihovim prevoženjem na 4 različite lokacije. Za svakog prevezenog putnika
se dobija nagrada od 20 poena, a za svaki korak transfera se gubi 1 poen. Takođe,
postoji penal od 10 poena za svako nepropisno preuzimanje ili ostavljanje putnika.
Korišćenjem Q-learning algoritma naučiti optimalno kretanje taksija. Za vrednost
koraka učenja uzeti 0.8, a za metaparametar umanjenja uzeti vrednost 0.95.
In [120]:
env = gym.make('Taxi-v2')
if plot_learning:
rewards_progress = {}
if plot_learning:
rewards_progress[episode].append(rewards_progress[episode][i] + r)
s = s_new
i += 1
if plot_learning:
rewards = []
for i in rewards_progress.keys():
rewards.append(rewards_progress[i][-1])
if plot_last_n_episodes is None:
plt.plot(rewards)
else:
plt.plot(rewards[-plot_last_n_episodes:])
return q_table
Zadatak 6.7. Jedno od okruženja koje postoji u OpenIA Gym biblioteci je 'CartPole-v0'
okruženje u kojem je cilj maksimizovati nagradu koja se dobija balansiranjem isprav-
nog štapa na kolicima. Kolica se pomeraju duž horizontalne ose. Pri svakoj vre-
menskoj odrednici možemo da dobijemo informaciju o njihovoj poziciji x, brzini x′ ,
nagnutosti štapa theta i ugaonoj brzini theta′ . U svakom stanju, kolica imaju dve
moguće akcije: pomeriti se levo i pomeriti se desno. U ovakvom okruženju, nagra-
da se dobija sve dok je štap donekle uspravan i kolica su u okviru granica. Epizoda
je završena čim se štap nagne ispod određenog ugla ili kolica se pomere izvan gra-
nica. Problem se smatra rešenim kada štap stoji uspravno preko 195 vremenskih
odrednica i to 100 puta zaredom. Korišćenjem Q-learning algoritma naučiti opti-
malno kretanje taksija. Za vrednost koraka učenja uzeti 0.8, a za metaparametar
umanjenja uzeti vrednost 0.95. Obezbediti da na početku agent eksperimentiše sa
verovatnoćom 0.5, a da se pri svakoj epizodi ova verovatnoća smanjuje faktorom
opadanja 0.999.
GLAVA 6. UČENJE POTKREPLJIVANJEM 62
In [121]:
env = gym.make('CartPole-v0')
def state_to_bucket(state):
bucket_indice = []
for i in range(len(state)):
if state[i] <= STATE_BOUNDS[i][0]:
bucket_index = 0
elif state[i] >= STATE_BOUNDS[i][1]:
bucket_index = NUM_BUCKETS[i] - 1
else:
# Mapping the state bounds to the bucket array
bound_width = STATE_BOUNDS[i][1] - STATE_BOUNDS[i][0]
offset = (NUM_BUCKETS[i]-1)*STATE_BOUNDS[i][0]/bound_width
scaling = (NUM_BUCKETS[i]-1)/bound_width
bucket_index = int(round(scaling*state[i] - offset))
bucket_indice.append(bucket_index)
return tuple(bucket_indice)
def get_learning_rate(t):
return max(MIN_LEARNING_RATE, min(0.5, 1.0 - np.log10((t+1)/25)))
def get_explore_rate(t):
return max(MIN_EXPLORE_RATE, min(1, 1.0 - np.log10((t+1)/25)))
return action
def simulate():
rewards_progress = {}
## Instantiating the learning related parameters
learning_rate = get_learning_rate(0)
explore_rate = get_explore_rate(0)
discount_factor = 0.99 # since the world is unchanging
num_streaks = 0
for t in range(MAX_T):
#env.render()
# Select an action
action = select_action(state_0, explore_rate)
rewards_progress[episode].append(rewards_progress[episode][t] + reward)
if done:
print("Episode %d finished after %f time steps" % (episode, t))
if (t >= SOLVED_T):
num_streaks += 1
else:
num_streaks = 0
break
# It's considered done when it's solved over 120 times consecutively
if num_streaks > STREAK_TO_END:
break
# Update parameters
explore_rate = get_explore_rate(episode)
learning_rate = get_learning_rate(episode)
GLAVA 6. UČENJE POTKREPLJIVANJEM 64
rewards = []
for i in rewards_progress.keys():
rewards.append(rewards_progress[i][-1])
plt.plot(rewards)
simulate()
Literatura
65