2016-11-15 5 views
0

私はTensorFlowの初心者ですが、それがどのように動作するか把握しようとしていますので、エラーが私のアーキテクチャやもっと基本的なものであれば、ここで私はsiameseニューラルネットワークを訓練しようとしています(左右の入力を同じ重みで左と右のNNに供給し、入力が類似している場合は小さな距離を持つ特徴ベクトルにマップしようとします。入力は異なります)。TensorFlow/TFLearnで部分的に既知のテンソルを変換できません

私が手にエラーが回帰ステップで発生

:私は最初のディメンションは、バッチサイズ(私はなら、私を修正するためのNoneする必要がある場合は、この問題を解決する方法がわからない

File "siamese.py", line 59, in <module> 
    network = regression(y_pred, optimizer='adam', 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/models/dnn.py", line 63, in __init__ 
    best_val_accuracy=best_val_accuracy) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/helpers/trainer.py", line 120, in __init__ 
    clip_gradients) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/helpers/trainer.py", line 646, in initialize_training_ops 
    ema_num_updates=self.training_steps) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/summaries.py", line 236, in add_loss_summaries 
    loss_averages_op = loss_averages.apply([loss] + other_losses) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/training/moving_averages.py", line 292, in apply 
    colocate_with_primary=(var.op.type == "Variable")) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/training/slot_creator.py", line 106, in create_zeros_slot 
    val = array_ops.zeros(primary.get_shape().as_list(), dtype=dtype) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/ops/array_ops.py", line 1071, in zeros 
    shape = ops.convert_to_tensor(shape, dtype=dtypes.int32, name="shape") 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 628, in convert_to_tensor 
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 198, in _tensor_shape_tensor_conversion_function 
    "Cannot convert a partially known TensorShape to a Tensor: %s" % s) 
ValueError: Cannot convert a partially known TensorShape to a Tensor: (?,) 

違う)。

コードの関連部分は以下の通りです:

BATCH_SIZE=100 
def contrastive_loss(y_pred, y_true, margin=1.0): 
    return tf.mul(1-y_true, tf.square(y_pred)) + tf.mul(y_true, tf.square(tf.maximum((margin-y_pred),0))) 

## Load dataset 
f = h5py.File('./data/paired_training_data.hdf','r') 
X1 = f["train_X1"] 
X2 = f["train_X2"] 
Y = f["train_Y_paired"] 

## Inputs: 1 example (phoneme pair), dropout probability 
inp_sound1 = input_data(shape=[None, 1, N_MFCC_CHANNELS, N_IN_CHANNELS]) 
networkL = conv_1d(inp_sound1, reuse=None, scope="conv1d") 
networkL = max_pool_1x6(networkL) 
networkL = fully_connected(networkL, n_units=N_FULLY_CONN, activation='relu', scope="fc1") 
networkL = dropout(networkL, .5) # unshared? 
networkL = fully_connected(networkL, n_units=N_FULLY_CONN, activation='relu', scope="fc2") 

inp_sound2 = input_data(shape=[None, 1, N_MFCC_CHANNELS, N_IN_CHANNELS]) 
networkR = conv_1d(inp_sound2, reuse=True, scope="conv1d") 
networkR = max_pool_1x6(networkR) 
networkR = fully_connected(networkR, n_units=N_FULLY_CONN, activation='relu', reuse=True, scope="fc1") 
networkR = dropout(networkR, .5) 
networkR = fully_connected(networkR, n_units=N_FULLY_CONN, activation='relu', reuse=True, scope="fc2") 

l2_loss = tf.reduce_sum(tf.square(tf.sub(networkL, networkR)), 1) 
y_pred = tf.sqrt(l2_loss) 
#y_true = input_data(shape=[None]) 

## Training 
network = regression(y_pred, optimizer='adam', 
      loss=contrastive_loss, learning_rate=0.0001, to_one_hot=False) 
model = tflearn.DNN(network, tensorboard_verbose=0) 
model.fit([X1, X2], Y, n_epoch=10, batch_size=BATCH_SIZE, show_metric=True, validation_set=0.1) 

すべてのヘルプ - 特に将来的には自分でこれらの問題をデバッグする方法を理解して - いただければ幸いです!

+0

私は 'リユース= true'を(または' false'を)に 'リユース= NONE'を変更することで開始します。あなたはどこでも 'BATCH_SIZE'を' None'に置き換えて 'BATCH_SIZE'を強制することができます**。 – sygi

+0

@sygi「conv1d」というスコープがまだ存在しないというエラーが出たので、最初のレイヤー 'reuse = None'を設定しました.2番目のレイヤーは' reuse = True'を持っています。これがまだ間違っているのかどうか教えてください。 – Jess

+0

また、 'None'を' BATCH_SIZE'に置き換えた場合、TFLearnは自動的に(https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py#L73) (私の4Dベクトルが5Dになるように、そしてそれからもうconvレイヤーでは動作しないように)。 – Jess

答えて

0

TensorFlowはあなたのcontrastive_lossの形を推測できないようです。事前にその出力形状を知っていれば、あなたのcontrastive_loss機能でset_shapeを呼び出すようにしてください:

def contrastive_loss(y_pred, y_true, margin=1.0): 
    loss = tf.mul(1-y_true, tf.square(y_pred)) + tf.mul(y_true, tf.square(tf.maximum((margin-y_pred),0))) 
    loss.set_shape([...]) 
    return loss 
+0

私は損失の形と 'y_pred'の形を' BATCH_SIZE、] 'に設定しようとしましたが、これは解決方法がわからないほどの不一致を引き起こします - Adam/ScalarSummary 'タグと値が同じ形状ではないというエラーを投げます:[]!= [100]'。 – Jess

+0

'y_pred'の形は[BATCH_SIZE]ではないと思います。そうでなければ、実際のデータの次元はありません。 – yuefengz

+0

申し訳ありませんが、どういう意味ですか?私はそれがちょうどBATCH_SIZEスカラー(0次元の数値)のベクトルであると仮定しますか? 'y_pred'は、左右のネットワークによって出力されるベクトルの間の距離である必要があります。 – Jess

関連する問題