batch_size должен делиться на ошибку стратегии.num_towers (17 против 8) при использовании Google Colab TPU в перекрестной проверке keras k-fold - PullRequest
0 голосов
/ 11 октября 2018

Я хочу запустить свой код Keras на TPU для классификации текста.когда моя модель хочет оценить Val_acc, эта ошибка отображается:

batch_size must be divisible by strategy.num_towers (17 vs 8)

это мой код:

from __future__ import unicode_literals
import pandas as pd
import openpyxl 
from hazm import *
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from tensorflow.keras import layers,models

from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence
from keras import optimizers
from keras.callbacks import *
from keras.utils import to_categorical
from keras.callbacks import EarlyStopping
from sklearn.model_selection import StratifiedKFold
%matplotlib inline

мои данные:

X: texts
Y: labels

k-сложить:

kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)

шаг обучения:

epochs = 10
batch_size = 64
scores=[]
for train, test in kfold.split(X, Y):
     model = RNN2()

     tpu_model = tf.contrib.tpu.keras_to_tpu_model(
                 model,
                 strategy=tf.contrib.tpu.TPUDistributionStrategy(
                tf.contrib.cluster_resolver.TPUClusterResolver(tpu='grpc://' 
                + os.environ['COLAB_TPU_ADDR'])
                   )
                 )
     tpu_model.compile(
                optimizer='adam',
                loss='binary_crossentropy',
                metrics=['accuracy']
               )

     tpu_model.fit(X_sequences_matrix[train],Y[train],
                   batch_size=batch_size,
                   epochs=epochs,validation_split=0.15)

эти модели входят в шаг обучения:

Epoch 1/10
INFO:tensorflow:New input shapes; (re-)compiling: mode=train, [TensorSpec(shape=(4, 920), dtype=tf.float32, name='input_110'), TensorSpec(shape=(4, 1), dtype=tf.float32, name='activation_34_target0')]
INFO:tensorflow:Overriding default placeholder.
INFO:tensorflow:Remapping placeholder for input
INFO:tensorflow:Cloning Adam {'lr': 0.0010000000474974513, 'beta_1': 0.8999999761581421, 'beta_2': 0.9990000128746033, 'decay': 0.0, 'epsilon': 1e-07, 'amsgrad': False}
INFO:tensorflow:Get updates: Tensor("loss_3/mul:0", shape=(), dtype=float32)
INFO:tensorflow:Started compiling
INFO:tensorflow:Finished compiling. Time elapsed: 11.963297128677368 secs
INFO:tensorflow:Setting weights on TPU model.
3648/3697 [============================>.] - ETA: 1s - loss: 0.3725 - acc: 0.8728 
AssertionError: batch_size must be divisible by strategy.num_towers (17 vs 8)

1 Ответ

0 голосов
/ 11 октября 2018

Проблема в том, что у вас 8 ядер TPU и batch_size 17. Как показано здесь ваш batch_size должен делиться на количество ядер TPU.

...