2016-03-24 1 views
8

Nueral Networkの重みをファイルに保存してからランダム初期化の代わりにネットワークを初期化してそれらの重みを復元しようとしています。私のコードはランダムな初期化で正常に動作します。しかし、私は、ファイルからの重みを初期化するとき、私がこのissue.Hereが私のコードで解決しないのか分からない私にエラーTypeError: Input 'b' of 'MatMul' Op has type float64 that does not match type float32 of argument 'a'.を示している。MatMulを修正する方法は、浮動小数点型の型エラーと一致しない型float64を持っていますか?

モデルの初期化

# Parameters 
training_epochs = 5 
batch_size = 64 
display_step = 5 
batch = tf.Variable(0, trainable=False) 
regualarization = 0.008 

# Network Parameters 
n_hidden_1 = 300 # 1st layer num features 
n_hidden_2 = 250 # 2nd layer num features 

n_input = model.layer1_size # Vector input (sentence shape: 30*10) 
n_classes = 12 # Sentence Category detection total classes (0-11 categories) 

#History storing variables for plots 
loss_history = [] 
train_acc_history = [] 
val_acc_history = [] 

# tf Graph input 
x = tf.placeholder("float", [None, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

モデルパラメータ

#loading Weights 
def weight_variable(fan_in, fan_out, filename): 
    stddev = np.sqrt(2.0/fan_in) 
    if (filename == ""): 
     initial = tf.random_normal([fan_in,fan_out], stddev=stddev) 
    else: 
     initial = np.loadtxt(filename) 
    print initial.shape 
    return tf.Variable(initial) 

#loading Biases 
def bias_variable(shape, filename): 
    if (filename == ""): 
    initial = tf.constant(0.1, shape=shape) 
    else: 
    initial = np.loadtxt(filename) 
    print initial.shape 
    return tf.Variable(initial) 

# Create model 
def multilayer_perceptron(_X, _weights, _biases): 
    layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1'])) 
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2'])) 
    return tf.matmul(layer_2, weights['out']) + biases['out'] 

# Store layers weight & bias 
weights = { 
'h1': w2v_utils.weight_variable(n_input, n_hidden_1, filename="weights_h1.txt"), 
'h2': w2v_utils.weight_variable(n_hidden_1, n_hidden_2, filename="weights_h2.txt"), 
'out': w2v_utils.weight_variable(n_hidden_2, n_classes, filename="weights_out.txt") 
} 

biases = { 
'b1': w2v_utils.bias_variable([n_hidden_1], filename="biases_b1.txt"), 
'b2': w2v_utils.bias_variable([n_hidden_2], filename="biases_b2.txt"), 
'out': w2v_utils.bias_variable([n_classes], filename="biases_out.txt") 
} 

# Define loss and optimizer 
#learning rate 
# Optimizer: set up a variable that's incremented once per batch and 
# controls the learning rate decay. 
learning_rate = tf.train.exponential_decay(
    0.02*0.01,   # Base learning rate. #0.002 
    batch * batch_size, # Current index into the dataset. 
    X_train.shape[0], # Decay step. 
    0.96,    # Decay rate. 
    staircase=True) 


# Construct model 
pred = tf.nn.relu(multilayer_perceptron(x, weights, biases)) 

#L2 regularization 
l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()]) 

#Softmax loss 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) 

#Total_cost 
cost = cost+ (regualarization*0.5*l2_loss) 

# Adam Optimizer 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost,global_step=batch) 


# Add ops to save and restore all the variables. 
saver = tf.train.Saver() 

# Initializing the variables 
init = tf.initialize_all_variables() 

print "Network Initialized!" 

エラーの詳細 enter image description here

答えて

18

tf.matmul() opは、自動型変換を実行しないため、両方の入力の要素タイプが同じである必要があります。表示されているエラーメッセージは、tf.matmul()への呼び出しがあり、最初の引数にはタイプがtf.float32、2番目の引数にはタイプがtf.float64であることが示されています。 tf.cast(x, tf.float32)を使用して、入力の一方を他方に一致させる必要があります。

あなたのコードを見てみると、私はtf.float64テンソルが明示的に(例えばtf.constant(37.0) —ためTensorFlowのPython API —に浮動小数点値のためtf.float32をデフォルトdtypeです)が作成されていることをどこにも表示されません。私は、np.loadtxt(filename)呼び出しによってエラーが発生したと推測します。np.float64配列をロードしている可能性があります。次のように明示的に(tf.float32テンソルに変換されます)np.float32配列をロードするためにそれらを変更することができます。

initial = np.loadtxt(filename).astype(np.float32) 
+0

ありがとう:)コードは絶対に正しく動作しています... –

1

それは古い質問ですが、私はあなたが私は同じ問題に出くわしたことを含めたいと思いますが。パラメータの初期化とXとYのプレースホルダーの作成にもdtype=tf.float64を使用して解決しました。

ここに私のコードのスナップがあります。

X = tf.placeholder(shape=[n_x, None],dtype=tf.float64) 
Y = tf.placeholder(shape=[n_y, None],dtype=tf.float64) 

parameters['W' + str(l)] = tf.get_variable('W' + str(l), [layers_dims[l],layers_dims[l-1]],dtype=tf.float64, initializer = tf.contrib.layers.xavier_initializer(seed = 1)) 
parameters['b' + str(l)] = tf.get_variable('b' + str(l), [layers_dims[l],1],dtype=tf.float64, initializer = tf.zeros_initializer()) 

のfloat64データ型を持つすべてのplacholdersとパラメータは、この問題を解決します宣言。

関連する問題