2017-03-27 5 views
2

다음 코드가 있으며 모델을 저장하려고 할 때 오류가 발생합니다. 무엇이 잘못 될 수 있으며 어떻게이 문제를 해결할 수 있습니까?Tensorflow - 모델 저장

import tensorflow as tf 

data, labels = cifar_tools.read_data('C:\\Users\\abc\\Desktop\\Testing') 

x = tf.placeholder(tf.float32, [None, 150 * 150]) 
y = tf.placeholder(tf.float32, [None, 2]) 

w1 = tf.Variable(tf.random_normal([5, 5, 1, 64])) 
b1 = tf.Variable(tf.random_normal([64])) 

w2 = tf.Variable(tf.random_normal([5, 5, 64, 64])) 
b2 = tf.Variable(tf.random_normal([64])) 

w3 = tf.Variable(tf.random_normal([38*38*64, 1024])) 
b3 = tf.Variable(tf.random_normal([1024])) 

w_out = tf.Variable(tf.random_normal([1024, 2])) 
b_out = tf.Variable(tf.random_normal([2])) 

def conv_layer(x,w,b): 
    conv = tf.nn.conv2d(x,w,strides=[1,1,1,1], padding = 'SAME') 
    conv_with_b = tf.nn.bias_add(conv,b) 
    conv_out = tf.nn.relu(conv_with_b) 
    return conv_out 

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

def model(): 
    x_reshaped = tf.reshape(x, shape=[-1, 150, 150, 1]) 

    conv_out1 = conv_layer(x_reshaped, w1, b1) 
    maxpool_out1 = maxpool_layer(conv_out1) 
    norm1 = tf.nn.lrn(maxpool_out1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) 
    conv_out2 = conv_layer(norm1, w2, b2) 
    norm2 = tf.nn.lrn(conv_out2, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) 
    maxpool_out2 = maxpool_layer(norm2) 

    maxpool_reshaped = tf.reshape(maxpool_out2, [-1, w3.get_shape().as_list()[0]]) 
    local = tf.add(tf.matmul(maxpool_reshaped, w3), b3) 
    local_out = tf.nn.relu(local) 

    out = tf.add(tf.matmul(local_out, w_out), b_out) 
    return out 

model_op = model() 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(model_op, y)) 
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost) 

correct_pred = tf.equal(tf.argmax(model_op, 1), tf.argmax(y,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32)) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    onehot_labels = tf.one_hot(labels, 2, on_value=1.,off_value=0.,axis=-1) 
    onehot_vals = sess.run(onehot_labels) 
    batch_size = 1 
    saver = tf.train.Saver() 
    saved_path = saver.save(sess, 'mymodel') 
    print("The model is in this file: ", saved_path) 


for j in range(0, 5): 
    print('EPOCH', j) 
    for i in range(0, len(data), batch_size): 
     batch_data = data[i:i+batch_size, :] 
     batch_onehot_vals = onehot_vals[i:i+batch_size, :] 
     _, accuracy_val = sess.run([train_op, accuracy], feed_dict={x: batch_data, y: batch_onehot_vals}) 
     print(i, accuracy_val) 

    print('DONE WITH EPOCH') 

은 EDIT-1

Traceback (most recent call last): 
    File "cnn.py", line 67, in <module> 
    save_path = saver.save(sess, 'mymodel') 
    File "C:\Python35\lib\site-packages\tensorflow\python\training\saver.py", line 1314, in save 
    "Parent directory of {} doesn't exist, can't save.".format(save_path)) 
ValueError: Parent directory of mymodel doesn't exist, can't save. 

감사합니다 :-) 나는 데 오류 상태로 잊어 버렸습니다.

+0

어떤 종류의 오류가 발생합니까? – etarion

+0

또한, 물건을 계산하기 시작한 후에는 ops를 추가하지 않아야합니다. 따라서 세션을 여는 행 위에 'onehot_labels'및 'saver'를 이동하십시오. – etarion

+0

세 번째 주석 (보호기 관련 문제는 발생하지 않으므로 답변이 아니지만 버그입니다.) - 마지막 코드 블록에서 닫은 후에'sess'를 사용하고 있습니다 (외부에 있음). 세션을 열 때 'with'블록). – etarion

답변

2

모델을 저장하려는 폴더가 존재하지 않는 것 같습니다 (현재 작업 디렉토리가 무엇인지 확인할 수 있음). 이러한 문제를 피하려면 절대 경로를 사용하고 저장하기 전에 다음과 같이하십시오.

save_path = ... 
if not os.path.exists(save_path): 
    os.makedirs(save_path) 
... 
saver = tf.train.Saver() 
with tf.Session() as sess: 
    ... 
    saved_path = saver.save(sess, os.path.join(save_path, 'my_model') 
    print("The model is in this file: ", saved_path)