keras, использующий тензорный поток в качестве бэкэнда: не может интерпретировать ключ feed_dict как тензор: не может преобразовать int в тензор

Я пытаюсь использовать тензорную доску в керасе. Вот мой код:

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)

НО ошибка бывает следующим образом:

Файл "/home/jasontian/enter/lib/python3.5/site-packages/spyder/utils/site/sitecustomize.py", строка 866, в исполняемом файле execfile (имя файла, пространство имен)

Файл "/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, в 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 ])

Файл "/home/jasontian/enter/lib/python3.5/site-packages/keras/engine/training.py", строка 1196, соответствует initial_epoch = initial_epoch) File "/ 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 (эпоха, журналы)

Файл "/home/jasontian/enter/lib/python3.5/site-packages/keras/callbacks.py", строка 653, в on_epoch_end result = 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]) TypeError: Не удается интерпретировать ключ feed_dict как Тензор: не может преобразовать int в тензор.

Сначала я подумал, что это может быть y_train.dtype (это float64), но я обнаружил, что это хорошо работает на примере. обновление: форма X_train (39209,32,32,1). Итак, как я могу это решить?


person JasonTian    schedule 27.02.2017    source источник
comment
Не могли бы вы распечатать форму X?   -  person Marcin Możejko    schedule 27.02.2017
comment
да , форма X_train (39209,32,32,1)   -  person JasonTian    schedule 27.02.2017


Ответы (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, вам не нужно указывать его.

person Nassim Ben    schedule 27.02.2017
comment
Работает без сеанса! Но каждый раз после того, как это сработает, мне нужно перезапускать ядро ​​(я использую Spyder), иначе это было бы неправильно. Сначала , в моем коде нет сеанса, он не работает, думаю, если я перезапущу ядро ​​в это время, все будет хорошо. - person JasonTian; 28.02.2017
comment
Ой, извините, никогда не использовал Spyder, я не мог вам с этим помочь. - person Nassim Ben; 28.02.2017