В моем наборе данных 3000000 образцов. Каждый образец имеет 102 значения. Первые 101 значения находятся в диапазоне от 0 до 1. Последнее значение варьируется от нескольких сотен до тысяч. Я написал глубокую нейронную сеть, которая принимает первые 101 значение в качестве входных данных и возвращает последнее в качестве выходного значения. Я разделил свои данные на мини-пакеты с каждой партией размером 30. Я использовал 3 скрытых слоя с tanh в качестве функции активации. Я использовал показатель обучения со значением 0,0001 и MSE в качестве функции стоимости.
Значение функции стоимости уменьшается с 2491723,839 до 47836,267 в первые 100 эпох, а затем остается постоянным.
Я не могу понять, где я совершил ошибку.
PS - У меня очень старый рабочий стол (7-8 лет), и на его вычисление уходит много времени (500 эпох за 24 часа). Я прилагаю свой код ниже.
Спасибо
n_x=X_train.shape[0]
m=X_train.shape[1]
n_y=Y_train.shape[0]
costs=[]
X=tf.placeholder(tf.float32,[n_x,None],name="X")
Y=tf.placeholder(tf.float32,[n_y,None],name="Y")
parameters=init_par(layer_dims)
A=forward(X,parameters,layer_dims)
cost=cost_fn(A,Y,minibatch_size)
otz=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(num_epochs):
epoch_cost=0.
num_minibatches=int(m/minibatch_size)
minibatches=random_mini_batches(X_train,Y_train,minibatch_size)
for minibatch in minibatches:
(minibatch_X,minibatch_Y)=minibatch
_,minibatch_cost = sess.run([otz,cost], feed_dict={X:minibatch_X,Y:minibatch_Y})
epoch_cost+=minibatch_cost/num_minibatches
if print_cost == True and epoch % 100 == 0:
print ("Cost after epoch %i: %f" % (epoch, epoch_cost))
if print_cost == True and epoch % 5 == 0:
costs.append(epoch_cost)
plt.plot(np.squeeze(costs))
plt.ylabel('cost')
plt.xlabel('iterations (per tens)')
plt.title("Learning rate =" + str(learning_rate))
plt.show()
parameters=sess.run(parameters)
print("TRAINED!!")
print("Train Accuracy : ", cost.eval({X: X_train, Y: Y_train}))
Функция стоимости:
def cost_fn(A,Y,minibatch_size):
loss=tf.pow((A-Y),2)
cost=tf.reduce_sum(loss)/minibatch_size
return cost
Init_par это:
def init_par(layer_dims):
L=len(layer_dims)
parameters={}
for l in range(1,L):
parameters["W"+str(l)]=tf.get_variable("W"+str(l),[layer_dims[l],layer_dims[l-1]],initializer=tf.contrib.layers.xavier_initializer())
parameters["b"+str(l)]=tf.get_variable("b"+str(l),[layer_dims[l],1],initializer=tf.zeros_initializer())
return parameters
Форвард:
def forward(X,parameters,layer_dims):
outputs={}
outputs["A0"]=X
L=len(layer_dims)
for l in range(1,L-1):
outputs["Z"+str(l)] =tf.add(tf.matmul(parameters["W"+str(l)],outputs["A"+str(l-1)]),parameters["b"+str(l)])
outputs["A"+str(l)]=tf.nn.tanh(outputs["Z"+str(l)])
outputs["Z"+str(L-1)]=tf.add(tf.matmul(parameters["W"+str(L-1)],outputs["A"+str(L-2)]),parameters["b"+str(L-1)])
outputs["A"+str(L-1)] =tf.nn.relu(outputs["Z"+str(L-1)])
return outputs["A"+str(L-1)]