Nueral Networkの重みをファイルに保存し、ランダムな初期化の代わりにネットワークを初期化してそれらの重みを復元しようとしています。私のコードはランダムな初期化で問題なく動作します。しかし、ファイルから重みを初期化すると、エラーが表示されますTypeError: Input 'b' of 'MatMul' Op has type float64 that does not match type float32 of argument 'a'.
この問題をどのように解決すればよいかわかりません。ここに私のコードがあります。
モデルの初期化
# 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!"
tf.matmul()
opは自動タイプ変換を実行しないため、両方の入力は同じ要素タイプでなければなりません。表示されているエラーメッセージは、最初の引数のタイプがtf.float32
で、2番目の引数のタイプがtf.float64
であるtf.matmul()
の呼び出しがあることを示しています。たとえば、 tf.cast(x, tf.float32)
を使用して、入力の一方を他方に一致するように変換する必要があります。
あなたのコードを見ると、tf.float64
テンソルが明示的に作成されていることがわかりません(TensorFlow Python APIの浮動小数点値のデフォルトのdtype
—たとえば、tf.constant(37.0)
の場合—tf.float32
)エラーは、np.float64
配列をロードしている可能性のあるnp.loadtxt(filename)
呼び出しが原因であると推測します。次のようにnp.float32
配列(tf.float32
テンソルに変換される)をロードするように明示的に変更します。
initial = np.loadtxt(filename).astype(np.float32)
古い質問ですが、同じ問題に出くわしたことを含めてください。パラメーターの初期化と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())
すべてのplacholdersおよびパラメーターをfloat64データ型で宣言すると、この問題は解決します。