如何修复MatMul Op类型float64与float32不匹配的TypeError错误?

我试图将神经网络的权重保存到文件中,然后通过初始化网络来恢复这些权重,而不是使用随机初始化。我的代码在随机初始化时运行正常。但是,当我从文件中初始化权重时,会显示一个错误TypeError: Input 'b' of 'MatMul' Op has type float64 that does not match type float32 of argument 'a'.我不知道如何解决这个问题。以下是我的代码:

模型初始化

# 参数
training_epochs = 5
batch_size = 64
display_step = 5
batch = tf.Variable(0, trainable=False)
regualarization =  0.008
# 网络参数
n_hidden_1 = 300 # 第一层特征数量
n_hidden_2 = 250 # 第二层特征数量
n_input = model.layer1_size # 向量输入(句子形状:30*10)
n_classes = 12 # 句子类别检测总类别(0-11类别)
# 用于绘图的历史记录变量
loss_history = []
train_acc_history = []
val_acc_history = []
# tf图形输入
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])

模型参数

# 加载权重
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)
# 加载偏置
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)
# 创建模型
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']  
# 存储层权重和偏置
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")}
# 定义损失和优化器
# 学习率
# 优化器:设置一个变量,每批次增加一次,并控制学习率衰减。
learning_rate = tf.train.exponential_decay(
    0.02*0.01,           # 基础学习率。 #0.002
    batch * batch_size,  # 当前数据集索引。
    X_train.shape[0],    # 衰减步长。
    0.96,                # 衰减率。
    staircase=True)
# 构建模型
pred = tf.nn.relu(multilayer_perceptron(x, weights, biases))
#L2正则化
l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()])
#Softmax损失
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) #总成本
cost = cost+ (regualarization*0.5*l2_loss)
# Adam优化器
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost,global_step=batch)
# 添加保存和恢复所有变量的操作。
saver = tf.train.Saver()
# 初始化变量
init = tf.initialize_all_variables()
print "网络已初始化!"

错误详情enter image description here


回答:

tf.matmul()操作不执行自动类型转换,因此它的两个输入必须具有相同的元素类型。你看到的错误消息表明你对tf.matmul()的调用中,第一个参数的类型为tf.float32,而第二个参数的类型为tf.float64。你必须将其中一个输入转换为与另一个匹配,例如使用tf.cast(x, tf.float32)

查看你的代码,我没有看到任何地方明确创建了tf.float64张量(TensorFlow Python API中浮点值的默认dtype——例如tf.constant(37.0)——是tf.float32)。我猜测错误是由np.loadtxt(filename)调用引起的,这些调用可能加载了np.float64数组。你可以明确地将它们更改为加载np.float32数组(这些数组将转换为tf.float32张量),如下所示:

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注