【问题标题】:keras using tensorflow as backend :Cannot interpret feed_dict key as Tensor: Can not convert a int into a Tensorkeras 使用 tensorflow 作为后端:无法将 feed_dict 键解释为张量:无法将 int 转换为张量
【发布时间】:2017-07-17 21:18:20
【问题描述】:

我正在尝试在 keras 中使用 tensorboard。以下是我的代码:

from keras.layers import merge, Dropout, Convolution2D, MaxPooling2D, Input, Dense, Flatten, Merge
from keras.models import Model
from keras.callbacks import EarlyStopping, ReduceLROnPlateau,TensorBoard
import pickle
from sklearn.utils import shuffle
import numpy as np
import random
from keras.optimizers import Adam
import tensorflow as tf
import keras.backend.tensorflow_backend as KTF


np.random.seed(1000) 

def load_pickled_data(file, columns):
    with open(file, mode='rb') as f:
        dataset = pickle.load(f)
    return tuple(map(lambda c: dataset[c], columns))

train_preprocessed_dataset_file = "train.p"
test_preprocessed_dataset_file = "test.p"

X_train, y_train_64 = load_pickled_data(train_preprocessed_dataset_file, columns = ['features', 'labels'])
X_test, y_test_64 = load_pickled_data(test_preprocessed_dataset_file, columns = ['features', 'labels'])

y_train = y_train_64.astype(np.float32)
y_test = y_test_64.astype(np.float32)

old_session = KTF.get_session()

with tf.Graph().as_default():
    session = tf.Session('')
    KTF.set_session(session)
    KTF.set_learning_phase(1)
    ###CNN model###
    input_img = Input(shape=(32, 32, 1))

    conv_1 = Convolution2D(32, 5, 5, border_mode='same',     activation='relu')(input_img)
    pool_1 = MaxPooling2D((2, 2))(conv_1)
    pool_1 = Dropout(0.1)(pool_1)

    conv_2 = Convolution2D(64, 5, 5, border_mode='same', activation='relu')(pool_1)
    pool_2 = MaxPooling2D((2, 2))(conv_2)
    pool_2 = Dropout(0.2)(pool_2)

    conv_3 = Convolution2D(128, 5, 5, border_mode='same', activation='relu')(pool_2)
    pool_3 = MaxPooling2D((2, 2))(conv_3)
    pool_3 = Dropout(0.3)(pool_3)
    pool_3 = Flatten()(pool_3)

    pool_1 = MaxPooling2D((4, 4))(pool_1)
    pool_1 = Flatten()(pool_1)

    pool_2 = MaxPooling2D((2, 2))(pool_2)
    pool_2 =Flatten()(pool_2)

    all_features =  merge([pool_1, pool_2, pool_3], mode='concat')

    logits = Dense(500,activation='relu')(all_features)
    logits = Dropout(0.5)(logits)
    res = Dense(43,activation='softmax')(logits)

    c_model = Model(input_img, res)
    c_model.summary()

    adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
    c_model.compile(loss='categorical_crossentropy', optimizer= adam, metrics=['accuracy'])
    tensor_board = TensorBoard(log_dir='./logs', histogram_freq=1)

    history = c_model.fit(X_train, y_train, batch_size=128,nb_epoch=3,shuffle=True,verbose=1,validation_split=0.25,callbacks=[tensor_board])

    loss_and_metrics = c_model.evaluate(X_test, y_test, batch_size=128)

KTF.set_session(old_session)

BUT 错误发生如下:

文件 “/home/jasontian/enter/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py”, 第 866 行,在运行文件 execfile(filename, namespace) 中

文件 “/home/jasontian/enter/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py”, 第 102 行,在 execfile 中 exec(compile(f.read(), filename, 'exec'), 命名空间)

文件“/media/jasontian/keras_tf.py”,第 111 行,历史记录 = c_model.fit(X_train, y_train, batch_size=128,nb_epoch=3,shuffle=True,verbose=1,validation_split=0.25,callbacks=[tensor_board])

文件 “/home/jasontian/enter/lib/python3.5/site-packages/keras/engine/training.py”, 第 1196 行,适合 initial_epoch=initial_epoch) 文件 “/home/jasontian/enter/lib/python3.5/site-packages/keras/engine/training.py”, 第 911 行,在 _fit_loop callbacks.on_epoch_end(epoch, epoch_logs)

