【发布时间】: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