>

작동하지 않는 간단한 TensorFlow 프로그램을 작성했습니다. 해결하려는 문제가 있습니다. x가 입력으로 주어지면 x가<0, 0.33>또는<0.66, 1.0>간격이면 0.0 값을 반환하고 x가 (0.33, 0.66) 간격이면 1.0 값을 반환하는 함수를 대략적으로 평가하고 싶습니다.

코드는 다음과 같습니다.

import tensorflow as tf
import numpy
import scipy

# input and output
x = tf.placeholder(tf.float32, shape=[None, 1])
y_true = tf.placeholder(tf.float32, shape=[None, 1])

# vars
weights = tf.Variable(tf.zeros([1, 1]))
biases = tf.Variable(tf.zeros([1]))

logits = tf.matmul(x, weights) + biases
y_pred = tf.nn.softmax(logits)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_true)
cost = tf.reduce_mean(cross_entropy)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

x_train = [ [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9] ]
y_train = [ [0.0], [0.0], [0.0], [1.0], [1.0], [1.0], [0.0], [0.0], [0.0] ]

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(100):
  sess.run(optimizer, {x: x_train, y_true: y_train})

we, bi = sess.run([weights, biases])
print("we: %s bi: %s"%(we, bi))
answer = sess.run(y_pred, feed_dict={x: x_train})
print(answer)

체중과 바이어스의 값은 훈련 후 명백한 잘못입니다. 첫 번째 반복 이후에도 모두 1이며 이후 변경되지 않습니다.

내가 작성한 코드는 숫자 인식에 사용 된 일부 코드를 기반으로하며 문제를 한 숫자/"픽셀"로 "최소화"할 것이라고 생각했습니다.

반복 횟수 또는 학습 속도를 변경하는 것 외에는 어떤 아이디어가 있습니까?

수정 : 그래서 아래 제안 된대로 시그 모이 드를 사용하고 더 많은 레이어를 사용하여 문제를 해결했습니다. 작동 코드는 다음과 같습니다.

import tensorflow as tf
import numpy

# consts
input_num_units = 1
hidden1_num_units = 8
hidden2_num_units = 16
output_num_units = 1

# input and output
x = tf.placeholder(tf.float32, shape=[None, 1])
y_true = tf.placeholder(tf.float32, shape=[None, 1])

# vars
weights = {
    'hidden1': tf.Variable(tf.random_normal([input_num_units, hidden1_num_units])),
    'hidden2': tf.Variable(tf.random_normal([hidden1_num_units, hidden2_num_units])),
    'output': tf.Variable(tf.random_normal([hidden2_num_units, output_num_units]))
}
biases = {
    'hidden1': tf.Variable(tf.random_normal([hidden1_num_units])),
    'hidden2': tf.Variable(tf.random_normal([hidden2_num_units])),
    'output': tf.Variable(tf.random_normal([output_num_units]))
}

hidden_layer_1 = tf.add(tf.matmul(x, weights['hidden1']), biases['hidden1'])
hidden_layer_1 = tf.nn.sigmoid(hidden_layer_1)
hidden_layer_2 = tf.add(tf.matmul(hidden_layer_1, weights['hidden2']), biases['hidden2'])
hidden_layer_2 = tf.nn.sigmoid(hidden_layer_2)
output_layer = tf.matmul(hidden_layer_2, weights['output']) + biases['output']
output_value = tf.nn.sigmoid(output_layer)
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output_layer, labels=y_true))
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)

x_train = [ [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9] ]
y_train = [ [0.75], [0.0], [0.0], [1.0], [0.5], [1.0], [0.0], [0.0], [0.0] ]

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10000):
  sess.run(optimizer, {x: x_train, y_true: y_train})

answer = sess.run(output_value, feed_dict={x: x_train})
print(answer)

모델이 제대로 작동하는지 확인하기 위해 실제로<0, 1>간격으로 전체 값 세트를 플로팅하고 네트워크를 통과 한 후 예상했던 것과 거의 비슷한 결과를 얻었습니다. 이것으로 뒤섞 일 수 있습니다. 예를 들어 반복 횟수가 많을수록 반복 횟수가 많을수록 기능이 더 "고정"하게된다는 것을 알았습니다.


  • 답변 # 1

    출력은 절대 변하지 않기 때문에 가중치는 변하지 않으며 항상 1.0입니다. 이것은 벡터 대신 단일 출력에 softmax를 적용하기 때문에 발생합니다. 이 경우에는 시그 모이 드 활성화를 사용해야합니다.

    softmax_cross_entropy_with_logits 만 교체하십시오   sigmoid_cross_entropy_with_logits 와 함께 . 또한 0이 아닌 값, 이상적인 작은 범위의 임의 값으로 가중치를 초기화해야합니다.

  • 이전 c# - HTML 페이지에서 WEB API 응답을 읽을 때 오류
  • 다음 svelte - 최상위 주사?