文件 "/home/jasontian/enter/lib/python3.5/site-packages/keras/callbacks.py", 第 76 行,在 on_epoch_end callback.on_epoch_end(epoch, logs)

文件 "/home/jasontian/enter/lib/python3.5/site-packages/keras/callbacks.py", 第 653 行,在 on_epoch_end 结果 = self.sess.run([self.merged], feed_dict=feed_dict)

文件 "/home/jasontian/enter/lib/python3.5/site-packages/tensorflow/python/client/session.py", 第 766 行,在运行 run_metadata_ptr)

文件 "/home/jasontian/enter/lib/python3.5/site-packages/tensorflow/python/client/session.py", 第 921 行,在 _run + e.args[0]) 类型错误:无法将 feed_dict 键解释为张量:无法将 int 转换为张量。

起初我以为它可能是y_train.dtype(它是float64),但我发现它在一个示例中效果很好。 更新:X_train 的形状为 (39209,32,32,1)。 那么我该如何解决呢?

【问题讨论】:

  • 你能打印出 X 的形状吗?
  • 是的,X_train的形状是(39209,32,32,1)

标签: tensorflow deep-learning keras tensorboard


【解决方案1】:

没有 tf 会话就不能工作吗?如果你真的不需要会话,你可以试试这个:

from keras.layers import merge, Dropout, Convolution2D, MaxPooling2D, Input, Dense, Flatten, Merge
from keras.models import Model
from keras.callbacks import EarlyStopping, ReduceLROnPlateau,TensorBoard
import pickle
from sklearn.utils import shuffle
import numpy as np
import random
from keras.optimizers import Adam

np.random.seed(1000) 

def load_pickled_data(file, columns):
    with open(file, mode='rb') as f:
        dataset = pickle.load(f)
    return tuple(map(lambda c: dataset[c], columns))

train_preprocessed_dataset_file = "train.p"
test_preprocessed_dataset_file = "test.p"

X_train, y_train_64 = load_pickled_data(train_preprocessed_dataset_file, columns = ['features', 'labels'])
X_test, y_test_64 = load_pickled_data(test_preprocessed_dataset_file, columns = ['features', 'labels'])

y_train = y_train_64.astype(np.float32)
y_test = y_test_64.astype(np.float32)


###CNN model###
input_img = Input(shape=(32, 32, 1))

conv_1 = Convolution2D(32, 5, 5, border_mode='same',     activation='relu')(input_img)
pool_1 = MaxPooling2D((2, 2))(conv_1)
pool_1 = Dropout(0.1)(pool_1)

conv_2 = Convolution2D(64, 5, 5, border_mode='same', activation='relu')(pool_1)
pool_2 = MaxPooling2D((2, 2))(conv_2)
pool_2 = Dropout(0.2)(pool_2)

conv_3 = Convolution2D(128, 5, 5, border_mode='same', activation='relu')(pool_2)
pool_3 = MaxPooling2D((2, 2))(conv_3)
pool_3 = Dropout(0.3)(pool_3)
pool_3 = Flatten()(pool_3)

pool_1 = MaxPooling2D((4, 4))(pool_1)
pool_1 = Flatten()(pool_1)

pool_2 = MaxPooling2D((2, 2))(pool_2)
pool_2 =Flatten()(pool_2)

all_features =  merge([pool_1, pool_2, pool_3], mode='concat')

logits = Dense(500,activation='relu')(all_features)
logits = Dropout(0.5)(logits)
res = Dense(43,activation='softmax')(logits)

c_model = Model(input_img, res)
c_model.summary()

adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
c_model.compile(loss='categorical_crossentropy', optimizer= adam, metrics=['accuracy'])
tensor_board = TensorBoard(log_dir='./logs', histogram_freq=1)

history = c_model.fit(X_train, y_train, batch_size=128,nb_epoch=3,shuffle=True,verbose=1,validation_split=0.25,callbacks=[tensor_board])

loss_and_metrics = c_model.evaluate(X_test, y_test, batch_size=128)

如果你的 keras 默认后端是 Tensorflow,你不必指定它。

【讨论】:

  • 无需会话即可工作!但是每次运行后,我都需要重新启动内核(我使用的是 Spyder),否则会出错。一开始,我的代码中没有session,它不起作用,我想如果我当时重新启动内核就可以了。
  • 抱歉,没用过 Spyder,我帮不了你。
猜你喜欢
  • 2017-08-06
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多