Как исправить MatMul Op имеет тип float64, который не соответствует типу float32 TypeError?

Я пытаюсь сохранить веса Сети Nueral в файл, а затем восстановить эти веса, инициализируя сеть вместо случайной инициализации. Мой код отлично работает со случайной инициализацией. Но, когда я инициализирую веса из файла, он показывает мне ошибку 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!"

ошибка Подробности enter image description here

2 ответов


на tf.matmul() op не выполняет автоматическое преобразование типов, поэтому оба его входа должны иметь один и тот же тип элемента. Сообщение об ошибке, которое вы видите, указывает, что у вас есть вызов tf.matmul() где первый аргумент имеет тип tf.float32, и второй аргумент имеет тип tf.float64. Вы должны преобразовать один из входов в соответствии с другим, например, используя tf.cast(x, tf.float32).

глядя на ваш код, я не вижу нигде, что tf.float64 тензор явно создан (по умолчанию dtype для значений с плавающей запятой в API Python TensorFlow-например, для tf.constant(37.0) - is tf.float32). Я бы предположил, что ошибки вызваны np.loadtxt(filename) вызовы, которые могут загружать np.float64 массив. Вы можете явно изменить их на load np.float32 массивы (которые преобразуются в tf.float32 тензоров) следующим образом:

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

хотя это старый вопрос, но я хотел бы, чтобы вы включили, что я столкнулся с той же проблемой. Я решил это с помощью dtype=tf.float64 для инициализации параметров и для создания заполнителей X и Y, а также.

вот оснастка моего кода.

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 решит эту проблему.