解決問題參考的這篇博客:https://blog.csdn.net/hnyzyty/article/details/84998061
最近做音頻識別的項目,想把音頻採集和識別分離開,所以使用ros結點進行封裝,在封裝的過程中遇到了這個問題,使用python文件執行是沒問題的,但是在封裝到ros回調函數中就報上面的錯誤了.
單獨執行這個文件是可以運行的.
import os
import tensorflow as tf
import numpy as np
#讀取txt文件中的特徵數據
def loadData(infile,k):
f=open(infile,'r')
sourceInLine=f.readlines()
dataset=[]
for line in sourceInLine:
temp1=line.strip('\n')
temp2=temp1.split(',')
dataset.append(temp2)
for i in range(0,len(dataset)):
for j in range(k+1):
dataset[i].append(float(dataset[i][j]))
del(dataset[i][0:k+1])
return dataset
# =============================================================================
# #讀取訓練文件中的特徵值(讀取的txt文件內容,轉換爲float格式的數字之後,發現每行數據首端增加‘ ’空格元素)
# def loadData(infile,k):
#
# f=open(infile,'r')
# sourceInLine=f.readlines()
# dataset=[]
# for line in sourceInLine:
# temp1=line.strip('\n')
# temp2=temp1.split(',')
# dataset.append(temp2)
# print(dataset[0][0])
# temp3=dataset[0][0].split(' ')
# print(temp3)
# for i in range(0,len(dataset)):
# for j in range(k):
# dataset[i].append(float(dataset[i][j]))
# del(dataset[i][0:k])
# return dataset
# =============================================================================
k=34
#定義待測試的特徵數據的路徑
filename = '6.txt'
#filename = '156n_34.txt'
#讀取測試文件中的數據
data_x=loadData(filename,k)
#剔除讀取的數據中每行多出的空格' '
for i in range(0,len(data_x)):
data_x[i].pop(0)
print(data_x[0])
#for i in range(0,len(data_x)):
for i in range(0,len(data_x)):
for j in range(0,len(data_x[i])):
a=(data_x[i][j]+1)/2.0
data_x[i][j]=a
print(data_x[0])
#轉換數據的格式
data_x=np.array(data_x)
#初始化變量
init = tf.global_variables_initializer()
#執行會話,測試
with tf.Session() as sess:
sess.run(init)
# =============================================================================
# #應用單分類CNN模型測試
# new_saver=tf.train.import_meta_graph('one_class_cnn_Model/Model-10.meta')
# new_saver.restore(sess,'one_class_cnn_Model/Model-10')
#
# graph=tf.get_default_graph()
# pred=tf.get_collection('predic')[0]
# input_x=graph.get_operation_by_name('data_x').outputs[0]
#
#
# pred_y=sess.run(pred,feed_dict={input_x:data_x})
# print(pred_y)
# =============================================================================
#應用於自編碼檢測
new_saver=tf.train.import_meta_graph('encodeModel/enModel.meta')
new_saver.restore(sess,'encodeModel/enModel')
graph=tf.get_default_graph()
pred=tf.get_collection('predi')[0]
cost=tf.get_collection('cost_loss')[0]
input_X=graph.get_operation_by_name('en34_x').outputs[0]
pred_y=sess.run(pred,feed_dict={input_X:data_x})
# =============================================================================
# loss=sess.run(cost,feed_dict={input_X:data_x})
# print(loss)
# =============================================================================
#cost=tf.reduce_mean(-tf.log(1-tf.minimum(0.999999,tf.abs(X-y_pred))))
print(123)
print(data_x)
print(pred_y)
print pred_y.shape, data_x.shape
#loss=tf.reduce_mean(tf.pow(data_x - pred_y, 2))
#loss=tf.reduce_mean(-tf.log(1-tf.minimum(0.999999,tf.cast(tf.abs(data_x - pred_y),tf.float32))))
loss=tf.reduce_mean(-tf.log(1-tf.abs(data_x-pred_y)))
#loss=tf.abs(data_x-pred_y)
loss_s=[]
for i in range(0,len(data_x)):
#a=tf.reduce_mean(tf.pow(data_x[i]-pred_y[i],2)) #tf.cast(correct_pred, tf.float32)
#a=tf.reduce_mean(-tf.log(1-tf.minimum(0.999999,tf.cast(tf.abs(data_x[i] - pred_y[i]),tf.float32))))
a=tf.reduce_mean(-tf.log(1-tf.abs(data_x[i]-pred_y[i])))
loss_s.append(a)
# print('loss_s')
# c_loss_s=sess.run(loss_s)
# print(c_loss_s)
print('loss')
c_loss=sess.run(loss)
print(c_loss)
錯誤的方式
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Int16
from audio_common_msgs.msg import AudioData
from audio_common_msgs.msg import AudioFeature
import numpy as np
import os
import sys
import time
import tensorflow as tf
tf_sess = tf.Session()
init = tf.global_variables_initializer()
tf_sess.run(init)
new_saver=tf.train.import_meta_graph('/home/sl/work/project/SoundRecog/audio_ws/src/audio_recognize/encodeModel/enModel.meta')
new_saver.restore(tf_sess,'/home/sl/work/project/SoundRecog/audio_ws/src/audio_recognize/encodeModel/enModel')
graph=tf.get_default_graph()
pred=tf.get_collection('predi')[0]
cost=tf.get_collection('cost_loss')[0]
input_X=graph.get_operation_by_name('en34_x').outputs[0]
def on_audio(feature):
#graph=tf.get_default_graph()
data_x = np.array(feature.data)
data_x = data_x.reshape((1,34))
pred_y=tf_sess.run(pred,feed_dict={input_X:data_x})
#print(pred_y[0])
#data_x = data_x.reshape(1,34)
#print(data_x[0])
print "123 "
print pred_y.shape, data_x.shape
#loss=tf.reduce_mean(tf.pow(data_x - pred_y, 2))
#loss=tf.reduce_mean(-tf.log(1-tf.minimum(0.999999,tf.cast(tf.abs(data_x - pred_y),tf.float32))))
#loss=tf.abs(data_x-pred_y)
loss=tf.reduce_mean(-tf.log(1-tf.abs(data_x-pred_y)))
c_loss=tf_sess.run(loss)#這裏會報錯
print(c_loss)
# loss_s=[]
# for i in range(0,len(data_x)):
#a=tf.reduce_mean(tf.pow(data_x[i]-pred_y[i],2)) #tf.cast(correct_pred, tf.float32)
#a=tf.reduce_mean(-tf.log(1-tf.minimum(0.999999,tf.cast(tf.abs(data_x[i] - pred_y[i]),tf.float32))))
# a=tf.reduce_mean(-tf.log(1-tf.abs(data_x[i]-pred_y[i])))
# loss_s.append(a)
# print('loss_s')
# c_loss_s=sess.run(loss_s)
# print(c_loss_s)
print('loss')
if __name__ == '__main__':
rospy.init_node("ros_sound_recognize")
rospy.loginfo("start ros_sound_recognize info");
_sub = rospy.Subscriber("audio/audio_feature", AudioFeature, on_audio, queue_size=2, buff_size=2**24)
rospy.spin()
# tensor = RosSoundRecognizer()
# tensor.main()
tf_sess.close()
錯誤應該是說,運行的graph不在這個session裏,圖是運行在session裏的,這裏不知道爲什麼會報這個錯誤,改成:
data_x = np.array(feature.data)
data_x = data_x.reshape((1, 34))
pred_y=self._tf_sess.run(self._pred,feed_dict={self._input_X:data_x})
#print data_x
#print pred_y
print pred_y.shape, data_x.shape
with tf.Session(graph=self._graph) as sess:
sess.run(tf.global_variables_initializer())
loss = tf.reduce_mean(-tf.log(1 - tf.abs(data_x - pred_y)))
real_loss = sess.run(loss)
print("c_loss is")
print(real_loss)
self._pub.publish(real_loss)
新建一個session,然後在這個session中計算就不報錯了.
有哪位知道錯誤在哪裏請留言賜教.