2017-07-05 11 views
4

私はむしろテンソルフローを初めて使用しており、さまざまな複雑さのモデルを試しています。私は、パッケージの保存機能と復元機能に問題があります。私がチュートリアルを理解している限り、私は訓練されたグラフを復元し、後でいくつかの新しい入力でそれを実行できるはずです。私はちょうどその:テンソルフロー内の可変入力長で訓練したモデルをInvalidArgumentErrorに復元する

InvalidArgumentError(トレースバックについては上記参照)を実行しようとする場合しかし、私は次のエラーを取得する:形状を[-1,10-]が負の寸法を有する [[ノード:プレースホルダ= Placeholderdtype = DT_FLOAT 、形状= [?10]、_device = "/ジョブ:ローカルホスト/レプリカ:0 /タスク:0/CPU:0"]]

メッセージの私の理解は、復元されたグラフが好きではないされていること1つの次元を任意のままにすることができます。これは、入力がどれだけ大きくなるかを事前に知ることができない実際的な場合に必要です。上記のエラーを引き起こす最小限の例としてのコードスニペットを以下に示します。私は個々のテンソルを個別に復元する方法を知っていますが、モデルが複雑になるとかなり早く実用的になりません。私の質問が愚かな場合には、私が得た助けに感謝し、謝罪します。

import numpy as np 
import tensorflow as tf 

def generate_random_input(): 
    alist = [] 
    for _ in range(10): 
     alist.append(np.random.uniform(-1, 1, 100)) 
    return np.array(alist).T 
def generate_random_target(): 
    return np.random.uniform(-1, 1, 100) 

x = tf.placeholder('float', [None, 10]) 
y = tf.placeholder('float') 

# the model 
w1 = tf.get_variable('w1', [10, 1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 
b1 = tf.get_variable('b1', [1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 

result = tf.add(tf.matmul(x, w1), b1, name='result') 

loss = tf.reduce_mean(tf.losses.mean_squared_error(predictions=result, labels=y)) 
optimizer = tf.train.AdamOptimizer(0.03).minimize(loss) 
saver = tf.train.Saver() 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    sess.run([optimizer, loss], feed_dict={x: generate_random_input(), y: generate_random_target()}) 
    saver.save(sess, 'file_name') 

# now load the model in another session: 
sess2 = tf.Session() 
saver = tf.train.import_meta_graph('file_name.meta') 
saver.restore(sess2, tf.train.latest_checkpoint('./')) 
graph = tf.get_default_graph() 
pred = graph.get_operation_by_name('result') 
test_result = sess2.run(pred, feed_dict={x: generate_random_input()}) 
+0

テンソルフローの問題かもしれません。セーバーの方法をチェックするか、セーバーを削除してみてください。試してみてください。 – jowett

答えて

0

最後の行では、label_palceholderにデータをフィードする必要はありません。したがって、プレースホルダでは、バッチサイズ以外の[-1]ディメンションは-1です。それが原因です。

+0

ありがとうございました。残念ながら、私はそれを正しく理解していないか、それが役に立たない。ラベルプレースホルダにもフィードしようとしましたが、同じエラーが発生します。さらに、結果として入力(x)と復元されたテンソル(w1、b1)だけが引数として取られるので、違いはありません。 –

0

私はまったく同じ問題を抱えています。私はさまざまなレイヤーサイズのさまざまなCNNをインポートしてテストし、さまざまなデータセットでテストしています。あなたはそうのような機能であなたのモデル作成を固執して、他のコードでそれを再作成することができます

def create_model(): 
    x = tf.placeholder('float', [None, 10]) 
    y = tf.placeholder('float') 
    w1 = tf.get_variable('w1', [10, 1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 
    b1 = tf.get_variable('b1', [1], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer(seed=1)) 
    result = tf.add(tf.matmul(x, w1), b1, name='result') 
    return x, y, result 

x, y, result = create_model() 
loss = tf.reduce_mean(tf.losses.mean_squared_error(predictions=result, labels=y)) 
optimizer = tf.train.AdamOptimizer(0.03).minimize(loss) 
saver = tf.train.Saver() 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    sess.run([optimizer, loss], feed_dict={x: generate_random_input(), y: generate_random_target()}) 
    saver.save(sess, 'file_name') 

# now load the model in another session: 
sess2 = tf.Session() 
# This stuff is optional if everything is the same scope 
x, y, result = create_model() 
saver = tf.train.Saver() 
# loss = ... if you want loss 
# Now just restore the weights and run 
saver.restore(sess, 'file_name') 
test_result = sess2.run(pred, feed_dict={x: generate_random_input()}) 

私は別の次元で、多くの複雑なアーキテクチャをインポートする場合、これは少し面倒です。私たちの状況では、モデル全体を復元する他の方法があるかどうかはわかりませんが、第2セッションで最初にアーキテクチャを再作成するよりもそうです。

関連する問題