Почему сеть дает одинаковые результаты для каждого входа в тесте? - PullRequest
0 голосов
/ 10 июня 2018

Моя сеть транспонирует изображение размером 62 * 71 в вектор из 124 выходов.В тесте я получил одинаковый вывод для каждого входа.Я проверил 4000 случаев.

Кажется, я не могу обозначить проблему, потому что обучение кажется хорошим, ошибка улучшается и появляется относительно низкая ошибка.

Кто-то, возможно, знает, чтоэто проблема?

#load data
data_in= np.transpose(np.loadtxt("images_in_10000.csv", delimiter=',',dtype=np.float32))
data_out= np.transpose(np.loadtxt("out_to_image_10000.csv", delimiter=',',dtype=np.float32))

x_train = data_in[0:6000, :]
x_test = data_in[6000:10001,:]
y_train = data_out[0:6000, :]
y_test = data_out[6000:10001, :]

#parametersa
batch=100
epochs=7
learning_rate=0.01

n = x_test.shape[1] #4392
m = x_train.shape[0] #6000
d = y_test.shape[1]  #124
l = y_test.shape[0]     #4000

trainX = tf.placeholder(tf.float32, [batch, n])
trainY = tf.placeholder(tf.float32, [batch, d])
testX = tf.placeholder(tf.float32, [l, n])
testY = tf.placeholder(tf.float32, [l, d])

W_c1= tf.Variable(tf.random_normal([5, 5, 1, 32]))
W_c2= tf.Variable(tf.random_normal([5, 5, 32, 64]))
W_fc= tf.Variable(tf.random_normal([18 * 16 * 64, 128]))
W_out= tf.Variable(tf.random_normal([128, d]))

b_c1= tf.Variable(tf.random_normal([32]))
b_c2=tf.Variable(tf.random_normal([64]))
b_fc=tf.Variable(tf.random_normal([128]))
b_out=tf.Variable(tf.random_normal([d]))

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def maxpool2d(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

def convolutional_neural_network(x):

    x = tf.reshape(x, shape=[-1,61,72, 1])

    conv1 = tf.nn.relu(conv2d(x, W_c1) + b_c1)
    conv1 = maxpool2d(conv1)

    conv2 = tf.nn.relu(conv2d(conv1, W_c2) + b_c2)
    conv2 = maxpool2d(conv2)

    fc = tf.reshape(conv2, [-1, 18 * 16 * 64])
    fc = tf.nn.relu(tf.matmul(fc, W_fc) + b_fc)

    output = tf.matmul(fc, W_out) + b_out

    return output

   prediction = convolutional_neural_network(trainX)
   cost =tf.reduce_mean(tf.pow(prediction-trainY,2))
   optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)

prediction_t = convolutional_neural_network(testX)
losstest = tf.reduce_mean(tf.pow(prediction_t - testY, 2))

k=0
a = np.linspace(0, m - batch, m / batch, dtype=np.int32)
costshow = [0] * (len(a) * epochs)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for epoch in range(epochs):
        epoch_loss = 0
        for i in (np.linspace(0,m - batch, m / batch, dtype=np.int32)):
            x = x_train[i:i + batch, :]
            y = y_train[i:i + batch, :]
            sess.run(optimizer, feed_dict={trainX: x, trainY: y})
            cost_val = sess.run(cost, feed_dict={trainX: x, trainY: y})
            costshow[k]=cost_val
            print("Epoch=", '%04d' % (epoch + 1), "loss=", " {:.9f}".format(cost_val))
            k = k + 1

    print("finsh train-small ")
    result = sess.run(prediction_t, feed_dict={testX: x_test})
    test_loss = sess.run(losstest, feed_dict={testX: np.asarray(x_test), testY: np.asarray(y_test)})
    print("Testing loss=", test_loss)

1 Ответ

0 голосов
/ 10 июня 2018

Метрика за рисунком четко определена.Значения изображения часто колеблются от 0-1 или 0-255.Для CNN вы должны нормализовать свои входные значения (0-1).

Таким образом, вы должны быть осторожны с инициализацией веса.Например, если у вас есть смещение 0,6 и значение 0,6, вы получаете 1,2 в качестве значения изображения, и ваша программа построения графиков считает, что вы находитесь в диапазоне 0-255, и все черное.

Поэтому попробуйтеиспользуйте инициализатор glorot для весов и инициализатор нуля для инициализатора смещения:

Веса:

tf.get_variable("weight", shape=[5, 5, 1, 32], initializer=tf.glorot_uniform_initializer())

Смещение:

tf.get_variable("bias", shape=[32], initializer=tf.zeros_initializer())

Кроме того, tf.Variabelустарела.Лучше использовать tf.get_variable.

...